summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKevin Yonan <[email protected]>2019-07-28 12:37:31 -0700
committerRay <[email protected]>2019-07-28 21:37:31 +0200
commit5775f9d224ced3e9d688c7223ab9a1de54a440eb (patch)
treeb3f5e6bfc6be639b55b9c9c15f93828287dba3b2
parent38ee6156f85ec7fbda2f9ad920bb0a8c7cdd22c5 (diff)
downloadraylib-5775f9d224ced3e9d688c7223ab9a1de54a440eb.tar.gz
raylib-5775f9d224ced3e9d688c7223ab9a1de54a440eb.zip
Patched potential bug when defragging. (#920)
* Patched potential bug when defragging. Patched a potential bug concerning the '__RemoveNode' function as, when removing certain nodes that are either at the head or tail, it can yield a free list node of size 0 bug as the previous node was removed and its size was set to 0 but not fully removed from the other nodes. * A few more potential bug patches.
-rw-r--r--src/rmem.h21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/rmem.h b/src/rmem.h
index 65e08194..439b3039 100644
--- a/src/rmem.h
+++ b/src/rmem.h
@@ -164,10 +164,19 @@ static inline size_t __AlignSize(const size_t size, const size_t align)
return (size + (align - 1)) & -align;
}
-static void __RemoveNode(MemNode **const node)
+static void __RemoveNode(MemPool *const mempool, MemNode **const node)
{
- ((*node)->prev != NULL)? ((*node)->prev->next = (*node)->next) : (*node = (*node)->next);
- ((*node)->next != NULL)? ((*node)->next->prev = (*node)->prev) : (*node = (*node)->prev);
+ if ((*node)->prev != NULL) (*node)->prev->next = (*node)->next;
+ else {
+ mempool->freeList.head = (*node)->next;
+ mempool->freeList.head->prev = NULL;
+ }
+
+ if ((*node)->next != NULL) (*node)->next->prev = (*node)->prev;
+ else {
+ mempool->freeList.tail = (*node)->prev;
+ mempool->freeList.tail->next = NULL;
+ }
}
//----------------------------------------------------------------------------------
@@ -242,7 +251,7 @@ void *MemPoolAlloc(MemPool *const mempool, const size_t size)
{
// Close in size - reduce fragmentation by not splitting.
new_mem = *inode;
- __RemoveNode(inode);
+ __RemoveNode(mempool, inode);
mempool->freeList.len--;
new_mem->next = new_mem->prev = NULL;
break;
@@ -427,7 +436,7 @@ bool MemPoolDefrag(MemPool *const mempool)
// If node is right at the stack, merge it back into the stack.
mempool->stack.base += (*node)->size;
(*node)->size = 0UL;
- __RemoveNode(node);
+ __RemoveNode(mempool, node);
mempool->freeList.len--;
node = &mempool->freeList.head;
}
@@ -475,6 +484,7 @@ bool MemPoolDefrag(MemPool *const mempool)
(*node)->size = 0UL;
(*node)->next->prev = (*node)->prev;
(*node)->prev->next = (*node)->next;
+ *node = (*node)->next;
mempool->freeList.len--;
node = &mempool->freeList.head;
@@ -487,6 +497,7 @@ bool MemPoolDefrag(MemPool *const mempool)
(*node)->size = 0UL;
(*node)->next->prev = (*node)->prev;
(*node)->prev->next = (*node)->next;
+ *node = (*node)->prev;
mempool->freeList.len--;
node = &mempool->freeList.head;