]> granicus.if.org Git - postgresql/commitdiff
Add BackendXidGetPid().
authorTatsuo Ishii <ishii@postgresql.org>
Sat, 20 Aug 2005 01:26:36 +0000 (01:26 +0000)
committerTatsuo Ishii <ishii@postgresql.org>
Sat, 20 Aug 2005 01:26:36 +0000 (01:26 +0000)
src/backend/storage/ipc/procarray.c
src/include/storage/procarray.h

index 1e2783dea80645ac86618d7cdd5f9e1e5b424a2b..87b1228ae6d184f7f46b6fa43d3493956ed6faab 100644 (file)
@@ -23,7 +23,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.4 2005/07/31 17:19:18 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.5 2005/08/20 01:26:36 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -685,6 +685,44 @@ BackendPidGetProc(int pid)
        return result;
 }
 
+/*
+ * BackendXidGetPid -- get a backend's pid given its XID
+ *
+ * Returns 0 if not found or it's a prepared transaction.  Note that
+ * it is up to the caller to be sure that the question remains
+ * meaningful for long enough for the answer to be used ...
+ * 
+ * Only main transaction Ids are considered.  This function is mainly
+ * useful for determining what backend owns a lock.
+ */
+int
+BackendXidGetPid(TransactionId xid)
+{
+       int result = 0;
+       ProcArrayStruct *arrayP = procArray;
+       int                     index;
+
+       if (xid == InvalidTransactionId)        /* never match invalid xid */
+               return 0;
+
+       LWLockAcquire(ProcArrayLock, LW_SHARED);
+
+       for (index = 0; index < arrayP->numProcs; index++)
+       {
+               PGPROC     *proc = arrayP->procs[index];
+
+               if (proc->xid == xid)
+               {
+                       result = proc->pid;
+                       break;
+               }
+       }
+
+       LWLockRelease(ProcArrayLock);
+
+       return result;
+}
+
 /*
  * IsBackendPid -- is a given pid a running backend
  */
index aa0adfec88180661452b20923b30b89ebcf18072..af1209d219265fd68c4837c906651fe88075e297 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/procarray.h,v 1.3 2005/07/31 17:19:22 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/storage/procarray.h,v 1.4 2005/08/20 01:26:29 ishii Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,6 +27,7 @@ extern bool TransactionIdIsActive(TransactionId xid);
 extern TransactionId GetOldestXmin(bool allDbs);
 
 extern PGPROC *BackendPidGetProc(int pid);
+extern int BackendXidGetPid(TransactionId xid);
 extern bool IsBackendPid(int pid);
 extern bool DatabaseHasActiveBackends(Oid databaseId, bool ignoreMyself);