mirror of
https://github.com/postgres/postgres.git
synced 2026-03-09 01:31:22 -04:00
PROCLOCK structs in shared memory now have only a bitmask for held locks, rather than counts (making them 40 bytes smaller, which is a good thing). Multiple locks within a transaction are counted in the local hash table instead, and we have provision for tracking which ResourceOwner each count belongs to. Solves recently reported problem with memory leakage within long transactions.
110 lines
3.8 KiB
C
110 lines
3.8 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.2 2004/08/27 17:07:42 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef RESOWNER_H
|
|
#define RESOWNER_H
|
|
|
|
#include "storage/buf.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 ResourceOwner ResourceOwnerGetParent(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 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 */
|