summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtchang%redhat.com <devnull@localhost>2005-02-23 17:49:14 +0000
committerwtchang%redhat.com <devnull@localhost>2005-02-23 17:49:14 +0000
commit515787a9940ffabc4ae00795dfb536c2ce85bddb (patch)
treedab8143bb5d0c5b7e2f8d0df73f69ecb63974675
parent0191ac2e5e8d0990f73a0ab6ddf8cc6396ffffa3 (diff)
downloadnspr-hg-515787a9940ffabc4ae00795dfb536c2ce85bddb.tar.gz
Bugzilla Bug 283210: Use the B_DO_NOT_RESCHEDULE flag to avoid unnecessary
context switches when a lock is released. The patch is contributed by tqh <thesuckiestemail@yahoo.se>. r=sergei_d,wtc. Modified Files: btcvar.c btlocks.c btsem.c Tag: NSPRPUB_PRE_4_2_CLIENT_BRANCH
-rw-r--r--pr/src/bthreads/btcvar.c18
-rw-r--r--pr/src/bthreads/btlocks.c2
-rw-r--r--pr/src/bthreads/btsem.c2
3 files changed, 11 insertions, 11 deletions
diff --git a/pr/src/bthreads/btcvar.c b/pr/src/bthreads/btcvar.c
index 841ec960..f615bf5b 100644
--- a/pr/src/bthreads/btcvar.c
+++ b/pr/src/bthreads/btcvar.c
@@ -141,7 +141,7 @@ PR_IMPLEMENT(PRStatus)
cvar->nw += 1;
if( atomic_add( &cvar->signalBenCount, -1 ) > 1 )
{
- release_sem(cvar->signalSem);
+ release_sem_etc(cvar->signalSem, 1, B_DO_NOT_RESCHEDULE);
}
PR_Unlock( cvar->lock );
@@ -161,13 +161,13 @@ PR_IMPLEMENT(PRStatus)
if (cvar->ns > 0)
{
- release_sem(cvar->handshakeSem);
+ release_sem_etc(cvar->handshakeSem, 1, B_DO_NOT_RESCHEDULE);
cvar->ns -= 1;
}
cvar->nw -= 1;
if( atomic_add( &cvar->signalBenCount, -1 ) > 1 )
{
- release_sem(cvar->signalSem);
+ release_sem_etc(cvar->signalSem, 1, B_DO_NOT_RESCHEDULE);
}
PR_Lock( cvar->lock );
@@ -206,10 +206,10 @@ PR_IMPLEMENT(PRStatus)
if (cvar->nw > cvar->ns)
{
cvar->ns += 1;
- release_sem(cvar->sem);
+ release_sem_etc(cvar->sem, 1, B_DO_NOT_RESCHEDULE);
if( atomic_add( &cvar->signalBenCount, -1 ) > 1 )
{
- release_sem(cvar->signalSem);
+ release_sem_etc(cvar->signalSem, 1, B_DO_NOT_RESCHEDULE);
}
while (acquire_sem(cvar->handshakeSem) == B_INTERRUPTED)
@@ -221,7 +221,7 @@ PR_IMPLEMENT(PRStatus)
{
if( atomic_add( &cvar->signalBenCount, -1 ) > 1 )
{
- release_sem(cvar->signalSem);
+ release_sem_etc(cvar->signalSem, 1, B_DO_NOT_RESCHEDULE);
}
}
return PR_SUCCESS;
@@ -254,10 +254,10 @@ PR_IMPLEMENT(PRStatus)
{
handshakes = cvar->nw - cvar->ns;
cvar->ns = cvar->nw;
- release_sem_etc(cvar->sem, handshakes, 0);
+ release_sem_etc(cvar->sem, handshakes, B_DO_NOT_RESCHEDULE);
if( atomic_add( &cvar->signalBenCount, -1 ) > 1 )
{
- release_sem(cvar->signalSem);
+ release_sem_etc(cvar->signalSem, 1, B_DO_NOT_RESCHEDULE);
}
while (acquire_sem_etc(cvar->handshakeSem, handshakes, 0, 0) == B_INTERRUPTED)
@@ -269,7 +269,7 @@ PR_IMPLEMENT(PRStatus)
{
if( atomic_add( &cvar->signalBenCount, -1 ) > 1 )
{
- release_sem(cvar->signalSem);
+ release_sem_etc(cvar->signalSem, 1, B_DO_NOT_RESCHEDULE);
}
}
return PR_SUCCESS;
diff --git a/pr/src/bthreads/btlocks.c b/pr/src/bthreads/btlocks.c
index c5b62860..bf8bfd47 100644
--- a/pr/src/bthreads/btlocks.c
+++ b/pr/src/bthreads/btlocks.c
@@ -109,7 +109,7 @@ PR_IMPLEMENT(PRStatus)
lock->owner = NULL;
if( atomic_add( &lock->benaphoreCount, -1 ) > 1 ) {
- release_sem( lock->semaphoreID );
+ release_sem_etc( lock->semaphoreID, 1, B_DO_NOT_RESCHEDULE );
}
return PR_SUCCESS;
diff --git a/pr/src/bthreads/btsem.c b/pr/src/bthreads/btsem.c
index c9f2e641..bce28142 100644
--- a/pr/src/bthreads/btsem.c
+++ b/pr/src/bthreads/btsem.c
@@ -109,7 +109,7 @@ PR_IMPLEMENT(void)
status_t result;
PR_ASSERT(sem != NULL);
- result = release_sem(sem->sem);
+ result = release_sem_etc(sem->sem, 1, B_DO_NOT_RESCHEDULE);
PR_ASSERT(result == B_NO_ERROR);
}