From 6e442c70cbeb658dc0dd446c72c5e817dfe16b9b Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 31 Mar 2007 23:06:09 +0000 Subject: [PATCH] Reversed locking order of sImageLoadMutex and sImageMutex in unload_kernel_add_on(). The former one could lead to deadlocks with load_kernel_add_on() (e.g. occasionally the boot process would hang). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20485 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/elf.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/system/kernel/elf.cpp b/src/system/kernel/elf.cpp index 2b7fa61678..bc3d879512 100644 --- a/src/system/kernel/elf.cpp +++ b/src/system/kernel/elf.cpp @@ -54,8 +54,9 @@ typedef struct elf_linked_image { static hash_table *sImagesHash; static struct elf_image_info *sKernelImage = NULL; -static mutex sImageMutex; -static mutex sImageLoadMutex; +static mutex sImageMutex; // guards sImagesHash +static mutex sImageLoadMutex; // serializes loading/unloading add-ons + // locking order sImageLoadMutex -> sImageMutex static bool sInitialized = false; @@ -1449,19 +1450,18 @@ unload_kernel_add_on(image_id id) struct elf_image_info *image; status_t status; + mutex_lock(&sImageLoadMutex); mutex_lock(&sImageMutex); image = find_image(id); - if (image != NULL) { - mutex_lock(&sImageLoadMutex); - + if (image != NULL) status = unload_elf_image(image); - - mutex_unlock(&sImageLoadMutex); - } else + else status = B_BAD_IMAGE_ID; mutex_unlock(&sImageMutex); + mutex_unlock(&sImageLoadMutex); + return status; }