About func in mempool.c

Zheng Yuan {ZYUAN1} zyuan1 at cig.mot.com
Tue Jan 16 18:57:40 CET 2001


in 

void * lp_alloc(linpool *m, unsigned size) {
  byte *a = (byte *) ALIGN((unsigned long) m->ptr, CPU_STRUCT_ALIGN);
  byte *e = a + size;
  if (e <= m->end)
    {
      m->ptr = e;
      return a;
    }
  else
    {
      struct lp_chunk *c;
      if (size >= m->threshold)
	{
	  /* Too large => allocate large chunk */
	  c = xmalloc(sizeof(struct lp_chunk) + size);
	  m->total_large += size;
	  c->next = m->first_large;
	  m->first_large = c->next;
	  c->size = size;
	}
      else
	{
	  if (m->current)
	    {
	      /* Still have free chunks from previous incarnation (before
lp_flush()) */
	      c = m->current;
	      m->current = c->next;
	    }
	  else
	    {
	      /* Need to allocate a new chunk */
	      c = xmalloc(sizeof(struct lp_chunk) + m->chunk_size);
	      m->total += m->chunk_size;
	      *m->plast = c;
	      m->plast = &c->next;
	      c->next = NULL;
	      c->size = m->chunk_size;
	    }
	  m->ptr = c->data + size;
	  m->end = c->data + m->chunk_size;
	}
      return c->data;
    }
}

for large allocation, if u add new allocated block in front of old
m->first_large do u have to set m->first_large = c instead of
m->first_large = c->next




More information about the Bird-users mailing list