// C Source File // Created 03/15/2008 06:32:43 PM /* * By Lardmaster, * Anyone feel free to use it for any purposes. * * Uses unsigned shorts as pointers for the linked list of free block, to save memory. Thus the max number of blocks is 65,534 * Simple fixed block sized memory allocator with free and allocate. * */ #include "lardalloc.h" /* * converts the within buffer(LARD_PTR) pointer to a system wide pointer */ void * conv_to_ptr(const lardbuffer *b, LARD_PTR ptr) { return (char *)b+HEADER_SIZE+ptr*b->size; } /* * converts a systemwide pointer to somewhere inside the buffer into an LARD_PTR which points locally */ LARD_PTR conv_to_short(const lardbuffer *b, const void * ptr) { return ((char *)ptr-(char *)b-HEADER_SIZE)/b->size; } /* * allocates the buffer with a system malloc call */ lardbuffer * initialize_buffer(unsigned int size, unsigned int maxelements) { int mallocsize=HEADER_SIZE+size*MIN(maxelements,sizeof(unsigned char)); lardbuffer * b= (lardbuffer*)(malloc(mallocsize)); b->size=size; b->first_free=0; for (LARD_PTR i=0; isize */ void * allocate(lardbuffer *b) { if (b->first_free==USHRT_MAX) { return NULL; } void * ptr=conv_to_ptr(b,b->first_free); b->first_free=*(LARD_PTR *)ptr; return ptr; } /* * a simple inline method to dereference the LARD_PTR pointers quickly. */ LARD_PTR deref(lardbuffer *b, LARD_PTR ptr) { return *((LARD_PTR *)conv_to_ptr(b,ptr)); } /* * frees the memory block pointer to by ptr, which must be in larbuffer b */ void lardfree(lardbuffer *b, void * ptr) { LARD_PTR old_first=b->first_free; b->first_free=conv_to_short(b,ptr); *(LARD_PTR *) ptr=old_first; }