/* * MarkAsPrepared * Mark the GXACT as fully valid, and enter it into the global ProcArray. */ static void MarkAsPrepared(GlobalTransaction gxact) { /* Lock here may be overkill, but I'm not convinced of that ... */ LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE); Assert(!gxact->valid); gxact->valid = true; LWLockRelease(TwoPhaseStateLock); /* * Put it into the global ProcArray so TransactionIdIsInProgress considers * the XID as still running. */ ProcArrayAdd(&gxact->proc); }
/* * InitProcessPhase2 -- make MyProc visible in the shared ProcArray. * * This is separate from InitProcess because we can't acquire LWLocks until * we've created a PGPROC, but in the EXEC_BACKEND case ProcArrayAdd won't * work until after we've done CreateSharedMemoryAndSemaphores. */ void InitProcessPhase2(void) { Assert(MyProc != NULL); /* * Add our PGPROC to the PGPROC array in shared memory. */ ProcArrayAdd(MyProc); /* * Arrange to clean that up at backend exit. */ on_shmem_exit(RemoveProcFromArray, 0); }
/* * InitProcessPhase2 -- make MyProc visible in the shared ProcArray. * * This is separate from InitProcess because we can't acquire LWLocks until * we've created a PGPROC, but in the EXEC_BACKEND case there is a good deal * of stuff to be done before this step that will require LWLock access. */ void InitProcessPhase2(void) { Assert(MyProc != NULL); /* * We should now know what database we're in, so advertise that. (We need * not do any locking here, since no other backend can yet see our * PGPROC.) */ Assert(OidIsValid(MyDatabaseId)); MyProc->databaseId = MyDatabaseId; /* * Add our PGPROC to the PGPROC array in shared memory. */ ProcArrayAdd(MyProc); /* * Arrange to clean that up at backend exit. */ on_shmem_exit(RemoveProcFromArray, 0); }