From 3cd3be92ff1d134c9c0612de6969264e0dcc78fc Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 18 Dec 1998 19:45:38 +0000 Subject: [PATCH] Fix deadlock so it only checks once. --- src/backend/parser/scan.c | 4 ++-- src/backend/storage/lmgr/proc.c | 37 ++++++++++++++++----------------- src/pl/plpgsql/src/gram.c | 2 +- src/pl/plpgsql/src/scan.c | 2 +- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/backend/parser/scan.c b/src/backend/parser/scan.c index 528cd7f1cd..ad0f71a5cc 100644 --- a/src/backend/parser/scan.c +++ b/src/backend/parser/scan.c @@ -1,7 +1,7 @@ /* A lexical scanner generated by flex */ /* Scanner skeleton version: - * $Header: /cvsroot/pgsql/src/backend/parser/Attic/scan.c,v 1.31 1998/10/13 17:26:50 scrappy Exp $ + * /master/usr.bin/lex/skel.c,v 1.3 1997/09/25 00:10:23 jch Exp */ #define FLEX_SCANNER @@ -556,7 +556,7 @@ char *yytext; * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/Attic/scan.c,v 1.31 1998/10/13 17:26:50 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/Attic/scan.c,v 1.32 1998/12/18 19:45:36 momjian Exp $ * *------------------------------------------------------------------------- */ diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 650500de48..74adf58a4d 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 #include @@ -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; diff --git a/src/pl/plpgsql/src/gram.c b/src/pl/plpgsql/src/gram.c index e24b335fa8..d6a11dda3e 100644 --- a/src/pl/plpgsql/src/gram.c +++ b/src/pl/plpgsql/src/gram.c @@ -65,7 +65,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/gram.c,v 1.1 1998/10/28 17:07:17 momjian Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/gram.c,v 1.2 1998/12/18 19:45:38 momjian Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * diff --git a/src/pl/plpgsql/src/scan.c b/src/pl/plpgsql/src/scan.c index 74e6af9625..e0054dc316 100644 --- a/src/pl/plpgsql/src/scan.c +++ b/src/pl/plpgsql/src/scan.c @@ -635,7 +635,7 @@ char *yytext_ptr; * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.c,v 1.1 1998/10/28 17:07:17 momjian Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.c,v 1.2 1998/12/18 19:45:38 momjian Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * -- GitLab