* 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:
@@ -42,7 +42,6 @@ struct rw_lock_waiter;
|
|||||||
|
|
||||||
typedef struct rw_lock {
|
typedef struct rw_lock {
|
||||||
const char* name;
|
const char* name;
|
||||||
mutex lock;
|
|
||||||
struct rw_lock_waiter* waiters;
|
struct rw_lock_waiter* waiters;
|
||||||
thread_id holder;
|
thread_id holder;
|
||||||
int32 reader_count;
|
int32 reader_count;
|
||||||
@@ -86,8 +85,7 @@ typedef struct rw_lock {
|
|||||||
# define RECURSIVE_LOCK_INITIALIZER(name) { MUTEX_INITIALIZER(name), -1, 0 }
|
# define RECURSIVE_LOCK_INITIALIZER(name) { MUTEX_INITIALIZER(name), -1, 0 }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define RW_LOCK_INITIALIZER(name) { name, MUTEX_INITIALIZER(name), \
|
#define RW_LOCK_INITIALIZER(name) { name, NULL, -1, 0, 0, 0 }
|
||||||
NULL, -1, 0, 0, 0 }
|
|
||||||
|
|
||||||
|
|
||||||
#if KDEBUG
|
#if KDEBUG
|
||||||
|
|||||||
@@ -164,10 +164,6 @@ rw_lock_wait(rw_lock* lock, bool writer)
|
|||||||
|
|
||||||
lock->waiters->last = &waiter;
|
lock->waiters->last = &waiter;
|
||||||
|
|
||||||
InterruptsSpinLocker locker(gThreadSpinlock);
|
|
||||||
|
|
||||||
_mutex_unlock(&lock->lock, true);
|
|
||||||
|
|
||||||
// block
|
// block
|
||||||
thread_prepare_to_block(waiter.thread, 0, THREAD_BLOCK_TYPE_RW_LOCK, lock);
|
thread_prepare_to_block(waiter.thread, 0, THREAD_BLOCK_TYPE_RW_LOCK, lock);
|
||||||
return thread_block_locked(waiter.thread);
|
return thread_block_locked(waiter.thread);
|
||||||
@@ -194,7 +190,6 @@ rw_lock_unblock(rw_lock* lock)
|
|||||||
lock->holder = waiter->thread->id;
|
lock->holder = waiter->thread->id;
|
||||||
|
|
||||||
// unblock thread
|
// unblock thread
|
||||||
InterruptsSpinLocker locker(gThreadSpinlock);
|
|
||||||
thread_unblock_locked(waiter->thread, B_OK);
|
thread_unblock_locked(waiter->thread, B_OK);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -210,7 +205,6 @@ rw_lock_unblock(rw_lock* lock)
|
|||||||
lock->reader_count++;
|
lock->reader_count++;
|
||||||
|
|
||||||
// unblock thread
|
// unblock thread
|
||||||
InterruptsSpinLocker locker(gThreadSpinlock);
|
|
||||||
thread_unblock_locked(waiter->thread, B_OK);
|
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->owner_count = 0;
|
||||||
lock->flags = 0;
|
lock->flags = 0;
|
||||||
|
|
||||||
mutex_init(&lock->lock, name);
|
|
||||||
|
|
||||||
T_SCHEDULING_ANALYSIS(InitRWLock(lock, name));
|
T_SCHEDULING_ANALYSIS(InitRWLock(lock, name));
|
||||||
NotifyWaitObjectListeners(&WaitObjectListener::RWLockInitialized, lock);
|
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->owner_count = 0;
|
||||||
lock->flags = flags & RW_LOCK_FLAG_CLONE_NAME;
|
lock->flags = flags & RW_LOCK_FLAG_CLONE_NAME;
|
||||||
|
|
||||||
mutex_init(&lock->lock, lock->name);
|
|
||||||
|
|
||||||
T_SCHEDULING_ANALYSIS(InitRWLock(lock, name));
|
T_SCHEDULING_ANALYSIS(InitRWLock(lock, name));
|
||||||
NotifyWaitObjectListeners(&WaitObjectListener::RWLockInitialized, lock);
|
NotifyWaitObjectListeners(&WaitObjectListener::RWLockInitialized, lock);
|
||||||
}
|
}
|
||||||
@@ -262,8 +252,8 @@ rw_lock_destroy(rw_lock* lock)
|
|||||||
InterruptsSpinLocker locker(gThreadSpinlock);
|
InterruptsSpinLocker locker(gThreadSpinlock);
|
||||||
|
|
||||||
#if KDEBUG
|
#if KDEBUG
|
||||||
if (lock->waiters != NULL
|
if (lock->waiters != NULL && thread_get_current_thread_id()
|
||||||
&& thread_get_current_thread_id() != lock->holder) {
|
!= lock->holder) {
|
||||||
panic("rw_lock_destroy(): there are blocking threads, but the caller "
|
panic("rw_lock_destroy(): there are blocking threads, but the caller "
|
||||||
"doesn't hold the write lock (%p)", lock);
|
"doesn't hold the write lock (%p)", lock);
|
||||||
|
|
||||||
@@ -285,7 +275,6 @@ rw_lock_destroy(rw_lock* lock)
|
|||||||
lock->name = NULL;
|
lock->name = NULL;
|
||||||
|
|
||||||
locker.Unlock();
|
locker.Unlock();
|
||||||
mutex_destroy(&lock->lock);
|
|
||||||
|
|
||||||
free(name);
|
free(name);
|
||||||
}
|
}
|
||||||
@@ -297,7 +286,7 @@ rw_lock_read_lock(rw_lock* lock)
|
|||||||
#if KDEBUG_RW_LOCK_DEBUG
|
#if KDEBUG_RW_LOCK_DEBUG
|
||||||
return rw_lock_write_lock(lock);
|
return rw_lock_write_lock(lock);
|
||||||
#else
|
#else
|
||||||
MutexLocker locker(lock->lock);
|
InterruptsSpinLocker locker(gThreadSpinlock);
|
||||||
|
|
||||||
if (lock->writer_count == 0) {
|
if (lock->writer_count == 0) {
|
||||||
lock->reader_count++;
|
lock->reader_count++;
|
||||||
@@ -308,8 +297,6 @@ rw_lock_read_lock(rw_lock* lock)
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
locker.Detach();
|
|
||||||
|
|
||||||
return rw_lock_wait(lock, false);
|
return rw_lock_wait(lock, false);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -321,7 +308,7 @@ rw_lock_read_unlock(rw_lock* lock)
|
|||||||
#if KDEBUG_RW_LOCK_DEBUG
|
#if KDEBUG_RW_LOCK_DEBUG
|
||||||
return rw_lock_write_unlock(lock);
|
return rw_lock_write_unlock(lock);
|
||||||
#else
|
#else
|
||||||
MutexLocker locker(lock->lock);
|
InterruptsSpinLocker locker(gThreadSpinlock);
|
||||||
|
|
||||||
if (lock->holder == thread_get_current_thread_id()) {
|
if (lock->holder == thread_get_current_thread_id()) {
|
||||||
if (--lock->owner_count > 0)
|
if (--lock->owner_count > 0)
|
||||||
@@ -351,7 +338,7 @@ rw_lock_read_unlock(rw_lock* lock)
|
|||||||
status_t
|
status_t
|
||||||
rw_lock_write_lock(rw_lock* lock)
|
rw_lock_write_lock(rw_lock* lock)
|
||||||
{
|
{
|
||||||
MutexLocker locker(lock->lock);
|
InterruptsSpinLocker locker(gThreadSpinlock);
|
||||||
|
|
||||||
if (lock->reader_count == 0 && lock->writer_count == 0) {
|
if (lock->reader_count == 0 && lock->writer_count == 0) {
|
||||||
lock->writer_count++;
|
lock->writer_count++;
|
||||||
@@ -365,7 +352,6 @@ rw_lock_write_lock(rw_lock* lock)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lock->writer_count++;
|
lock->writer_count++;
|
||||||
locker.Detach();
|
|
||||||
|
|
||||||
status_t status = rw_lock_wait(lock, true);
|
status_t status = rw_lock_wait(lock, true);
|
||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
@@ -379,7 +365,7 @@ rw_lock_write_lock(rw_lock* lock)
|
|||||||
status_t
|
status_t
|
||||||
rw_lock_write_unlock(rw_lock* lock)
|
rw_lock_write_unlock(rw_lock* lock)
|
||||||
{
|
{
|
||||||
MutexLocker locker(lock->lock);
|
InterruptsSpinLocker locker(gThreadSpinlock);
|
||||||
|
|
||||||
if (thread_get_current_thread_id() != lock->holder) {
|
if (thread_get_current_thread_id() != lock->holder) {
|
||||||
panic("rw_lock_write_unlock(): lock %p not write-locked by this thread",
|
panic("rw_lock_write_unlock(): lock %p not write-locked by this thread",
|
||||||
|
|||||||
Reference in New Issue
Block a user