Logo Search packages:      
Sourcecode: albert version File versions


By Bob Jenkins, September 1996.  recycle.c
You may use this code in any way you wish, and it is free.  No warranty.

This manages memory for commonly-allocated structures.
It allocates RESTART to REMAX items at a time.
Timings have shown that, if malloc is used for every new structure,
  malloc will consume about 90% of the time in a program.  This
  module cuts down the number of mallocs by an order of magnitude.
This also decreases memory fragmentation, and freeing structures
  only requires freeing the root.

#ifndef STANDARD
#include "standard.h"
#ifndef RECYCLE
#include "recycle.h"
#include <stdlib.h>
#include <string.h>

reroot *remkroot(size)
size_t  size;
   reroot *r = (reroot *)malloc(sizeof(reroot));
   r->list = (recycle *)0;
   r->trash = (recycle *)0;
   r->size = align(size);
   r->logsize = RESTART;
   r->numleft = 0;
   return r;

void  refree(r)
struct reroot *r;
   recycle *temp;
   if (temp = r->list) while (r->list)
      temp = r->list->next;
      free((char *)r->list);
      r->list = temp;
   free((char *)r);

/* to be called from the macro renew only */
char  *renewx(r)
struct reroot *r;
   recycle *temp;
   if (r->trash)
   {  /* pull a node off the trash heap */
      temp = r->trash;
      r->trash = temp->next;
      (void)memset((void *)temp, 0, r->size);
   {  /* allocate a new block of nodes */
      r->numleft = r->size*((ub4)1<<r->logsize);
      if (r->numleft < REMAX) ++r->logsize;
      temp = (recycle *)malloc(sizeof(recycle) + r->numleft);
      temp->next = r->list;
      r->list = temp;
      temp = (recycle *)((char *)(r->list+1)+r->numleft);
   return (char *)temp;

Generated by  Doxygen 1.6.0   Back to index