|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* lmgr.h
|
|
|
|
* POSTGRES lock manager definitions.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
|
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
|
|
*
|
|
|
|
* $PostgreSQL: pgsql/src/include/storage/lmgr.h,v 1.47 2005/04/29 22:28:24 tgl Exp $
|
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
#ifndef LMGR_H
|
|
|
|
#define LMGR_H
|
|
|
|
|
|
|
|
#include "storage/lock.h"
|
|
|
|
#include "utils/rel.h"
|
|
|
|
|
|
|
|
/* These are the valid values of type LOCKMODE: */
|
|
|
|
|
|
|
|
/* NoLock is not a lock mode, but a flag value meaning "don't get a lock" */
|
|
|
|
#define NoLock 0
|
|
|
|
|
|
|
|
#define AccessShareLock 1 /* SELECT */
|
|
|
|
#define RowShareLock 2 /* SELECT FOR UPDATE/FOR SHARE */
|
|
|
|
#define RowExclusiveLock 3 /* INSERT, UPDATE, DELETE */
|
|
|
|
#define ShareUpdateExclusiveLock 4 /* VACUUM (non-FULL) */
|
|
|
|
#define ShareLock 5 /* CREATE INDEX */
|
|
|
|
#define ShareRowExclusiveLock 6 /* like EXCLUSIVE MODE, but allows
|
|
|
|
* ROW SHARE */
|
|
|
|
#define ExclusiveLock 7 /* blocks ROW SHARE/SELECT...FOR
|
|
|
|
* UPDATE */
|
|
|
|
#define AccessExclusiveLock 8 /* ALTER TABLE, DROP TABLE, VACUUM
|
|
|
|
* FULL, and unqualified LOCK
|
|
|
|
* TABLE */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Note: all lock mode numbers must be less than lock.h's MAX_LOCKMODES,
|
|
|
|
* so increase that if you want to add more modes.
|
|
|
|
*/
|
|
|
|
|
Try to reduce confusion about what is a lock method identifier, a lock
method control structure, or a table of control structures.
. Use type LOCKMASK where an int is not a counter.
. Get rid of INVALID_TABLEID, use INVALID_LOCKMETHOD instead.
. Use INVALID_LOCKMETHOD instead of (LOCKMETHOD) NULL, because
LOCKMETHOD is not a pointer.
. Define and use macro LockMethodIsValid.
. Rename LOCKMETHOD to LOCKMETHODID.
. Remove global variable LongTermTableId in lmgr.c, because it is
never used.
. Make LockTableId static in lmgr.c, because it is used nowhere else.
Why not remove it and use DEFAULT_LOCKMETHOD?
. Rename the lock method control structure from LOCKMETHODTABLE to
LockMethodData. Introduce a pointer type named LockMethod.
. Remove elog(FATAL) after InitLockTable() call in
CreateSharedMemoryAndSemaphores(), because if something goes wrong,
there is elog(FATAL) in LockMethodTableInit(), and if this doesn't
help, an elog(ERROR) in InitLockTable() is promoted to FATAL.
. Make InitLockTable() void, because its only caller does not use its
return value any more.
. Rename variables in lock.c to avoid statements like
LockMethodTable[NumLockMethods] = lockMethodTable;
lockMethodTable = LockMethodTable[lockmethod];
. Change LOCKMETHODID type to uint16 to fit into struct LOCKTAG.
. Remove static variables BITS_OFF and BITS_ON from lock.c, because
I agree to this doubt:
* XXX is a fetch from a static array really faster than a shift?
. Define and use macros LOCKBIT_ON/OFF.
Manfred Koizar
22 years ago
|
|
|
extern void InitLockTable(int maxBackends);
|
|
|
|
extern void RelationInitLockInfo(Relation relation);
|
|
|
|
|
|
|
|
/* Lock a relation */
|
|
|
|
extern void LockRelation(Relation relation, LOCKMODE lockmode);
|
|
|
|
extern bool ConditionalLockRelation(Relation relation, LOCKMODE lockmode);
|
|
|
|
extern void UnlockRelation(Relation relation, LOCKMODE lockmode);
|
|
|
|
|
|
|
|
extern void LockRelationForSession(LockRelId *relid, LOCKMODE lockmode);
|
|
|
|
extern void UnlockRelationForSession(LockRelId *relid, LOCKMODE lockmode);
|
|
|
|
|
|
|
|
/* Lock a relation for extension */
|
|
|
|
extern void LockRelationForExtension(Relation relation, LOCKMODE lockmode);
|
|
|
|
extern void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode);
|
|
|
|
|
|
|
|
/* Lock a page (currently only used within indexes) */
|
|
|
|
extern void LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);
|
|
|
|
extern bool ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);
|
|
|
|
extern void UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);
|
|
|
|
|
|
|
|
/* Lock an XID (used to wait for a transaction to finish) */
|
|
|
|
extern void XactLockTableInsert(TransactionId xid);
|
|
|
|
extern void XactLockTableDelete(TransactionId xid);
|
|
|
|
extern void XactLockTableWait(TransactionId xid);
|
|
|
|
|
|
|
|
#endif /* LMGR_H */
|