微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgreSQL 的 lightweight lock

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个,这是多个计算出来的

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐