-
- /* Attempt to coalesce with successor if not the last block */
- q = p + p->blocks;
- if (q != first + BLOCKS_PER_MBLOCK) {
- /* Successor is free */
- if (q->flags & BF_FREE) {
- if (result) {
- /* p is on free_list, q is on free_list, unlink
- * q completely and patch up list
- */
- if (q->u.back) {
- q->u.back->link = q->link;
- }
- if (q->link) {
- q->link->u.back = q->u.back;
- }
- if (free_list == q) {
- free_list = q->link;
- }
- } else {
- /* p is not on free_list just assume q's links */
- p->u.back = q->u.back;
- if (p->u.back) {
- p->u.back->link = p;
- }
- p->link = q->link;
- if (p->link) {
- p->link->u.back = p;
- }
- if (q == free_list) {
- free_list = p;
- free_list->u.back = NULL;
- }
- }
-
- p->blocks += q->blocks;
- initGroupTail( q->blocks, p, q );
- result = p;
- }
- }
-
- return result;