Windows: use waiters counter instead of osi_TEmpty
authorJeffrey Altman <jaltman@your-file-system.com>
Tue, 27 Dec 2011 01:48:24 +0000 (20:48 -0500)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 31 Dec 2011 21:15:14 +0000 (13:15 -0800)
The osi_TEmpty() macro examines the values of the turnstile
pointers.  Instead use the lock's 'waiters' counter to determine
if there are waiting threads to signal.

Change-Id: I8e14a03a30adcf1e67b07fc020104c2ada3b5c6a
Reviewed-on: http://gerrit.openafs.org/6434
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>

src/WINNT/client_osi/osibasel.c

index 351a6f7..20444f8 100644 (file)
@@ -311,8 +311,10 @@ void lock_ReleaseRead(osi_rwlock_t *lockp)
         }
     }
 
-    /* releasing a read lock can allow readers or writers */
-    if (--(lockp->readers) == 0 && !osi_TEmpty(&lockp->d.turn)) {
+       lockp->readers--;
+
+    /* releasing a read lock can allow writers */
+    if (lockp->readers == 0 && lockp->waiters) {
         osi_TSignalForMLs(&lockp->d.turn, 0, csp);
     }
     else {
@@ -365,7 +367,7 @@ void lock_ReleaseWrite(osi_rwlock_t *lockp)
     lockp->tid[0] = 0;
 
     lockp->flags &= ~OSI_LOCKFLAG_EXCL;
-    if (!osi_TEmpty(&lockp->d.turn)) {
+    if (lockp->waiters) {
         osi_TSignalForMLs(&lockp->d.turn, 0, csp);
     }
     else {
@@ -398,7 +400,7 @@ void lock_ConvertWToR(osi_rwlock_t *lockp)
 
     osi_assertx(lockp->readers == 1, "read lock not one");
 
-    if (!osi_TEmpty(&lockp->d.turn)) {
+    if (lockp->waiters) {
         osi_TSignalForMLs(&lockp->d.turn, /* still have readers */ 1, csp);
     }
     else {
@@ -541,7 +543,7 @@ void lock_ReleaseMutex(struct osi_mutex *lockp)
 
     lockp->flags &= ~OSI_LOCKFLAG_EXCL;
     lockp->tid = 0;
-    if (!osi_TEmpty(&lockp->d.turn)) {
+    if (lockp->waiters) {
         osi_TSignalForMLs(&lockp->d.turn, 0, csp);
     }
     else {
@@ -753,7 +755,7 @@ void osi_SleepR(LONG_PTR sleepVal, struct osi_rwlock *lockp)
     /* XXX better to get the list of things to wakeup from TSignalForMLs, and
      * then do the wakeup after SleepSpin releases the low-level mutex.
      */
-    if (--(lockp->readers) == 0 && !osi_TEmpty(&lockp->d.turn)) {
+    if (--(lockp->readers) == 0 && lockp->waiters) {
         osi_TSignalForMLs(&lockp->d.turn, 0, NULL);
     }
 
@@ -799,7 +801,7 @@ void osi_SleepW(LONG_PTR sleepVal, struct osi_rwlock *lockp)
 
     lockp->flags &= ~OSI_LOCKFLAG_EXCL;
     lockp->tid[0] = 0;
-    if (!osi_TEmpty(&lockp->d.turn)) {
+    if (lockp->waiters) {
         osi_TSignalForMLs(&lockp->d.turn, 0, NULL);
     }
 
@@ -844,7 +846,7 @@ void osi_SleepM(LONG_PTR sleepVal, struct osi_mutex *lockp)
 
     lockp->flags &= ~OSI_LOCKFLAG_EXCL;
     lockp->tid = 0;
-    if (!osi_TEmpty(&lockp->d.turn)) {
+    if (lockp->waiters) {
         osi_TSignalForMLs(&lockp->d.turn, 0, NULL);
     }