示例#1
0
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);
    }
}
示例#2
0
文件: krx80800.c 项目: HenryNi/mycode
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);
    }
}