aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/resowner/resowner.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/resowner/resowner.c')
-rw-r--r--src/backend/utils/resowner/resowner.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c
index e3835971d91..05bd9b5ab5c 100644
--- a/src/backend/utils/resowner/resowner.c
+++ b/src/backend/utils/resowner/resowner.c
@@ -14,7 +14,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/resowner/resowner.c,v 1.2 2004/07/31 00:45:40 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/resowner/resowner.c,v 1.3 2004/08/25 18:43:43 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -277,25 +277,40 @@ ResourceOwnerReleaseInternal(ResourceOwner owner,
/* Mark object as holding no locks, just for sanity */
owner->nlocks = 0;
}
- else if (!isCommit)
+ else
{
/*
* Release locks retail. Note that LockRelease will remove
* the lock entry from my list, so I just have to iterate till
* there are none. Also note that if we are committing a
- * subtransaction, we do NOT release its locks yet.
+ * subtransaction, we do NOT release its locks yet, but transfer
+ * them to the parent.
*
* XXX as above, this is a bit inefficient but probably not worth
* the trouble to optimize more.
*/
+ Assert(owner->parent != NULL);
while (owner->nlocks > 0)
{
LockIdData *lockid = &owner->locks[owner->nlocks - 1];
- LockRelease(lockid->locktag.lockmethodid,
- &lockid->locktag,
- lockid->xid,
- lockid->lockmode);
+ if (isCommit)
+ {
+ ResourceOwnerEnlargeLocks(owner->parent);
+ ResourceOwnerRememberLock(owner->parent,
+ &lockid->locktag,
+ lockid->xid,
+ lockid->lockmode);
+ owner->nlocks--;
+ }
+ else
+ {
+ LockRelease(lockid->locktag.lockmethodid,
+ &lockid->locktag,
+ lockid->xid,
+ lockid->lockmode);
+ /* LockRelease will have removed the entry from list */
+ }
}
}
}