From 39e3058e5bdbb72a42a1cc26a6c4f30f9bec37c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 19 Oct 2009 00:16:54 +0000 Subject: [PATCH] * Reverted r33643 - while it doubled the performance for my test case (with high contention of the read lock (I experimented with the VM page mapping lock)), it actually hurt the compile performance pretty obviously. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33647 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/lock.h | 4 +--- src/system/kernel/lock.cpp | 26 ++++++-------------------- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/headers/private/kernel/lock.h b/headers/private/kernel/lock.h index f526f5e807..23de9af291 100644 --- a/headers/private/kernel/lock.h +++ b/headers/private/kernel/lock.h @@ -42,7 +42,6 @@ struct rw_lock_waiter; typedef struct rw_lock { const char* name; - mutex lock; struct rw_lock_waiter* waiters; thread_id holder; int32 reader_count; @@ -86,8 +85,7 @@ typedef struct rw_lock { # define RECURSIVE_LOCK_INITIALIZER(name) { MUTEX_INITIALIZER(name), -1, 0 } #endif -#define RW_LOCK_INITIALIZER(name) { name, MUTEX_INITIALIZER(name), \ - NULL, -1, 0, 0, 0 } +#define RW_LOCK_INITIALIZER(name) { name, NULL, -1, 0, 0, 0 } #if KDEBUG diff --git a/src/system/kernel/lock.cpp b/src/system/kernel/lock.cpp index 5f8a7b241f..76220c71de 100644 --- a/src/system/kernel/lock.cpp +++ b/src/system/kernel/lock.cpp @@ -164,10 +164,6 @@ rw_lock_wait(rw_lock* lock, bool writer) lock->waiters->last = &waiter; - InterruptsSpinLocker locker(gThreadSpinlock); - - _mutex_unlock(&lock->lock, true); - // block thread_prepare_to_block(waiter.thread, 0, THREAD_BLOCK_TYPE_RW_LOCK, lock); return thread_block_locked(waiter.thread); @@ -194,7 +190,6 @@ rw_lock_unblock(rw_lock* lock) lock->holder = waiter->thread->id; // unblock thread - InterruptsSpinLocker locker(gThreadSpinlock); thread_unblock_locked(waiter->thread, B_OK); } return; @@ -210,7 +205,6 @@ rw_lock_unblock(rw_lock* lock) lock->reader_count++; // unblock thread - InterruptsSpinLocker locker(gThreadSpinlock); thread_unblock_locked(waiter->thread, B_OK); } } @@ -227,8 +221,6 @@ rw_lock_init(rw_lock* lock, const char* name) lock->owner_count = 0; lock->flags = 0; - mutex_init(&lock->lock, name); - T_SCHEDULING_ANALYSIS(InitRWLock(lock, name)); NotifyWaitObjectListeners(&WaitObjectListener::RWLockInitialized, lock); } @@ -245,8 +237,6 @@ rw_lock_init_etc(rw_lock* lock, const char* name, uint32 flags) lock->owner_count = 0; lock->flags = flags & RW_LOCK_FLAG_CLONE_NAME; - mutex_init(&lock->lock, lock->name); - T_SCHEDULING_ANALYSIS(InitRWLock(lock, name)); NotifyWaitObjectListeners(&WaitObjectListener::RWLockInitialized, lock); } @@ -262,8 +252,8 @@ rw_lock_destroy(rw_lock* lock) InterruptsSpinLocker locker(gThreadSpinlock); #if KDEBUG - if (lock->waiters != NULL - && thread_get_current_thread_id() != lock->holder) { + if (lock->waiters != NULL && thread_get_current_thread_id() + != lock->holder) { panic("rw_lock_destroy(): there are blocking threads, but the caller " "doesn't hold the write lock (%p)", lock); @@ -285,7 +275,6 @@ rw_lock_destroy(rw_lock* lock) lock->name = NULL; locker.Unlock(); - mutex_destroy(&lock->lock); free(name); } @@ -297,7 +286,7 @@ rw_lock_read_lock(rw_lock* lock) #if KDEBUG_RW_LOCK_DEBUG return rw_lock_write_lock(lock); #else - MutexLocker locker(lock->lock); + InterruptsSpinLocker locker(gThreadSpinlock); if (lock->writer_count == 0) { lock->reader_count++; @@ -308,8 +297,6 @@ rw_lock_read_lock(rw_lock* lock) return B_OK; } - locker.Detach(); - return rw_lock_wait(lock, false); #endif } @@ -321,7 +308,7 @@ rw_lock_read_unlock(rw_lock* lock) #if KDEBUG_RW_LOCK_DEBUG return rw_lock_write_unlock(lock); #else - MutexLocker locker(lock->lock); + InterruptsSpinLocker locker(gThreadSpinlock); if (lock->holder == thread_get_current_thread_id()) { if (--lock->owner_count > 0) @@ -351,7 +338,7 @@ rw_lock_read_unlock(rw_lock* lock) status_t rw_lock_write_lock(rw_lock* lock) { - MutexLocker locker(lock->lock); + InterruptsSpinLocker locker(gThreadSpinlock); if (lock->reader_count == 0 && lock->writer_count == 0) { lock->writer_count++; @@ -365,7 +352,6 @@ rw_lock_write_lock(rw_lock* lock) } lock->writer_count++; - locker.Detach(); status_t status = rw_lock_wait(lock, true); if (status == B_OK) { @@ -379,7 +365,7 @@ rw_lock_write_lock(rw_lock* lock) status_t rw_lock_write_unlock(rw_lock* lock) { - MutexLocker locker(lock->lock); + InterruptsSpinLocker locker(gThreadSpinlock); if (thread_get_current_thread_id() != lock->holder) { panic("rw_lock_write_unlock(): lock %p not write-locked by this thread",