diff options
Diffstat (limited to 'src/backend/storage/lmgr/proc.c')
-rw-r--r-- | src/backend/storage/lmgr/proc.c | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 650500de48b..74adf58a4de 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.43 1998/09/01 04:32:02 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.44 1998/12/18 19:45:37 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -46,7 +46,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.43 1998/09/01 04:32:02 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.44 1998/12/18 19:45:37 momjian Exp $ */ #include <sys/time.h> #include <unistd.h> @@ -77,7 +77,7 @@ #include "storage/proc.h" #include "utils/trace.h" -static void HandleDeadLock(int sig); +static void HandleDeadLock(void); static PROC *ProcWakeup(PROC *proc, int errType); #define DeadlockCheckTimer pg_options[OPT_DEADLOCKTIMEOUT] @@ -154,8 +154,6 @@ InitProcess(IPCKey key) * Routine called if deadlock timer goes off. See ProcSleep() * ------------------ */ - pqsignal(SIGALRM, HandleDeadLock); - SpinAcquire(ProcStructLock); /* attach to the free list */ @@ -449,9 +447,9 @@ ProcSleep(PROC_QUEUE *waitQueue,/* lock->waitProcs */ TransactionId xid) /* needed by user locks, see below */ { int i; + bool deadlock_checked = false; PROC *proc; - struct itimerval timeval, - dummy; + struct timeval timeval; /* * If the first entries in the waitQueue have a greater priority than @@ -523,17 +521,26 @@ ProcSleep(PROC_QUEUE *waitQueue,/* lock->waitProcs */ * to 0. * -------------- */ - MemSet(&timeval, 0, sizeof(struct itimerval)); - timeval.it_value.tv_sec = \ + MemSet(&timeval, 0, sizeof(struct timeval)); + timeval.tv_sec = \ (DeadlockCheckTimer ? DeadlockCheckTimer : DEADLOCK_CHECK_TIMER); do { + int expire; + MyProc->errType = NO_ERROR; /* reset flag after deadlock check */ - if (setitimer(ITIMER_REAL, &timeval, &dummy)) + if ((expire = select(0, NULL, NULL, NULL, + (deadlock_checked == false) ? &timeval : NULL)) == -1) elog(FATAL, "ProcSleep: Unable to set timer for process wakeup"); + if (expire == 0 /* timeout reached */ && deadlock_checked == false) + { + HandleDeadLock(); + deadlock_checked = true; + } + /* -------------- * if someone wakes us between SpinRelease and IpcSemaphoreLock, * IpcSemaphoreLock will not block. The wakeup is "saved" by @@ -545,14 +552,6 @@ ProcSleep(PROC_QUEUE *waitQueue,/* lock->waitProcs */ } while (MyProc->errType == STATUS_NOT_FOUND); /* sleep after deadlock * check */ - /* --------------- - * We were awoken before a timeout - now disable the timer - * --------------- - */ - timeval.it_value.tv_sec = 0; - if (setitimer(ITIMER_REAL, &timeval, &dummy)) - elog(FATAL, "ProcSleep: Unable to diable timer for process wakeup"); - /* ---------------- * We were assumed to be in a critical section when we went * to sleep. @@ -695,7 +694,7 @@ ProcAddLock(SHM_QUEUE *elem) * -------------------- */ static void -HandleDeadLock(int sig) +HandleDeadLock() { LOCK *mywaitlock; |