PostgreSQL Source Code git master
resowner.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * resowner.h
4 * POSTGRES resource owner definitions.
5 *
6 * Query-lifespan resources are tracked by associating them with
7 * ResourceOwner objects. This provides a simple mechanism for ensuring
8 * that such resources are freed at the right time.
9 * See utils/resowner/README for more info.
10 *
11 *
12 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
13 * Portions Copyright (c) 1994, Regents of the University of California
14 *
15 * src/include/utils/resowner.h
16 *
17 *-------------------------------------------------------------------------
18 */
19#ifndef RESOWNER_H
20#define RESOWNER_H
21
22
23/*
24 * ResourceOwner objects are an opaque data structure known only within
25 * resowner.c.
26 */
28
29
30/*
31 * Globally known ResourceOwners
32 */
37
38/*
39 * Resource releasing is done in three phases: pre-locks, locks, and
40 * post-locks. The pre-lock phase must release any resources that are visible
41 * to other backends (such as pinned buffers); this ensures that when we
42 * release a lock that another backend may be waiting on, it will see us as
43 * being fully out of our transaction. The post-lock phase should be used for
44 * backend-internal cleanup.
45 *
46 * Within each phase, resources are released in priority order. Priority is
47 * just an integer specified in ResourceOwnerDesc. The priorities of built-in
48 * resource types are given below, extensions may use any priority relative to
49 * those or RELEASE_PRIO_FIRST/LAST. RELEASE_PRIO_FIRST is a fine choice if
50 * your resource doesn't depend on any other resources.
51 */
52typedef enum
53{
58
60
61/* priorities of built-in BEFORE_LOCKS resources */
62#define RELEASE_PRIO_BUFFER_IOS 100
63#define RELEASE_PRIO_BUFFER_PINS 200
64#define RELEASE_PRIO_RELCACHE_REFS 300
65#define RELEASE_PRIO_DSMS 400
66#define RELEASE_PRIO_JIT_CONTEXTS 500
67#define RELEASE_PRIO_CRYPTOHASH_CONTEXTS 600
68#define RELEASE_PRIO_HMAC_CONTEXTS 700
69
70/* priorities of built-in AFTER_LOCKS resources */
71#define RELEASE_PRIO_CATCACHE_REFS 100
72#define RELEASE_PRIO_CATCACHE_LIST_REFS 200
73#define RELEASE_PRIO_PLANCACHE_REFS 300
74#define RELEASE_PRIO_TUPDESC_REFS 400
75#define RELEASE_PRIO_SNAPSHOT_REFS 500
76#define RELEASE_PRIO_FILES 600
77#define RELEASE_PRIO_WAITEVENTSETS 700
78
79/* 0 is considered invalid */
80#define RELEASE_PRIO_FIRST 1
81#define RELEASE_PRIO_LAST UINT32_MAX
82
83/*
84 * In order to track an object, resowner.c needs a few callbacks for it.
85 * The callbacks for resources of a specific kind are encapsulated in
86 * ResourceOwnerDesc.
87 *
88 * Note that the callbacks occur post-commit or post-abort, so the callback
89 * functions can only do noncritical cleanup and must not fail.
90 */
91typedef struct ResourceOwnerDesc
92{
93 const char *name; /* name for the object kind, for debugging */
94
95 /* when are these objects released? */
98
99 /*
100 * Release resource.
101 *
102 * This is called for each resource in the resource owner, in the order
103 * specified by 'release_phase' and 'release_priority' when the whole
104 * resource owner is been released or when ResourceOwnerReleaseAllOfKind()
105 * is called. The resource is implicitly removed from the owner, the
106 * callback function doesn't need to call ResourceOwnerForget.
107 */
109
110 /*
111 * Format a string describing the resource, for debugging purposes. If a
112 * resource has not been properly released before commit, this is used to
113 * print a WARNING.
114 *
115 * This can be left to NULL, in which case a generic "[resource name]: %p"
116 * format is used.
117 */
118 char *(*DebugPrint) (Datum res);
119
121
122/*
123 * Dynamically loaded modules can get control during ResourceOwnerRelease
124 * by providing a callback of this form.
125 */
127 bool isCommit,
128 bool isTopLevel,
129 void *arg);
130
131
132/*
133 * Functions in resowner.c
134 */
135
136/* generic routines */
138 const char *name);
139extern void ResourceOwnerRelease(ResourceOwner owner,
141 bool isCommit,
142 bool isTopLevel);
143extern void ResourceOwnerDelete(ResourceOwner owner);
145extern void ResourceOwnerNewParent(ResourceOwner owner,
146 ResourceOwner newparent);
147
148extern void ResourceOwnerEnlarge(ResourceOwner owner);
149extern void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind);
150extern void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind);
151
153
155 void *arg);
157 void *arg);
158
159extern void CreateAuxProcessResourceOwner(void);
160extern void ReleaseAuxProcessResources(bool isCommit);
161
162/* special support for local lock management */
163struct LOCALLOCK;
164extern void ResourceOwnerRememberLock(ResourceOwner owner, struct LOCALLOCK *locallock);
165extern void ResourceOwnerForgetLock(ResourceOwner owner, struct LOCALLOCK *locallock);
166
167#endif /* RESOWNER_H */
#define PGDLLIMPORT
Definition: c.h:1274
uint32_t uint32
Definition: c.h:485
static struct @161 value
void * arg
uintptr_t Datum
Definition: postgres.h:64
void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent)
Definition: resowner.c:897
void ResourceOwnerRememberLock(ResourceOwner owner, struct LOCALLOCK *locallock)
Definition: resowner.c:1045
struct ResourceOwnerDesc ResourceOwnerDesc
PGDLLIMPORT ResourceOwner TopTransactionResourceOwner
Definition: resowner.c:167
void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
Definition: resowner.c:958
ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char *name)
Definition: resowner.c:413
void ReleaseAuxProcessResources(bool isCommit)
Definition: resowner.c:1002
ResourceOwner ResourceOwnerGetParent(ResourceOwner owner)
Definition: resowner.c:888
ResourceReleasePhase
Definition: resowner.h:53
@ RESOURCE_RELEASE_LOCKS
Definition: resowner.h:55
@ RESOURCE_RELEASE_BEFORE_LOCKS
Definition: resowner.h:54
@ RESOURCE_RELEASE_AFTER_LOCKS
Definition: resowner.h:56
PGDLLIMPORT ResourceOwner AuxProcessResourceOwner
Definition: resowner.c:168
uint32 ResourceReleasePriority
Definition: resowner.h:59
void CreateAuxProcessResourceOwner(void)
Definition: resowner.c:982
void ResourceOwnerRelease(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
Definition: resowner.c:648
PGDLLIMPORT ResourceOwner CurTransactionResourceOwner
Definition: resowner.c:166
void ResourceOwnerForgetLock(ResourceOwner owner, struct LOCALLOCK *locallock)
Definition: resowner.c:1065
void RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
Definition: resowner.c:944
void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
Definition: resowner.c:554
void ResourceOwnerReleaseAllOfKind(ResourceOwner owner, const ResourceOwnerDesc *kind)
Definition: resowner.c:801
void ResourceOwnerDelete(ResourceOwner owner)
Definition: resowner.c:854
PGDLLIMPORT ResourceOwner CurrentResourceOwner
Definition: resowner.c:165
struct ResourceOwnerData * ResourceOwner
Definition: resowner.h:27
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
Definition: resowner.c:514
void(* ResourceReleaseCallback)(ResourceReleasePhase phase, bool isCommit, bool isTopLevel, void *arg)
Definition: resowner.h:126
void ResourceOwnerEnlarge(ResourceOwner owner)
Definition: resowner.c:442
ResourceReleasePhase release_phase
Definition: resowner.h:96
void(* ReleaseResource)(Datum res)
Definition: resowner.h:108
ResourceReleasePriority release_priority
Definition: resowner.h:97
const char * name
Definition: resowner.h:93
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
Definition: test_ifaddrs.c:46
const char * name