#include #include #include #include "xmem.h" typedef struct MEMORYBLOCK { struct MEMORYBLOCK *next; char memory[BLOCKSIZE]; } MemoryBlock; int MemoryPosition; MemoryBlock *EmptyBlock; MemoryBlock *WorkingBlock; MemoryBlock *FullBlock; int MemoryPosition = BLOCKSIZE; /* Start with no block */ void *xmalloc(int size) { void *new; if(MemoryPosition+size > BLOCKSIZE) { if(!EmptyBlock) { if(0==(EmptyBlock = (MemoryBlock *)malloc(sizeof(MemoryBlock)))) { fprintf(stderr,"Out of memory in xmalloc in profile.c\n"); exit(-1); } else { EmptyBlock->next = 0; } } WorkingBlock = EmptyBlock; EmptyBlock = EmptyBlock->next; MemoryPosition = 0; } new = &WorkingBlock->memory[MemoryPosition]; MemoryPosition += size; return new; } void xfree(void) { MemoryBlock *mb; if(0 != (mb = FullBlock)) { while(mb->next) mb = mb->next; mb->next = EmptyBlock; EmptyBlock = FullBlock; FullBlock = 0; } if(WorkingBlock) { WorkingBlock->next = EmptyBlock; EmptyBlock = WorkingBlock; WorkingBlock = 0; } MemoryPosition = BLOCKSIZE; }