mirror of
https://github.com/postgres/postgres.git
synced 2025-10-28 11:55:03 +03:00
Invent ResourceOwner mechanism as per my recent proposal, and use it to
keep track of portal-related resources separately from transaction-related resources. This allows cursors to work in a somewhat sane fashion with nested transactions. For now, cursor behavior is non-subtransactional, that is a cursor's state does not roll back if you abort a subtransaction that fetched from the cursor. We might want to change that later.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.83 2004/07/01 00:51:43 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.84 2004/07/17 03:31:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -92,31 +92,6 @@ extern int32 *LocalRefCount;
|
||||
) \
|
||||
)
|
||||
|
||||
/*
|
||||
* IncrBufferRefCount
|
||||
* Increment the pin count on a buffer that we have *already* pinned
|
||||
* at least once.
|
||||
*
|
||||
* This macro cannot be used on a buffer we do not have pinned,
|
||||
* because it doesn't change the shared buffer state. Therefore the
|
||||
* Assert checks are for refcount > 0. Someone got this wrong once...
|
||||
*/
|
||||
#define IncrBufferRefCount(buffer) \
|
||||
( \
|
||||
BufferIsLocal(buffer) ? \
|
||||
( \
|
||||
(void) AssertMacro((buffer) >= -NLocBuffer), \
|
||||
(void) AssertMacro(LocalRefCount[-(buffer) - 1] > 0), \
|
||||
(void) LocalRefCount[-(buffer) - 1]++ \
|
||||
) \
|
||||
: \
|
||||
( \
|
||||
(void) AssertMacro(!BAD_BUFFER_ID(buffer)), \
|
||||
(void) AssertMacro(PrivateRefCount[(buffer) - 1] > 0), \
|
||||
(void) PrivateRefCount[(buffer) - 1]++ \
|
||||
) \
|
||||
)
|
||||
|
||||
/*
|
||||
* BufferGetBlock
|
||||
* Returns a reference to a disk page image associated with a buffer.
|
||||
@@ -138,6 +113,7 @@ extern int32 *LocalRefCount;
|
||||
*/
|
||||
extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);
|
||||
extern void ReleaseBuffer(Buffer buffer);
|
||||
extern void IncrBufferRefCount(Buffer buffer);
|
||||
extern void WriteBuffer(Buffer buffer);
|
||||
extern void WriteNoReleaseBuffer(Buffer buffer);
|
||||
extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,
|
||||
@@ -148,8 +124,6 @@ extern void InitBufferPoolAccess(void);
|
||||
extern char *ShowBufferUsage(void);
|
||||
extern void ResetBufferUsage(void);
|
||||
extern void AtEOXact_Buffers(bool isCommit);
|
||||
extern void AtSubStart_Buffers(void);
|
||||
extern void AtEOSubXact_Buffers(bool isCommit);
|
||||
extern void FlushBufferPool(void);
|
||||
extern BlockNumber BufferGetBlockNumber(Buffer buffer);
|
||||
extern BlockNumber RelationGetNumberOfBlocks(Relation relation);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/storage/lock.h,v 1.78 2004/07/01 00:51:43 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/storage/lock.h,v 1.79 2004/07/17 03:31:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -26,14 +26,6 @@ typedef struct PROC_QUEUE
|
||||
int size; /* number of entries in list */
|
||||
} PROC_QUEUE;
|
||||
|
||||
/* Release options for LockReleaseAll */
|
||||
typedef enum
|
||||
{
|
||||
ReleaseAll, /* All my locks */
|
||||
ReleaseAllExceptSession, /* All except session locks (Xid = 0) */
|
||||
ReleaseGivenXids /* Only locks with Xids in given array */
|
||||
} LockReleaseWhich;
|
||||
|
||||
/* struct PGPROC is declared in storage/proc.h, but must forward-reference it */
|
||||
typedef struct PGPROC PGPROC;
|
||||
|
||||
@@ -248,7 +240,7 @@ extern bool LockAcquire(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
|
||||
extern bool LockRelease(LOCKMETHODID lockmethodid, LOCKTAG *locktag,
|
||||
TransactionId xid, LOCKMODE lockmode);
|
||||
extern bool LockReleaseAll(LOCKMETHODID lockmethodid, PGPROC *proc,
|
||||
LockReleaseWhich which, int nxids, TransactionId *xids);
|
||||
bool allxids);
|
||||
extern int LockCheckConflicts(LockMethod lockMethodTable,
|
||||
LOCKMODE lockmode,
|
||||
LOCK *lock, PROCLOCK *proclock, PGPROC *proc,
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/storage/proc.h,v 1.68 2004/07/01 00:51:43 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/storage/proc.h,v 1.69 2004/07/17 03:31:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -34,7 +34,7 @@ struct PGPROC
|
||||
SHM_QUEUE links; /* list link if process is in a list */
|
||||
|
||||
PGSemaphoreData sem; /* ONE semaphore to sleep on */
|
||||
int errType; /* STATUS_OK or STATUS_ERROR after wakeup */
|
||||
int waitStatus; /* STATUS_OK or STATUS_ERROR after wakeup */
|
||||
|
||||
TransactionId xid; /* transaction currently being executed by
|
||||
* this proc */
|
||||
@@ -103,13 +103,12 @@ extern int ProcGlobalSemas(int maxBackends);
|
||||
extern void InitProcGlobal(int maxBackends);
|
||||
extern void InitProcess(void);
|
||||
extern void InitDummyProcess(int proctype);
|
||||
extern void ProcReleaseLocks(LockReleaseWhich which,
|
||||
int nxids, TransactionId *xids);
|
||||
extern void ProcReleaseLocks(bool isCommit);
|
||||
|
||||
extern void ProcQueueInit(PROC_QUEUE *queue);
|
||||
extern int ProcSleep(LockMethod lockMethodTable, LOCKMODE lockmode,
|
||||
LOCK *lock, PROCLOCK *proclock);
|
||||
extern PGPROC *ProcWakeup(PGPROC *proc, int errType);
|
||||
extern PGPROC *ProcWakeup(PGPROC *proc, int waitStatus);
|
||||
extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
|
||||
extern bool LockWaitCancel(void);
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/storage/smgr.h,v 1.45 2004/07/01 00:51:43 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/storage/smgr.h,v 1.46 2004/07/17 03:31:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -66,7 +66,6 @@ extern BlockNumber smgrtruncate(SMgrRelation reln, BlockNumber nblocks,
|
||||
extern void smgrimmedsync(SMgrRelation reln);
|
||||
extern void smgrDoPendingDeletes(bool isCommit);
|
||||
extern int smgrGetPendingDeletes(bool forCommit, RelFileNode **ptr);
|
||||
extern void AtSubStart_smgr(void);
|
||||
extern void AtSubCommit_smgr(void);
|
||||
extern void AtSubAbort_smgr(void);
|
||||
extern void smgrcommit(void);
|
||||
|
||||
Reference in New Issue
Block a user