mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-30 05:51:38 +02:00
122 lines
4.1 KiB
C
122 lines
4.1 KiB
C
|
/*-------------------------------------------------------------------------
|
||
|
*
|
||
|
* resowner.h
|
||
|
* POSTGRES resource owner definitions.
|
||
|
*
|
||
|
* Query-lifespan resources are tracked by associating them with
|
||
|
* ResourceOwner objects. This provides a simple mechanism for ensuring
|
||
|
* that such resources are freed at the right time.
|
||
|
* See utils/resowner/README for more info.
|
||
|
*
|
||
|
*
|
||
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||
|
*
|
||
|
* $PostgreSQL: pgsql/src/include/utils/resowner.h,v 1.1 2004/07/17 03:31:47 tgl Exp $
|
||
|
*
|
||
|
*-------------------------------------------------------------------------
|
||
|
*/
|
||
|
#ifndef RESOWNER_H
|
||
|
#define RESOWNER_H
|
||
|
|
||
|
#include "storage/buf.h"
|
||
|
#include "storage/lock.h"
|
||
|
#include "utils/catcache.h"
|
||
|
#include "utils/rel.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
* ResourceOwner objects are an opaque data structure known only within
|
||
|
* resowner.c.
|
||
|
*/
|
||
|
typedef struct ResourceOwnerData *ResourceOwner;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Globally known ResourceOwners
|
||
|
*/
|
||
|
extern DLLIMPORT ResourceOwner CurrentResourceOwner;
|
||
|
extern DLLIMPORT ResourceOwner CurTransactionResourceOwner;
|
||
|
extern DLLIMPORT ResourceOwner TopTransactionResourceOwner;
|
||
|
|
||
|
/*
|
||
|
* Resource releasing is done in three phases: pre-locks, locks, and
|
||
|
* post-locks. The pre-lock phase must release any resources that are
|
||
|
* visible to other backends (such as pinned buffers); this ensures that
|
||
|
* when we release a lock that another backend may be waiting on, it will
|
||
|
* see us as being fully out of our transaction. The post-lock phase
|
||
|
* should be used for backend-internal cleanup.
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
RESOURCE_RELEASE_BEFORE_LOCKS,
|
||
|
RESOURCE_RELEASE_LOCKS,
|
||
|
RESOURCE_RELEASE_AFTER_LOCKS
|
||
|
} ResourceReleasePhase;
|
||
|
|
||
|
/*
|
||
|
* Dynamically loaded modules can get control during ResourceOwnerRelease
|
||
|
* by providing a callback of this form.
|
||
|
*/
|
||
|
typedef void (*ResourceReleaseCallback) (ResourceReleasePhase phase,
|
||
|
bool isCommit,
|
||
|
bool isTopLevel,
|
||
|
void *arg);
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Functions in resowner.c
|
||
|
*/
|
||
|
|
||
|
/* generic routines */
|
||
|
extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent,
|
||
|
const char *name);
|
||
|
extern void ResourceOwnerRelease(ResourceOwner owner,
|
||
|
ResourceReleasePhase phase,
|
||
|
bool isCommit,
|
||
|
bool isTopLevel);
|
||
|
extern void ResourceOwnerDelete(ResourceOwner owner);
|
||
|
extern void ResourceOwnerNewParent(ResourceOwner owner,
|
||
|
ResourceOwner newparent);
|
||
|
extern void RegisterResourceReleaseCallback(ResourceReleaseCallback callback,
|
||
|
void *arg);
|
||
|
extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback,
|
||
|
void *arg);
|
||
|
|
||
|
/* support for buffer refcount management */
|
||
|
extern void ResourceOwnerEnlargeBuffers(ResourceOwner owner);
|
||
|
extern void ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer);
|
||
|
extern void ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer);
|
||
|
|
||
|
/* support for lock management */
|
||
|
extern void ResourceOwnerEnlargeLocks(ResourceOwner owner);
|
||
|
extern void ResourceOwnerRememberLock(ResourceOwner owner,
|
||
|
LOCKTAG *locktag,
|
||
|
TransactionId xid,
|
||
|
LOCKMODE lockmode);
|
||
|
extern void ResourceOwnerForgetLock(ResourceOwner owner,
|
||
|
LOCKTAG *locktag,
|
||
|
TransactionId xid,
|
||
|
LOCKMODE lockmode);
|
||
|
|
||
|
/* support for catcache refcount management */
|
||
|
extern void ResourceOwnerEnlargeCatCacheRefs(ResourceOwner owner);
|
||
|
extern void ResourceOwnerRememberCatCacheRef(ResourceOwner owner,
|
||
|
HeapTuple tuple);
|
||
|
extern void ResourceOwnerForgetCatCacheRef(ResourceOwner owner,
|
||
|
HeapTuple tuple);
|
||
|
extern void ResourceOwnerEnlargeCatCacheListRefs(ResourceOwner owner);
|
||
|
extern void ResourceOwnerRememberCatCacheListRef(ResourceOwner owner,
|
||
|
CatCList *list);
|
||
|
extern void ResourceOwnerForgetCatCacheListRef(ResourceOwner owner,
|
||
|
CatCList *list);
|
||
|
|
||
|
/* support for relcache refcount management */
|
||
|
extern void ResourceOwnerEnlargeRelationRefs(ResourceOwner owner);
|
||
|
extern void ResourceOwnerRememberRelationRef(ResourceOwner owner,
|
||
|
Relation rel);
|
||
|
extern void ResourceOwnerForgetRelationRef(ResourceOwner owner,
|
||
|
Relation rel);
|
||
|
|
||
|
#endif /* RESOWNER_H */
|