diff options
Diffstat (limited to 'src/backend/storage/lmgr/single.c')
-rw-r--r-- | src/backend/storage/lmgr/single.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/backend/storage/lmgr/single.c b/src/backend/storage/lmgr/single.c new file mode 100644 index 00000000000..8d41ea38bb6 --- /dev/null +++ b/src/backend/storage/lmgr/single.c @@ -0,0 +1,86 @@ +/*------------------------------------------------------------------------- + * + * single.c-- + * set single locks in the multi-level lock hierarchy + * + * Sometimes we don't want to set all levels of the multi-level + * lock hierarchy at once. This allows us to set and release + * one level at a time. It's useful in index scans when + * you can set an intent lock at the beginning and thereafter + * only set page locks. Tends to speed things up. + * + * Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/Attic/single.c,v 1.1.1.1 1996/07/09 06:21:57 scrappy Exp $ + * + *------------------------------------------------------------------------- + */ +#include <string.h> +#include "storage/lmgr.h" /* where the declarations go */ +#include "storage/lock.h" +#include "storage/multilev.h" +#include "utils/rel.h" + +/* + * SingleLockReln -- lock a relation + * + * Returns: TRUE if the lock can be set, FALSE otherwise. + */ +bool +SingleLockReln(LockInfo linfo, LOCKT lockt, int action) +{ + LOCKTAG tag; + + /* + * LOCKTAG has two bytes of padding, unfortunately. The + * hash function will return miss if the padding bytes aren't + * zero'd. + */ + memset(&tag,0,sizeof(tag)); + tag.relId = linfo->lRelId.relId; + tag.dbId = linfo->lRelId.dbId; + BlockIdSet(&(tag.tupleId.ip_blkid), InvalidBlockNumber); + tag.tupleId.ip_posid = InvalidOffsetNumber; + + if (action == UNLOCK) + return(LockRelease(MultiTableId, &tag, lockt)); + else + return(LockAcquire(MultiTableId, &tag, lockt)); +} + +/* + * SingleLockPage -- use multi-level lock table, but lock + * only at the page level. + * + * Assumes that an INTENT lock has already been set in the + * multi-level lock table. + * + */ +bool +SingleLockPage(LockInfo linfo, + ItemPointer tidPtr, + LOCKT lockt, + int action) +{ + LOCKTAG tag; + + /* + * LOCKTAG has two bytes of padding, unfortunately. The + * hash function will return miss if the padding bytes aren't + * zero'd. + */ + memset(&tag,0,sizeof(tag)); + tag.relId = linfo->lRelId.relId; + tag.dbId = linfo->lRelId.dbId; + BlockIdCopy(&(tag.tupleId.ip_blkid), &(tidPtr->ip_blkid)); + tag.tupleId.ip_posid = InvalidOffsetNumber; + + + if (action == UNLOCK) + return(LockRelease(MultiTableId, &tag, lockt)); + else + return(LockAcquire(MultiTableId, &tag, lockt)); +} + |