PostgreSQL Source Code: src/include/utils/resowner.h Source File

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 */
27 typedef struct ResourceOwnerData *ResourceOwner;
28
29
30/*
31 * Globally known ResourceOwners
32 */
33extern PGDLLIMPORT ResourceOwner CurrentResourceOwner;
34extern PGDLLIMPORT ResourceOwner CurTransactionResourceOwner;
35extern PGDLLIMPORT ResourceOwner TopTransactionResourceOwner;
36extern PGDLLIMPORT ResourceOwner AuxProcessResourceOwner;
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 */
52 typedef enum
53{
54 RESOURCE_RELEASE_BEFORE_LOCKS = 1,
55 RESOURCE_RELEASE_LOCKS,
56 RESOURCE_RELEASE_AFTER_LOCKS,
57} ResourceReleasePhase;
58
59 typedef uint32 ResourceReleasePriority;
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 */
91 typedef struct ResourceOwnerDesc
92{
93 const char *name; /* name for the object kind, for debugging */
94
95 /* when are these objects released? */
96 ResourceReleasePhase release_phase;
97 ResourceReleasePriority release_priority;
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 */
108 void (*ReleaseResource) (Datum res);
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
120 } ResourceOwnerDesc;
121
122/*
123 * Dynamically loaded modules can get control during ResourceOwnerRelease
124 * by providing a callback of this form.
125 */
126 typedef void (*ResourceReleaseCallback) (ResourceReleasePhase phase,
127 bool isCommit,
128 bool isTopLevel,
129 void *arg);
130
131
132/*
133 * Functions in resowner.c
134 */
135
136/* generic routines */
137extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent,
138 const char *name);
139extern void ResourceOwnerRelease(ResourceOwner owner,
140 ResourceReleasePhase phase,
141 bool isCommit,
142 bool isTopLevel);
143extern void ResourceOwnerDelete(ResourceOwner owner);
144extern ResourceOwner ResourceOwnerGetParent(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
152extern void ResourceOwnerReleaseAllOfKind(ResourceOwner owner, const ResourceOwnerDesc *kind);
153
154extern void RegisterResourceReleaseCallback(ResourceReleaseCallback callback,
155 void *arg);
156extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback,
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/* special support for AIO */
168struct dlist_node;
169extern void ResourceOwnerRememberAioHandle(ResourceOwner owner, struct dlist_node *ioh_node);
170extern void ResourceOwnerForgetAioHandle(ResourceOwner owner, struct dlist_node *ioh_node);
171
172#endif /* RESOWNER_H */
#define PGDLLIMPORT
Definition: c.h:1319
uint32_t uint32
Definition: c.h:538
static struct @169 value
void * arg
uint64_t Datum
Definition: postgres.h:70
void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent)
Definition: resowner.c:911
void ResourceOwnerRememberLock(ResourceOwner owner, struct LOCALLOCK *locallock)
Definition: resowner.c:1059
struct ResourceOwnerDesc ResourceOwnerDesc
PGDLLIMPORT ResourceOwner TopTransactionResourceOwner
Definition: resowner.c:175
void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
Definition: resowner.c:972
ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char *name)
Definition: resowner.c:418
void ReleaseAuxProcessResources(bool isCommit)
Definition: resowner.c:1016
ResourceOwner ResourceOwnerGetParent(ResourceOwner owner)
Definition: resowner.c:902
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
void ResourceOwnerRememberAioHandle(ResourceOwner owner, struct dlist_node *ioh_node)
Definition: resowner.c:1101
PGDLLIMPORT ResourceOwner AuxProcessResourceOwner
Definition: resowner.c:176
uint32 ResourceReleasePriority
Definition: resowner.h:59
void CreateAuxProcessResourceOwner(void)
Definition: resowner.c:996
void ResourceOwnerRelease(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
Definition: resowner.c:655
PGDLLIMPORT ResourceOwner CurTransactionResourceOwner
Definition: resowner.c:174
void ResourceOwnerForgetLock(ResourceOwner owner, struct LOCALLOCK *locallock)
Definition: resowner.c:1079
void RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
Definition: resowner.c:958
void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
Definition: resowner.c:561
void ResourceOwnerReleaseAllOfKind(ResourceOwner owner, const ResourceOwnerDesc *kind)
Definition: resowner.c:815
void ResourceOwnerDelete(ResourceOwner owner)
Definition: resowner.c:868
PGDLLIMPORT ResourceOwner CurrentResourceOwner
Definition: resowner.c:173
struct ResourceOwnerData * ResourceOwner
Definition: resowner.h:27
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
Definition: resowner.c:521
void ResourceOwnerForgetAioHandle(ResourceOwner owner, struct dlist_node *ioh_node)
Definition: resowner.c:1107
void(* ResourceReleaseCallback)(ResourceReleasePhase phase, bool isCommit, bool isTopLevel, void *arg)
Definition: resowner.h:126
void ResourceOwnerEnlarge(ResourceOwner owner)
Definition: resowner.c:449
Definition: lock.h:429
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
Definition: ilist.h:138
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
Definition: test_ifaddrs.c:46
const char * name

AltStyle によって変換されたページ (->オリジナル) /