Fix deadlock so it only checks once.
authorBruce Momjian
Fri, 18 Dec 1998 19:45:38 +0000 (19:45 +0000)
committerBruce Momjian
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 
 #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;
 
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.
  *