void bfree(void *p, unsigned n) { unsigned align, s, r; if (n < sizeof(Header)) { /* can't free less than this */ wtbfree(p, n); return; } align = ALIGN(p); if (align) { /* adjust alignment */ wtbfree(p, align); /* put at the beginning in the wtbfree list */ p = (char *)p + align; n -= align; } s = n / sizeof(Header); r = n % sizeof(Header); /* put at the trailing end of the wtbfree list */ if (r) { wtbfree((char *)p + n + r, r); } /* if there is something left to be free */ if (s) { if (freep == NULL) { /* Setup a free list if it is empty */ base.s.ptr = freep = &base; base.s.size = 0; } ((Header *)p)->s.size = s; free((Header *)p + 1); } }
void bfree(void *p, unsigned n) { unsigned align, s, r; if(n < sizeof(Header)) { /* can't free less than this */ wtbfree(p, n); /* put in WTBfree list */ return; } align = ALIGN(p); if(align) { /* adjust alignment */ wtbfree(p, align); /* put beginning in WTBfree list */ p = (char *)p + align, n -= align; } s = n / sizeof(Header), r = n % sizeof(Header); if(r) /* put trailing end in WTBfree list */ wtbfree((char *)p+n-r, r); if(s) { /* if there is something left to free */ if (freep == NULL) { /* Set up free list if it's empty */ base.s.ptr = freep = &base; base.s.size = 0; } ((Header *)p)->s.size = s; free((Header *)p + 1); } }