| LWLocks are normally used to protect not-very-long sections of computation typedef struct LWLock { slock_t mutex; /* Protects LWLock and queue of PGPROCs */ bool releaSEOK; /* T if ok to release waiters */ char exclusive; /* # of exclusive holders (0 or 1) */ int shared; /* # of shared holders (0..MaxBackends) */ PGPROC *head; /* head of List of waiting PGPROCs */ PGPROC *tail; /* tail of List of waiting PGPROCs */ /* tail is undefined when head is NulL */ } LWLock; LWLock既可以封锁exclusive,又可以封锁shared,而且一个锁可以存在一个等待队列,队列中两种锁都可以有 lw lock 有一部分是固定的,在 lwlock.h 中 typedef enum LWLockID { BufFreeListLock, ShmemIndexLock, OIDGenLock, XIDGenLock, ProcArrayLock, SInvalReadLock, SInvalWriteLock, WAlinsertLock, WALWriteLock, ControlfileLock, CheckpointLock, CLogControlLock, SubtransControlLock, MultixactGenLock, MultixactOffsetControlLock, MultixactMemberControlLock, RelCacheInitLock, BgWriterCommlock, TwoPhaseStateLock, tablespaceCreateLock, BtreeVacuumlock, AddinShmemInitLock, autovacuumlock, autovacuumScheduleLock, SyncScanLock, /* IndivIDual lock IDs end here */ FirstBufMapPingLock, FirstLockMgrLock = FirstBufMapPingLock + NUM_BUFFER_PARTITIONS, /* must be last except for MaxDynamicLWLock: */ NumFixedLWLocks = FirstLockMgrLock + NUM_LOCK_PARTITIONS, MaxDynamicLWLock = 1000000000 } LWLockID; 余下的是可被分配的,总共有8317个,这是多个计算出来的 |
评论列表(0条)