diff --git a/src/block_alloc.h b/src/block_alloc.h new file mode 100644 index 0000000000000000000000000000000000000000..f2b41ead34b6602f7e48e6c9a0412e825111e04d --- /dev/null +++ b/src/block_alloc.h @@ -0,0 +1,60 @@ +#define INIT_BLOCK(X) +#define EXIT_BLOCK(X) +#define BLOCK_ALLOC(DATA,BSIZE) \ + \ +struct PIKE_CONCAT(DATA,_block) \ +{ \ + struct PIKE_CONCAT(DATA,_block) *next; \ + struct DATA x[BSIZE]; \ +}; \ + \ +static struct PIKE_CONCAT(DATA,_block) *PIKE_CONCAT(DATA,_blocks)=0; \ +static struct DATA *PIKE_CONCAT3(free_,DATA,s)=0; \ + \ +struct DATA *PIKE_CONCAT(alloc_,DATA)(void) \ +{ \ + struct DATA *tmp; \ + if(!PIKE_CONCAT3(free_,DATA,s)) \ + { \ + struct PIKE_CONCAT(DATA,_block) *n; \ + int e; \ + n=(struct PIKE_CONCAT(DATA,_block) *)malloc(sizeof(struct PIKE_CONCAT(DATA,_block))); \ + if(!n) \ + { \ + fprintf(stderr,"Fatal: out of memory.\n"); \ + exit(17); \ + } \ + n->next=PIKE_CONCAT(DATA,_blocks); \ + PIKE_CONCAT(DATA,_blocks)=n; \ + \ + for(e=0;e<BSIZE;e++) \ + { \ + n->x[e].next=PIKE_CONCAT3(free_,DATA,s); \ + PIKE_CONCAT3(free_,DATA,s)=n->x+e; \ + } \ + } \ + \ + tmp=PIKE_CONCAT3(free_,DATA,s); \ + PIKE_CONCAT3(free_,DATA,s)=tmp->next; \ + INIT_BLOCK(tmp); \ + return tmp; \ +} \ + \ +inline void PIKE_CONCAT(free_,DATA)(struct DATA *d) \ +{ \ + EXIT_BLOCK(d); \ + d->next=PIKE_CONCAT3(free_,DATA,s); \ + PIKE_CONCAT3(free_,DATA,s)=d; \ +} \ + \ +void PIKE_CONCAT3(free_all_,DATA,_blocks)(void) \ +{ \ + struct PIKE_CONCAT(DATA,_block) *tmp; \ + while((tmp=PIKE_CONCAT(DATA,_blocks))) \ + { \ + PIKE_CONCAT(DATA,_blocks)=tmp->next; \ + free((char *)tmp); \ + } \ + PIKE_CONCAT(DATA,_blocks)=0; \ +} \ +