+
+ /* 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;