1 /*-------------------------------------------------------------------------
4 * POSTGRES resource owner definitions.
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.
12 * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
13 * Portions Copyright (c) 1994, Regents of the University of California
15 * src/include/utils/resowner.h
17 *-------------------------------------------------------------------------
24 * ResourceOwner objects are an opaque data structure known only within
27 typedef struct ResourceOwnerData *ResourceOwner;
31 * Globally known ResourceOwners
33 extern PGDLLIMPORT ResourceOwner CurrentResourceOwner;
34 extern PGDLLIMPORT ResourceOwner CurTransactionResourceOwner;
35 extern PGDLLIMPORT ResourceOwner TopTransactionResourceOwner;
38 * Resource releasing is done in three phases: pre-locks, locks, and
39 * post-locks. The pre-lock phase must release any resources that are
40 * visible to other backends (such as pinned buffers); this ensures that
41 * when we release a lock that another backend may be waiting on, it will
42 * see us as being fully out of our transaction. The post-lock phase
43 * should be used for backend-internal cleanup.
47 RESOURCE_RELEASE_BEFORE_LOCKS,
48 RESOURCE_RELEASE_LOCKS,
49 RESOURCE_RELEASE_AFTER_LOCKS
50 } ResourceReleasePhase;
53 * Dynamically loaded modules can get control during ResourceOwnerRelease
54 * by providing a callback of this form.
56 typedef void (*ResourceReleaseCallback) (ResourceReleasePhase phase,
63 * Functions in resowner.c
66 /* generic routines */
67 extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent,
69 extern void ResourceOwnerRelease(ResourceOwner owner,
70 ResourceReleasePhase phase,
73 extern void ResourceOwnerDelete(ResourceOwner owner);
74 extern ResourceOwner ResourceOwnerGetParent(ResourceOwner owner);
75 extern void ResourceOwnerNewParent(ResourceOwner owner,
76 ResourceOwner newparent);
77 extern void RegisterResourceReleaseCallback(ResourceReleaseCallback callback,
79 extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback,
82 #endif /* RESOWNER_H */