From dc2b8faba2185d94a9520c44c95544fc30fef457 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 14 Jun 2011 12:48:06 +0000 Subject: [PATCH] exit_debugger(): Only try to release the semaphore when no one holds the scheduler lock. Otherwise we may deadlock. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42182 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/debugger/invalidate_on_exit/Jamfile | 4 ++-- .../invalidate_on_exit/invalidate_on_exit.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/debugger/invalidate_on_exit/Jamfile b/src/add-ons/kernel/debugger/invalidate_on_exit/Jamfile index f85c86dde6..ef5c955255 100644 --- a/src/add-ons/kernel/debugger/invalidate_on_exit/Jamfile +++ b/src/add-ons/kernel/debugger/invalidate_on_exit/Jamfile @@ -1,7 +1,7 @@ SubDir HAIKU_TOP src add-ons kernel debugger invalidate_on_exit ; -UsePrivateHeaders kernel ; +UsePrivateKernelHeaders ; KernelAddon invalidate_on_exit : invalidate_on_exit.cpp - ; +; diff --git a/src/add-ons/kernel/debugger/invalidate_on_exit/invalidate_on_exit.cpp b/src/add-ons/kernel/debugger/invalidate_on_exit/invalidate_on_exit.cpp index 189247c348..3ff72b3842 100644 --- a/src/add-ons/kernel/debugger/invalidate_on_exit/invalidate_on_exit.cpp +++ b/src/add-ons/kernel/debugger/invalidate_on_exit/invalidate_on_exit.cpp @@ -2,9 +2,15 @@ * Copyright 2008, Michael Lotz, mmlr@mlotz.ch * Distributed under the terms of the MIT License. */ + + #include + #include +#include +#include + static sem_id sRequestSem = -1; @@ -33,6 +39,12 @@ invalidate_loop(void *data) static void exit_debugger() { + // If someone holds the scheduler lock at this point, release_sem_etc() + // will block forever. So avoid that. + if (!try_acquire_spinlock(&gSchedulerLock)) + return; + release_spinlock(&gSchedulerLock); + release_sem_etc(sRequestSem, 1, B_DO_NOT_RESCHEDULE); }