|
|
|
|
@ -1196,8 +1196,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If we detected deadlock, give up without waiting. This must agree with |
|
|
|
|
* CheckDeadLock's recovery code, except that we shouldn't release the |
|
|
|
|
* semaphore since we haven't tried to lock it yet. |
|
|
|
|
* CheckDeadLock's recovery code. |
|
|
|
|
*/ |
|
|
|
|
if (early_deadlock) |
|
|
|
|
{ |
|
|
|
|
@ -1233,9 +1232,9 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Set timer so we can wake up after awhile and check for a deadlock. If a |
|
|
|
|
* deadlock is detected, the handler releases the process's semaphore and |
|
|
|
|
* sets MyProc->waitStatus = STATUS_ERROR, allowing us to know that we |
|
|
|
|
* must report failure rather than success. |
|
|
|
|
* deadlock is detected, the handler sets MyProc->waitStatus = |
|
|
|
|
* STATUS_ERROR, allowing us to know that we must report failure rather |
|
|
|
|
* than success. |
|
|
|
|
* |
|
|
|
|
* By delaying the check until we've waited for a bit, we can avoid |
|
|
|
|
* running the rather expensive deadlock-check code in most cases. |
|
|
|
|
@ -1578,7 +1577,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* ProcWakeup -- wake up a process by releasing its private semaphore. |
|
|
|
|
* ProcWakeup -- wake up a process by setting its latch. |
|
|
|
|
* |
|
|
|
|
* Also remove the process from the wait queue and set its links invalid. |
|
|
|
|
* RETURN: the next process in the wait queue. |
|
|
|
|
@ -1713,8 +1712,7 @@ CheckDeadLock(void) |
|
|
|
|
* we know that we don't have to wait anymore. |
|
|
|
|
* |
|
|
|
|
* We check by looking to see if we've been unlinked from the wait queue. |
|
|
|
|
* This is quicker than checking our semaphore's state, since no kernel |
|
|
|
|
* call is needed, and it is safe because we hold the lock partition lock. |
|
|
|
|
* This is safe because we hold the lock partition lock. |
|
|
|
|
*/ |
|
|
|
|
if (MyProc->links.prev == NULL || |
|
|
|
|
MyProc->links.next == NULL) |
|
|
|
|
|