* 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
This commit is contained in:
Axel Dörfler 2009-10-19 00:16:54 +00:00
parent 7d05cf36fc
commit 39e3058e5b
2 changed files with 7 additions and 23 deletions

View File

@ -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

View File

@ -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",