diff options
| author | Hiroshi Inoue <inoue@tpf.co.jp> | 2000-02-22 09:55:26 +0000 |
|---|---|---|
| committer | Hiroshi Inoue <inoue@tpf.co.jp> | 2000-02-22 09:55:26 +0000 |
| commit | 5525297465185198d7a5db9273d5fab9e8a3faf1 (patch) | |
| tree | 3935c7620c0b6b9d5146c528ad4a36130181812c /src/backend/storage/lmgr | |
| parent | 167dce89123a60a9a12a002148ba8c2ffd45d3da (diff) | |
| download | postgresql-5525297465185198d7a5db9273d5fab9e8a3faf1.tar.gz | |
Change cancel while waiting-for-lock stuff.
Diffstat (limited to 'src/backend/storage/lmgr')
| -rw-r--r-- | src/backend/storage/lmgr/lock.c | 3 | ||||
| -rw-r--r-- | src/backend/storage/lmgr/proc.c | 33 |
2 files changed, 29 insertions, 7 deletions
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index 63896a9500..bc9a6afc9a 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.65 2000/01/26 05:57:01 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.66 2000/02/22 09:55:20 inoue Exp $ * * NOTES * Outside modules can create a lock table and acquire/release @@ -1743,6 +1743,7 @@ DeadLockCheck(void *proc, LOCK *findlock) MyProc->xid, NULL) == STATUS_OK) { + SetWaitingForLock(false); GrantLock(MyProc->waitLock, MyProc->token); (MyProc->waitLock->waitProcs.size)--; ProcWakeup(MyProc, NO_ERROR); diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index dafab7ebfd..4e377d6498 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.68 2000/02/21 02:42:36 inoue Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.69 2000/02/22 09:55:20 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.68 2000/02/21 02:42:36 inoue Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.69 2000/02/22 09:55:20 inoue Exp $ */ #include <sys/time.h> #include <unistd.h> @@ -74,6 +74,7 @@ void HandleDeadLock(SIGNAL_ARGS); static void ProcFreeAllSemaphores(void); +static bool GetOffWaitqueue(PROC *); #define DeadlockCheckTimer pg_options[OPT_DEADLOCKTIMEOUT] @@ -316,9 +317,10 @@ InitProcess(IPCKey key) * get off the wait queue * ----------------------- */ -static void +static bool GetOffWaitqueue(PROC *proc) { + bool getoffed = false; LockLockTable(); if (proc->links.next != INVALID_OFFSET) { @@ -334,11 +336,12 @@ GetOffWaitqueue(PROC *proc) if (proc->waitLock->activeHolders[lockmode] == proc->waitLock->holders[lockmode]) proc->waitLock->waitMask &= ~(1 << lockmode); + getoffed = true; } SHMQueueElemInit(&(proc->links)); UnlockLockTable(); - return; + return getoffed; } /* * ProcReleaseLocks() -- release all locks associated with this process @@ -478,6 +481,23 @@ ProcQueueInit(PROC_QUEUE *queue) } +static bool lockWaiting = false; +void SetWaitingForLock(bool waiting) +{ + lockWaiting = waiting; +} +void LockWaitCancel(void) +{ + struct itimerval timeval, dummy; + + if (!lockWaiting) return; + lockWaiting = false; + /* Deadlock timer off */ + MemSet(&timeval, 0, sizeof(struct itimerval)); + setitimer(ITIMER_REAL, &timeval, &dummy); + if (GetOffWaitqueue(MyProc)) + elog(ERROR, "Query cancel requested while waiting lock"); +} /* * ProcSleep -- put a process to sleep @@ -590,7 +610,7 @@ ins:; timeval.it_value.tv_sec = \ (DeadlockCheckTimer ? DeadlockCheckTimer : DEADLOCK_CHECK_TIMER); - SetLockWaiting(true); + lockWaiting = true; do { MyProc->errType = NO_ERROR; /* reset flag after deadlock check */ @@ -610,7 +630,7 @@ ins:; IpcExclusiveLock); } while (MyProc->errType == STATUS_NOT_FOUND); /* sleep after deadlock * check */ - SetLockWaiting(false); + lockWaiting = false; /* --------------- * We were awoken before a timeout - now disable the timer @@ -824,6 +844,7 @@ HandleDeadLock(SIGNAL_ARGS) * ------------------------ */ Assert(mywaitlock->waitProcs.size > 0); + lockWaiting = false; --mywaitlock->waitProcs.size; SHMQueueDelete(&(MyProc->links)); SHMQueueElemInit(&(MyProc->links)); |
