Annotation of embedaddon/trafshow/recycle.c, revision 1.1
1.1 ! misho 1: /*
! 2: --------------------------------------------------------------------
! 3: By Bob Jenkins, September 1996. recycle.c
! 4: You may use this code in any way you wish, and it is free. No warranty.
! 5:
! 6: This manages memory for commonly-allocated structures.
! 7: It allocates RESTART to REMAX items at a time.
! 8: Timings have shown that, if malloc is used for every new structure,
! 9: malloc will consume about 90% of the time in a program. This
! 10: module cuts down the number of mallocs by an order of magnitude.
! 11: This also decreases memory fragmentation, and freeing structures
! 12: only requires freeing the root.
! 13: --------------------------------------------------------------------
! 14: */
! 15:
! 16: #include <stdlib.h>
! 17: #include <string.h>
! 18:
! 19: #ifndef STANDARD
! 20: # include "standard.h"
! 21: #endif
! 22: #ifndef RECYCLE
! 23: # include "recycle.h"
! 24: #endif
! 25:
! 26: reroot *remkroot(size)
! 27: size_t size;
! 28: {
! 29: reroot *r = (reroot *)malloc(sizeof(reroot));
! 30: if (r) {
! 31: r->list = (recycle *)0;
! 32: r->trash = (recycle *)0;
! 33: r->size = align(size);
! 34: r->logsize = RESTART;
! 35: r->numleft = 0;
! 36: }
! 37: return r;
! 38: }
! 39:
! 40: void refree(r)
! 41: struct reroot *r;
! 42: {
! 43: recycle *temp = r->list;
! 44: if (temp) while (r->list)
! 45: {
! 46: temp = r->list->next;
! 47: free((char *)r->list);
! 48: r->list = temp;
! 49: }
! 50: free((char *)r);
! 51: return;
! 52: }
! 53:
! 54: /* to be called from the macro renew only */
! 55: char *renewx(r)
! 56: struct reroot *r;
! 57: {
! 58: recycle *temp;
! 59: if (r->trash)
! 60: { /* pull a node off the trash heap */
! 61: temp = r->trash;
! 62: r->trash = temp->next;
! 63: (void)memset((void *)temp, 0, r->size);
! 64: }
! 65: else
! 66: { /* allocate a new block of nodes */
! 67: r->numleft = r->size*((ub4)1<<r->logsize);
! 68: if (r->numleft < REMAX) ++r->logsize;
! 69: temp = (recycle *)malloc(sizeof(recycle) + r->numleft);
! 70: if (!temp) return 0;
! 71: temp->next = r->list;
! 72: r->list = temp;
! 73: r->numleft-=r->size;
! 74: temp = (recycle *)((char *)(r->list+1)+r->numleft);
! 75: }
! 76: return (char *)temp;
! 77: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>