From 51ecdb00aa92ca41400589de4f96148feb010412 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 9 Mar 2009 01:48:28 +0000 Subject: [PATCH] Replaced the recursive lock implementation by the kernel implementation (slightly adjusted). It is completely based on mutexes, not needing any other problematic features. Not sure why the previous implementation was doing it differently. This also adds the previously missing recursive_lock_trylock(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29462 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../add-ons/kernel/kernelland_emu/lock.cpp | 86 +++++++------------ 1 file changed, 32 insertions(+), 54 deletions(-) diff --git a/src/tests/add-ons/kernel/kernelland_emu/lock.cpp b/src/tests/add-ons/kernel/kernelland_emu/lock.cpp index 0d1a4c9741..048eaa0a57 100644 --- a/src/tests/add-ons/kernel/kernelland_emu/lock.cpp +++ b/src/tests/add-ons/kernel/kernelland_emu/lock.cpp @@ -16,46 +16,28 @@ int32 recursive_lock_get_recursion(recursive_lock *lock) { - thread_id thread = find_thread(NULL); - -#if !KDEBUG - if (lock->holder == thread) + if (RECURSIVE_LOCK_HOLDER(lock) == find_thread(NULL)) return lock->recursion; -#else - if (lock->lock.holder == thread) - return lock->recursion; -#endif return -1; } void -recursive_lock_init_etc(recursive_lock *lock, const char *name, uint32 flags) +recursive_lock_init(recursive_lock *lock, const char *name) { - if (lock == NULL) - return; - - if (name == NULL) - name = "recursive lock"; - -#if !KDEBUG - lock->holder = -1; -#else - lock->lock.holder = -1; -#endif + mutex_init(&lock->lock, name != NULL ? name : "recursive lock"); + RECURSIVE_LOCK_HOLDER(lock) = -1; lock->recursion = 0; - lock->lock.waiters = (mutex_waiter*)create_sem(1, name); - - if ((sem_id)lock->lock.waiters < B_OK) - panic("recursive lock creation failed: %s\n", name); } void -recursive_lock_init(recursive_lock *lock, const char *name) +recursive_lock_init_etc(recursive_lock *lock, const char *name, uint32 flags) { - recursive_lock_init_etc(lock, name, 0); + mutex_init_etc(&lock->lock, name != NULL ? name : "recursive lock", flags); + RECURSIVE_LOCK_HOLDER(lock) = -1; + lock->recursion = 0; } @@ -65,8 +47,7 @@ recursive_lock_destroy(recursive_lock *lock) if (lock == NULL) return; - delete_sem((sem_id)lock->lock.waiters); - lock->lock.waiters = (mutex_waiter*)-1; + mutex_destroy(&lock->lock); } @@ -75,29 +56,33 @@ recursive_lock_lock(recursive_lock *lock) { thread_id thread = find_thread(NULL); + if (thread != RECURSIVE_LOCK_HOLDER(lock)) { + mutex_lock(&lock->lock); #if !KDEBUG - if (thread != lock->holder) { - status_t status; - do { - status = acquire_sem((sem_id)lock->lock.waiters); - } while (status == B_INTERRUPTED); - if (status < B_OK) - return status; - lock->holder = thread; +#endif } -#else - if (thread != lock->lock.holder) { - status_t status; - do { - status = acquire_sem((sem_id)lock->lock.waiters); - } while (status == B_INTERRUPTED); - if (status < B_OK) + + lock->recursion++; + return B_OK; +} + + +status_t +recursive_lock_trylock(recursive_lock *lock) +{ + thread_id thread = find_thread(NULL); + + if (thread != RECURSIVE_LOCK_HOLDER(lock)) { + status_t status = mutex_trylock(&lock->lock); + if (status != B_OK) return status; - lock->lock.holder = thread; - } +#if !KDEBUG + lock->holder = thread; #endif + } + lock->recursion++; return B_OK; } @@ -106,21 +91,14 @@ recursive_lock_lock(recursive_lock *lock) void recursive_lock_unlock(recursive_lock *lock) { -#if !KDEBUG - if (find_thread(NULL) != lock->holder) + if (find_thread(NULL) != RECURSIVE_LOCK_HOLDER(lock)) panic("recursive_lock %p unlocked by non-holder thread!\n", lock); -#else - if (find_thread(NULL) != lock->lock.holder) - panic("recursive_lock %p unlocked by non-holder thread!\n", lock); -#endif if (--lock->recursion == 0) { #if !KDEBUG lock->holder = -1; -#else - lock->lock.holder = -1; #endif - release_sem_etc((sem_id)lock->lock.waiters, 1, 0); + mutex_unlock(&lock->lock); } }