Fix deadlock so it only checks once.
This commit is contained in:
parent
bb76dd858e
commit
3cd3be92ff
@ -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 $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user