// 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 "malloc.h" // Initialize f to allocate objects of the given size, // using the allocator to obtain chunks of memory. void FixAlloc_Init(FixAlloc *f, uintptr size, void *(*alloc)(uintptr), void (*first)(void*, byte*), void *arg) { f->size = size; f->alloc = alloc; f->first = first; f->arg = arg; f->list = nil; f->chunk = nil; f->nchunk = 0; } void* FixAlloc_Alloc(FixAlloc *f) { void *v; if(f->list) { v = f->list; f->list = *(void**)f->list; return v; } if(f->nchunk < f->size) { f->chunk = f->alloc(FixAllocChunk); if(f->chunk == nil) throw("out of memory (FixAlloc)"); f->nchunk = FixAllocChunk; } v = f->chunk; if(f->first) f->first(f->arg, v); f->chunk += f->size; f->nchunk -= f->size; return v; } void FixAlloc_Free(FixAlloc *f, void *p) { *(void**)p = f->list; f->list = p; }