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))