diff options
Diffstat (limited to 'src/backend/storage/lmgr/proc.c')
-rw-r--r-- | src/backend/storage/lmgr/proc.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 01097fcd2fe..dafab7ebfd3 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.67 2000/01/26 05:57:02 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.68 2000/02/21 02:42:36 inoue Exp $ * *------------------------------------------------------------------------- */ @@ -47,7 +47,7 @@ * This is so that we can support more backends. (system-wide semaphore * sets run out pretty fast.) -ay 4/95 * - * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.67 2000/01/26 05:57:02 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.68 2000/02/21 02:42:36 inoue Exp $ */ #include <sys/time.h> #include <unistd.h> @@ -312,6 +312,34 @@ InitProcess(IPCKey key) on_shmem_exit(ProcKill, (caddr_t) MyProcPid); } +/* ----------------------- + * get off the wait queue + * ----------------------- + */ +static void +GetOffWaitqueue(PROC *proc) +{ + LockLockTable(); + if (proc->links.next != INVALID_OFFSET) + { + int lockmode = proc->token; + Assert(proc->waitLock->waitProcs.size > 0); + SHMQueueDelete(&(proc->links)); + --proc->waitLock->waitProcs.size; + Assert(proc->waitLock->nHolding > 0); + Assert(proc->waitLock->nHolding > proc->waitLock->nActive); + --proc->waitLock->nHolding; + Assert(proc->waitLock->holders[lockmode] > 0); + --proc->waitLock->holders[lockmode]; + if (proc->waitLock->activeHolders[lockmode] == + proc->waitLock->holders[lockmode]) + proc->waitLock->waitMask &= ~(1 << lockmode); + } + SHMQueueElemInit(&(proc->links)); + UnlockLockTable(); + + return; +} /* * ProcReleaseLocks() -- release all locks associated with this process * @@ -322,6 +350,7 @@ ProcReleaseLocks() if (!MyProc) return; LockReleaseAll(1, &MyProc->lockQueue); + GetOffWaitqueue(MyProc); } /* @@ -405,15 +434,7 @@ ProcKill(int exitStatus, int pid) * get off the wait queue * ---------------- */ - LockLockTable(); - if (proc->links.next != INVALID_OFFSET) - { - Assert(proc->waitLock->waitProcs.size > 0); - SHMQueueDelete(&(proc->links)); - --proc->waitLock->waitProcs.size; - } - SHMQueueElemInit(&(proc->links)); - UnlockLockTable(); + GetOffWaitqueue(proc); return; } @@ -569,6 +590,7 @@ ins:; timeval.it_value.tv_sec = \ (DeadlockCheckTimer ? DeadlockCheckTimer : DEADLOCK_CHECK_TIMER); + SetLockWaiting(true); do { MyProc->errType = NO_ERROR; /* reset flag after deadlock check */ @@ -588,6 +610,7 @@ ins:; IpcExclusiveLock); } while (MyProc->errType == STATUS_NOT_FOUND); /* sleep after deadlock * check */ + SetLockWaiting(false); /* --------------- * We were awoken before a timeout - now disable the timer |