summaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc/sinval.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2004-06-02 21:29:29 +0000
committerBruce Momjian <bruce@momjian.us>2004-06-02 21:29:29 +0000
commite8d9d68ca4866c775b5d1170581ac9e1ade3abd8 (patch)
tree1ca2cd413be5a75faa23bba21916d2bdbcf90678 /src/backend/storage/ipc/sinval.c
parentde2c66539eaabdcee94ae4f243ec6402058b1f4c (diff)
Per previous discussions, here are two functions to send INT and TERM
(cancel and terminate) signals to other backends. They permit only INT and TERM, and permits sending only to postgresql backends. Magnus Hagander
Diffstat (limited to 'src/backend/storage/ipc/sinval.c')
-rw-r--r--src/backend/storage/ipc/sinval.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c
index 570feab25e6..856d0f0a73f 100644
--- a/src/backend/storage/ipc/sinval.c
+++ b/src/backend/storage/ipc/sinval.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/ipc/sinval.c,v 1.63 2004/05/23 03:50:45 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/ipc/sinval.c,v 1.64 2004/06/02 21:29:28 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -464,6 +464,40 @@ TransactionIdIsInProgress(TransactionId xid)
}
/*
+ * IsBackendPid -- is a given pid a running backend
+ */
+bool
+IsBackendPid(int pid)
+{
+ bool result = false;
+ SISeg *segP = shmInvalBuffer;
+ ProcState *stateP = segP->procState;
+ int index;
+
+ LWLockAcquire(SInvalLock, LW_SHARED);
+
+ for (index = 0; index < segP->lastBackend; index++)
+ {
+ SHMEM_OFFSET pOffset = stateP[index].procStruct;
+
+ if (pOffset != INVALID_OFFSET)
+ {
+ PGPROC *proc = (PGPROC *) MAKE_PTR(pOffset);
+
+ if (proc->pid == pid)
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+
+ LWLockRelease(SInvalLock);
+
+ return result;
+}
+
+/*
* GetOldestXmin -- returns oldest transaction that was running
* when any current transaction was started.
*