]> granicus.if.org Git - postgresql/commitdiff
Fix deadlock so it only checks once.
authorBruce Momjian <bruce@momjian.us>
Fri, 18 Dec 1998 19:45:38 +0000 (19:45 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 18 Dec 1998 19:45:38 +0000 (19:45 +0000)
src/backend/parser/scan.c
src/backend/storage/lmgr/proc.c
src/pl/plpgsql/src/gram.c
src/pl/plpgsql/src/scan.c

index 528cd7f1cde8ab99b20f3a41fa8cc1e1cd1a511a..ad0f71a5cc5c27521676c5135f0ec62cd88d51fe 100644 (file)
@@ -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 $
  *
  *-------------------------------------------------------------------------
  */
index 650500de48bff0d4d06d0758ef916655fb07c768..74adf58a4de04f8e9522978effe5ddd096df6193 100644 (file)
@@ -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;
 
index e24b335fa8a9b31cc287d3c5e64779aa61c5d2fb..d6a11dda3eb0adf50a67074d41ac387936344d06 100644 (file)
@@ -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.
  *
index 74e6af96251fb6c0569c2c9b78ea9143b7c1b545..e0054dc316f0e686ab75f861959105221a988a6d 100644 (file)
@@ -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.
  *