void *tmalloc(unsigned nbytes) { CHUNK *p; unsigned size; if (bot == NULL) init(); size = sizeof(CHUNK) * ((nbytes+sizeof(CHUNK)-1)/sizeof(CHUNK) + 1); for (p = bot; p != NULL; p = RIGHT(p)) if (GET_FREEBIT(p) && CHUNKSIZE(p) >= size) break; if (p == NULL) return NULL; if (CHUNKSIZE(p) > size) /* create a remainder chunk */ { CHUNK *q, *pr; CLR_FREEBIT(p); /* required for pointer manipulation */ q = (CHUNK *)((char *)p + CHUNKSIZE(p) - size); pr = p->s.r; q->s.l = p; q->s.r = pr; p->s.r = q; pr->s.l = q; SET_FREEBIT(p); p = q; /* return q, not the remainder */ } CLR_FREEBIT(p); //what's going on here? return FROMCHUNK(p); }
void *tmalloc(unsigned nbytes) { CHUNK *p; unsigned size; if (bot == NULL) init(); size = sizeof(CHUNK) * ((nbytes+sizeof(CHUNK)-1)/sizeof(CHUNK) + 1); for (p = bot; p != NULL; p = RIGHT(p)) if (GET_FREEBIT(p) && CHUNKSIZE(p) >= size) break; if (p == NULL) return NULL; CLR_FREEBIT(p); if (CHUNKSIZE(p) > size) /* create a remainder chunk */ { CHUNK *q, *pr; q = (CHUNK *)(size + (char *)p); pr = p->s.r; q->s.l = p; q->s.r = pr; p->s.r = q; pr->s.l = q; SET_FREEBIT(q); } return FROMCHUNK(p); }
void *trealloc(void *vp, unsigned newbytes) { void *newp = NULL; /* behavior on corner cases conforms to SUSv2 */ if (vp == NULL) return tmalloc(newbytes); if (newbytes != 0) { CHUNK *oldchunk; unsigned bytes; if ( (newp = tmalloc(newbytes)) == NULL) return NULL; oldchunk = TOCHUNK(vp); bytes = CHUNKSIZE(oldchunk) - sizeof(CHUNK); if (bytes > newbytes) bytes = newbytes; memcpy(newp, vp, bytes); } tfree(vp); return newp; }