}
}
- /* 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 {
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 {
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 {
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 {
/* 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);
}
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);
}
lockp->flags &= ~OSI_LOCKFLAG_EXCL;
lockp->tid = 0;
- if (!osi_TEmpty(&lockp->d.turn)) {
+ if (lockp->waiters) {
osi_TSignalForMLs(&lockp->d.turn, 0, NULL);
}