From fdad233b47853c1e8e07d520aa6b9f21e7bca44a Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Thu, 15 Apr 2010 11:13:16 +0000 Subject: [PATCH] Move the actual area deletion out of the locked section as we could otherwise double/deadlock when we delete heap areas because of other area deletions. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36284 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/heap.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/heap.cpp b/src/system/kernel/heap.cpp index c16bc5b7fd..3103c037c8 100644 --- a/src/system/kernel/heap.cpp +++ b/src/system/kernel/heap.cpp @@ -1711,18 +1711,27 @@ heap_free(heap_allocator *heap, void *address) WriteLocker areaWriteLocker(heap->area_lock); MutexLocker pageLocker(heap->page_lock); + area_id areasToDelete[heap->empty_areas - 1]; + int32 areasToDeleteIndex = 0; + area = heap->areas; while (area != NULL && heap->empty_areas > 1) { heap_area *next = area->next; if (area->area >= 0 && area->free_page_count == area->page_count && heap_remove_area(heap, area) == B_OK) { - delete_area(area->area); + areasToDelete[areasToDeleteIndex++] = area->area; heap->empty_areas--; } area = next; } + + pageLocker.Unlock(); + areaWriteLocker.Unlock(); + + for (int32 i = 0; i < areasToDeleteIndex; i++) + delete_area(areasToDelete[i]); } return B_OK;