root/src/pkg/runtime/mfixalloc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. runtime·FixAlloc_Init
  2. runtime·FixAlloc_Alloc
  3. runtime·FixAlloc_Free

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Fixed-size object allocator.  Returned memory is not zeroed.
//
// See malloc.h for overview.

#include "runtime.h"
#include "arch_GOARCH.h"
#include "malloc.h"

// Initialize f to allocate objects of the given size,
// using the allocator to obtain chunks of memory.
void
runtime·FixAlloc_Init(FixAlloc *f, uintptr size, void (*first)(void*, byte*), void *arg, uint64 *stat)
{
        f->size = size;
        f->first = first;
        f->arg = arg;
        f->list = nil;
        f->chunk = nil;
        f->nchunk = 0;
        f->inuse = 0;
        f->stat = stat;
}

void*
runtime·FixAlloc_Alloc(FixAlloc *f)
{
        void *v;
        
        if(f->size == 0) {
                runtime·printf("runtime: use of FixAlloc_Alloc before FixAlloc_Init\n");
                runtime·throw("runtime: internal error");
        }

        if(f->list) {
                v = f->list;
                f->list = *(void**)f->list;
                f->inuse += f->size;
                return v;
        }
        if(f->nchunk < f->size) {
                f->chunk = runtime·persistentalloc(FixAllocChunk, 0, f->stat);
                f->nchunk = FixAllocChunk;
        }
        v = f->chunk;
        if(f->first)
                f->first(f->arg, v);
        f->chunk += f->size;
        f->nchunk -= f->size;
        f->inuse += f->size;
        return v;
}

void
runtime·FixAlloc_Free(FixAlloc *f, void *p)
{
        f->inuse -= f->size;
        *(void**)p = f->list;
        f->list = p;
}


/* [<][>][^][v][top][bottom][index][help] */