Index: sys/arch/amiga/amiga/cc.c =================================================================== RCS file: /cvsroot/src/sys/arch/amiga/amiga/cc.c,v retrieving revision 1.24 diff -u -r1.24 cc.c --- sys/arch/amiga/amiga/cc.c 27 Nov 2013 17:24:43 -0000 1.24 +++ sys/arch/amiga/amiga/cc.c 31 Dec 2013 12:59:21 -0000 @@ -513,7 +513,7 @@ * for a new node in between. */ TAILQ_REMOVE(&free_list, mn, free_link); - TAILQ_NEXT(mn, free_link) = NULL; + mn->type = MNODE_USED; size = mn->size; /* increase size. (or same) */ chip_total -= mn->size; splx(s); @@ -533,7 +533,7 @@ * and mark as not on free list */ TAILQ_INSERT_AFTER(&chip_list, new, mn, link); - TAILQ_NEXT(mn, free_link) = NULL; + mn->type = MNODE_USED; chip_total -= size + sizeof(struct mem_node); splx(s); @@ -557,52 +557,53 @@ /* * check ahead of us. */ - if (TAILQ_NEXT(next, link) != NULL && - TAILQ_NEXT(next, free_link) != NULL) { + if (next->type == MNODE_FREE) { /* * if next is: a valid node and a free node. ==> merge */ TAILQ_INSERT_BEFORE(next, mn, free_link); + mn->type = MNODE_FREE; TAILQ_REMOVE(&chip_list, next, link); - TAILQ_REMOVE(&chip_list, next, free_link); + TAILQ_REMOVE(&free_list, next, free_link); chip_total += mn->size + sizeof(struct mem_node); mn->size += next->size + sizeof(struct mem_node); } - if (TAILQ_PREV(prev, chiplist, link) != NULL && - TAILQ_PREV(prev, freelist, free_link) != NULL) { + if (prev->type == MNODE_FREE) { /* * if prev is: a valid node and a free node. ==> merge */ - if (TAILQ_NEXT(mn, free_link) == NULL) + if (mn->type != MNODE_FREE) chip_total += mn->size + sizeof(struct mem_node); else { /* already on free list */ TAILQ_REMOVE(&free_list, mn, free_link); + mn->type = MNODE_USED; chip_total += sizeof(struct mem_node); } TAILQ_REMOVE(&chip_list, mn, link); prev->size += mn->size + sizeof(struct mem_node); - } else if (TAILQ_NEXT(mn, free_link) == NULL) { + } else if (mn->type != MNODE_FREE) { /* * we still are not on free list and we need to be. * <-- | --> */ - while (TAILQ_NEXT(next, link) != NULL && - TAILQ_PREV(prev, chiplist, link) != NULL) { - if (TAILQ_NEXT(next, free_link) != NULL) { + while (next != NULL && prev != NULL) { + if (next->type == MNODE_FREE) { TAILQ_INSERT_BEFORE(next, mn, free_link); + mn->type = MNODE_FREE; break; } - if (TAILQ_NEXT(prev, free_link) != NULL) { + if (prev->type == MNODE_FREE) { TAILQ_INSERT_AFTER(&free_list, prev, mn, free_link); + mn->type = MNODE_FREE; break; } prev = TAILQ_PREV(prev, chiplist, link); next = TAILQ_NEXT(next, link); } - if (TAILQ_NEXT(mn, free_link) == NULL) { - if (TAILQ_NEXT(next, link) == NULL) { + if (mn->type != MNODE_FREE) { + if (next == NULL) { /* * we are not on list so we can add * ourselves to the tail. (we walked to it.) @@ -611,6 +612,7 @@ } else { TAILQ_INSERT_HEAD(&free_list,mn,free_link); } + mn->type = MNODE_FREE; } chip_total += mn->size; /* add our helpings to the pool. */ } Index: sys/arch/amiga/amiga/cc.h =================================================================== RCS file: /cvsroot/src/sys/arch/amiga/amiga/cc.h,v retrieving revision 1.17 diff -u -r1.17 cc.h --- sys/arch/amiga/amiga/cc.h 23 Nov 2013 22:48:00 -0000 1.17 +++ sys/arch/amiga/amiga/cc.h 31 Dec 2013 12:59:21 -0000 @@ -160,7 +160,10 @@ TAILQ_ENTRY(mem_node) link; TAILQ_ENTRY(mem_node) free_link; u_long size; /* size of memory following node. */ + u_char type; /* free, used */ }; +#define MNODE_FREE 0 +#define MNODE_USED 1 #define CM_BLOCKSIZE 0x4 #define CM_BLOCKMASK (~(CM_BLOCKSIZE - 1))