#ifndef _PROC_H_
#define _PROC_H_
#include "access/clog.h"
#include "access/xlogdefs.h"
#include "lib/ilist.h"
#include "storage/latch.h"
#include "storage/lock.h"
#include "storage/pg_sema.h"
#include "storage/proclist_types.h"
#define PGPROC_MAX_CACHED_SUBXIDS 64
struct XidCache
{
TransactionId xids[PGPROC_MAX_CACHED_SUBXIDS];
};
#define PROC_IS_AUTOVACUUM 0x01
#define PROC_IN_VACUUM 0x02
#define PROC_IN_ANALYZE 0x04
#define PROC_VACUUM_FOR_WRAPAROUND 0x08
#define PROC_IN_LOGICAL_DECODING 0x10
#define PROC_RESERVED 0x20
#define PROC_VACUUM_STATE_MASK \
(PROC_IN_VACUUM | PROC_IN_ANALYZE | PROC_VACUUM_FOR_WRAPAROUND)
#define FP_LOCK_SLOTS_PER_BACKEND 16
#define INVALID_PGPROCNO PG_INT32_MAX
struct PGPROC
{
SHM_QUEUE links;
PGPROC **procgloballist;
PGSemaphore sem;
int waitStatus;
Latch procLatch;
LocalTransactionId lxid;
int pid;
int pgprocno;
BackendId backendId;
Oid databaseId;
Oid roleId;
Oid tempNamespaceId;
bool isBackgroundWorker;
bool recoveryConflictPending;
bool lwWaiting;
uint8 lwWaitMode;
proclist_node lwWaitLink;
proclist_node cvWaitLink;
LOCK *waitLock;
PROCLOCK *waitProcLock;
LOCKMODE waitLockMode;
LOCKMASK heldLocks;
bool delayChkpt;
XLogRecPtr waitLSN;
int syncRepState;
SHM_QUEUE syncRepLinks;
SHM_QUEUE myProcLocks[NUM_LOCK_PARTITIONS];
struct XidCache subxids;
bool procArrayGroupMember;
pg_atomic_uint32 procArrayGroupNext;
TransactionId procArrayGroupMemberXid;
uint32 wait_event_info;
bool clogGroupMember;
pg_atomic_uint32 clogGroupNext;
TransactionId clogGroupMemberXid;
XidStatus clogGroupMemberXidStatus;
int clogGroupMemberPage;
XLogRecPtr clogGroupMemberLsn;
LWLock fpInfoLock;
uint64 fpLockBits;
Oid fpRelId[FP_LOCK_SLOTS_PER_BACKEND];
bool fpVXIDLock;
LocalTransactionId fpLocalTransactionId;
PGPROC *lockGroupLeader;
dlist_head lockGroupMembers;
dlist_node lockGroupLink;
};
extern PGDLLIMPORT PGPROC *MyProc;
extern PGDLLIMPORT struct PGXACT *MyPgXact;
typedef struct PGXACT
{
TransactionId xid;
TransactionId xmin;
uint8 vacuumFlags;
bool overflowed;
uint8 nxids;
} PGXACT;
typedef struct PROC_HDR
{
PGPROC *allProcs;
PGXACT *allPgXact;
uint32 allProcCount;
PGPROC *freeProcs;
PGPROC *autovacFreeProcs;
PGPROC *bgworkerFreeProcs;
PGPROC *walsenderFreeProcs;
pg_atomic_uint32 procArrayGroupFirst;
pg_atomic_uint32 clogGroupFirst;
Latch *walwriterLatch;
Latch *checkpointerLatch;
int spins_per_delay;
PGPROC *startupProc;
int startupProcPid;
int startupBufferPinWaitBufId;
} PROC_HDR;
extern PGDLLIMPORT PROC_HDR *ProcGlobal;
extern PGPROC *PreparedXactProcs;
#define GetPGProcByNumber(n) (&ProcGlobal->allProcs[(n)])
#define NUM_AUXILIARY_PROCS 4
extern PGDLLIMPORT int DeadlockTimeout;
extern PGDLLIMPORT int StatementTimeout;
extern PGDLLIMPORT int LockTimeout;
extern PGDLLIMPORT int IdleInTransactionSessionTimeout;
extern bool log_lock_waits;
extern int ProcGlobalSemas(void);
extern Size ProcGlobalShmemSize(void);
extern void InitProcGlobal(void);
extern void InitProcess(void);
extern void InitProcessPhase2(void);
extern void InitAuxiliaryProcess(void);
extern void PublishStartupProcessInformation(void);
extern void SetStartupBufferPinWaitBufId(int bufid);
extern int GetStartupBufferPinWaitBufId(void);
extern bool HaveNFreeProcs(int n);
extern void ProcReleaseLocks(bool isCommit);
extern void ProcQueueInit(PROC_QUEUE *queue);
extern int ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);
extern PGPROC *ProcWakeup(PGPROC *proc, int waitStatus);
extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
extern void CheckDeadLockAlert(void);
extern bool IsWaitingForLock(void);
extern void LockErrorCleanup(void);
extern void ProcWaitForSignal(uint32 wait_event_info);
extern void ProcSendSignal(int pid);
extern PGPROC *AuxiliaryPidGetProc(int pid);
extern void BecomeLockGroupLeader(void);
extern bool BecomeLockGroupMember(PGPROC *leader, int pid);
#endif