URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [runtime/] [mfixalloc.c] - Rev 747
Compare with Previous | Blame | View Log
// 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.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 *(*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; f->inuse = 0; f->sys = 0; } void* runtime_FixAlloc_Alloc(FixAlloc *f) { void *v; if(f->list) { v = f->list; f->list = *(void**)f->list; f->inuse += f->size; return v; } if(f->nchunk < f->size) { f->sys += FixAllocChunk; f->chunk = f->alloc(FixAllocChunk); if(f->chunk == nil) runtime_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; 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; }