diff options
author | Marc G. Fournier <scrappy@hub.org> | 1998-08-25 21:34:10 +0000 |
---|---|---|
committer | Marc G. Fournier <scrappy@hub.org> | 1998-08-25 21:34:10 +0000 |
commit | 7414d619507ed9e2cdb5113ff77df55feef786c4 (patch) | |
tree | c91d6dd40a3fd11daac412901c7c64b93a334e97 /src/backend/storage/ipc | |
parent | 51e8e187d1ca6963a5467890a7f8ebbf8b59f573 (diff) |
From: Massimo Dal Zotto <dz@cs.unitn.it>
> tprintf.patch
>
> tprintf.patch
>
> adds functions and macros which implement a conditional trace package
> with the ability to change flags and numeric options of running
> backends at runtime.
> Options/flags can be specified in the command line and/or read from
> the file pg_options in the data directory.
Diffstat (limited to 'src/backend/storage/ipc')
-rw-r--r-- | src/backend/storage/ipc/ipc.c | 79 | ||||
-rw-r--r-- | src/backend/storage/ipc/spin.c | 41 |
2 files changed, 78 insertions, 42 deletions
diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c index debe3e5658c..a9c56cf728f 100644 --- a/src/backend/storage/ipc/ipc.c +++ b/src/backend/storage/ipc/ipc.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v 1.30 1998/07/12 04:43:28 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v 1.31 1998/08/25 21:34:01 scrappy Exp $ * * NOTES * @@ -39,6 +39,7 @@ #include <sys/shm.h> #include "utils/memutils.h" #include "libpq/libpq.h" +#include "utils/trace.h" #if defined(solaris_sparc) #include <string.h> @@ -113,17 +114,26 @@ proc_exit(int code) { int i; + TPRINTF(TRACE_VERBOSE, "proc_exit(%d) [#%d]", code, proc_exit_inprogress); + + /* + * If proc_exit is called too many times something bad is + * happenig, so exit immediately. + */ + if (proc_exit_inprogress > 9) { + elog(ERROR, "infinite recursion in proc_exit"); + goto exit; + } + /* ---------------- * if proc_exit_inprocess is true, then it means that we * are being invoked from within an on_exit() handler * and so we return immediately to avoid recursion. * ---------------- */ - if (proc_exit_inprogress) + if (proc_exit_inprogress++) return; - proc_exit_inprogress = 1; - /* do our shared memory exits first */ shmem_exit(code); @@ -134,6 +144,8 @@ proc_exit(int code) for (i = on_proc_exit_index - 1; i >= 0; --i) (*on_proc_exit_list[i].function) (code, on_proc_exit_list[i].arg); +exit: + TPRINTF(TRACE_VERBOSE, "exit(%d)", code); exit(code); } @@ -150,17 +162,27 @@ shmem_exit(int code) { int i; + TPRINTF(TRACE_VERBOSE, "shmem_exit(%d) [#%d]", + code, shmem_exit_inprogress); + + /* + * If shmem_exit is called too many times something bad is + * happenig, so exit immediately. + */ + if (shmem_exit_inprogress > 9) { + elog(ERROR, "infinite recursion in shmem_exit"); + exit(-1); + } + /* ---------------- * if shmem_exit_inprocess is true, then it means that we * are being invoked from within an on_exit() handler * and so we return immediately to avoid recursion. * ---------------- */ - if (shmem_exit_inprogress) + if (shmem_exit_inprogress++) return; - shmem_exit_inprogress = 1; - /* ---------------- * call all the callbacks registered before calling exit(). * ---------------- @@ -315,7 +337,7 @@ IpcSemaphoreCreate(IpcSemaphoreKey semKey, { *status = IpcSemIdNotExist; /* there doesn't exist a semaphore */ #ifdef DEBUG_IPC - fprintf(stderr, "calling semget with %d, %d , %d\n", + EPRINTF("calling semget with %d, %d , %d\n", semKey, semNum, IPC_CREAT | permission); @@ -324,8 +346,9 @@ IpcSemaphoreCreate(IpcSemaphoreKey semKey, if (semId < 0) { - perror("semget"); - IpcConfigTip(); + EPRINTF("IpcSemaphoreCreate: semget failed (%s) " + "key=%d, num=%d, permission=%o", + strerror(errno), semKey, semNum, permission); proc_exit(3); } for (i = 0; i < semNum; i++) @@ -334,8 +357,8 @@ IpcSemaphoreCreate(IpcSemaphoreKey semKey, errStatus = semctl(semId, 0, SETALL, semun); if (errStatus == -1) { - perror("semctl"); - IpcConfigTip(); + EPRINTF("IpcSemaphoreCreate: semctl failed (%s) id=%d", + strerror(errno), semId); } if (removeOnExit) @@ -349,7 +372,7 @@ IpcSemaphoreCreate(IpcSemaphoreKey semKey, } #ifdef DEBUG_IPC - fprintf(stderr, "\nIpcSemaphoreCreate, status %d, returns %d\n", + EPRINTF("\nIpcSemaphoreCreate, status %d, returns %d\n", *status, semId); fflush(stdout); @@ -379,8 +402,8 @@ IpcSemaphoreSet(int semId, int semno, int value) if (errStatus == -1) { - perror("semctl"); - IpcConfigTip(); + EPRINTF("IpcSemaphoreSet: semctl failed (%s) id=%d", + strerror(errno), semId); } } @@ -441,8 +464,8 @@ IpcSemaphoreLock(IpcSemaphoreId semId, int sem, int lock) if (errStatus == -1) { - perror("semop"); - IpcConfigTip(); + EPRINTF("IpcSemaphoreLock: semop failed (%s) id=%d", + strerror(errno), semId); proc_exit(255); } } @@ -486,8 +509,8 @@ IpcSemaphoreUnlock(IpcSemaphoreId semId, int sem, int lock) if (errStatus == -1) { - perror("semop"); - IpcConfigTip(); + EPRINTF("IpcSemaphoreUnlock: semop failed (%s) id=%d", + strerror(errno), semId); proc_exit(255); } } @@ -534,10 +557,9 @@ IpcMemoryCreate(IpcMemoryKey memKey, uint32 size, int permission) if (shmid < 0) { - fprintf(stderr, "IpcMemoryCreate: memKey=%d , size=%d , permission=%d", - memKey, size, permission); - perror("IpcMemoryCreate: shmget(..., create, ...) failed"); - IpcConfigTip(); + EPRINTF("IpcMemoryCreate: shmget failed (%s) " + "key=%d, size=%d, permission=%o", + strerror(errno), memKey, size, permission); return (IpcMemCreationFailed); } @@ -560,10 +582,9 @@ IpcMemoryIdGet(IpcMemoryKey memKey, uint32 size) if (shmid < 0) { - fprintf(stderr, "IpcMemoryIdGet: memKey=%d , size=%d , permission=%d", - memKey, size, 0); - perror("IpcMemoryIdGet: shmget() failed"); - IpcConfigTip(); + EPRINTF("IpcMemoryIdGet: shmget failed (%s) " + "key=%d, size=%d, permission=%o", + strerror(errno), memKey, size, 0); return (IpcMemIdGetFailed); } @@ -602,8 +623,8 @@ IpcMemoryAttach(IpcMemoryId memId) /* if ( *memAddress == -1) { XXX ??? */ if (memAddress == (char *) -1) { - perror("IpcMemoryAttach: shmat() failed"); - IpcConfigTip(); + EPRINTF("IpcMemoryAttach: shmat failed (%s) id=%d", + strerror(errno), memId); return (IpcMemAttachFailed); } diff --git a/src/backend/storage/ipc/spin.c b/src/backend/storage/ipc/spin.c index 40735a8786a..7f8986e411a 100644 --- a/src/backend/storage/ipc/spin.c +++ b/src/backend/storage/ipc/spin.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/ipc/Attic/spin.c,v 1.14 1998/06/27 15:47:45 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/ipc/Attic/spin.c,v 1.15 1998/08/25 21:34:03 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -31,6 +31,7 @@ #include "storage/shmem.h" #include "storage/spin.h" #include "storage/proc.h" +#include "utils/trace.h" #ifndef HAS_TEST_AND_SET #include <sys/sem.h> @@ -81,10 +82,12 @@ InitSpinLocks(int init, IPCKey key) } #ifdef LOCKDEBUG -#define PRINT_LOCK(LOCK) printf("(locklock = %d, flag = %d, nshlocks = %d, \ -shlock = %d, exlock =%d)\n", LOCK->locklock, \ - LOCK->flag, LOCK->nshlocks, LOCK->shlock, \ - LOCK->exlock) +#define PRINT_LOCK(LOCK) \ + TPRINTF(TRACE_SPINLOCKS, \ + "(locklock = %d, flag = %d, nshlocks = %d, shlock = %d, " \ + "exlock =%d)\n", LOCK->locklock, \ + LOCK->flag, LOCK->nshlocks, LOCK->shlock, \ + LOCK->exlock) #endif /* from ipc.c */ @@ -98,8 +101,7 @@ SpinAcquire(SPINLOCK lockid) /* This used to be in ipc.c, but move here to reduce function calls */ slckP = &(SLockArray[lockid]); #ifdef LOCKDEBUG - printf("SpinAcquire(%d)\n", lockid); - printf("IN: "); + TPRINTF(TRACE_SPINLOCKS, "SpinAcquire: %d", lockid); PRINT_LOCK(slckP); #endif ex_try_again: @@ -112,7 +114,7 @@ ex_try_again: S_LOCK(&(slckP->shlock)); S_UNLOCK(&(slckP->locklock)); #ifdef LOCKDEBUG - printf("OUT: "); + TPRINTF(TRACE_SPINLOCKS, "OUT: "); PRINT_LOCK(slckP); #endif break; @@ -124,6 +126,9 @@ ex_try_again: goto ex_try_again; } PROC_INCR_SLOCK(lockid); +#ifdef LOCKDEBUG + TPRINTF(TRACE_SPINLOCKS, "SpinAcquire: got %d", lockid); +#endif } void @@ -131,13 +136,23 @@ SpinRelease(SPINLOCK lockid) { SLock *slckP; - PROC_DECR_SLOCK(lockid); - /* This used to be in ipc.c, but move here to reduce function calls */ slckP = &(SLockArray[lockid]); + +#ifdef USE_ASSERT_CHECKING + /* + * Check that we are actually holding the lock we are releasing. + * This can be done only after MyProc has been initialized. + */ + if (MyProc) + Assert(MyProc->sLocks[lockid] > 0); + Assert(slckP->flag != NOLOCK); +#endif + + PROC_DECR_SLOCK(lockid); + #ifdef LOCKDEBUG - printf("SpinRelease(%d)\n", lockid); - printf("IN: "); + TPRINTF("SpinRelease: %d\n", lockid); PRINT_LOCK(slckP); #endif S_LOCK(&(slckP->locklock)); @@ -160,7 +175,7 @@ SpinRelease(SPINLOCK lockid) S_UNLOCK(&(slckP->exlock)); S_UNLOCK(&(slckP->locklock)); #ifdef LOCKDEBUG - printf("OUT: "); + TPRINTF(TRACE_SPINLOCKS, "SpinRelease: released %d", lockid); PRINT_LOCK(slckP); #endif } |