Add BackendXidGetPid().
authorTatsuo Ishii
Sat, 20 Aug 2005 01:26:36 +0000 (01:26 +0000)
committerTatsuo Ishii
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);