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-2019, 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 */
27typedef 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
41 * visible to other backends (such as pinned buffers); this ensures that
42 * when we release a lock that another backend may be waiting on, it will
43 * see us as being fully out of our transaction. The post-lock phase
44 * should be used for backend-internal cleanup.
45 */
46typedef enum
47{
48 RESOURCE_RELEASE_BEFORE_LOCKS,
49 RESOURCE_RELEASE_LOCKS,
50 RESOURCE_RELEASE_AFTER_LOCKS
51} ResourceReleasePhase;
52
53/*
54 * Dynamically loaded modules can get control during ResourceOwnerRelease
55 * by providing a callback of this form.
56 */
57typedef void (*ResourceReleaseCallback) (ResourceReleasePhase phase,
58 bool isCommit,
59 bool isTopLevel,
60 void *arg);
61
62
63/*
64 * Functions in resowner.c
65 */
66
67/* generic routines */
68extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent,
69 const char *name);
70extern void ResourceOwnerRelease(ResourceOwner owner,
71 ResourceReleasePhase phase,
72 bool isCommit,
73 bool isTopLevel);
74extern void ResourceOwnerDelete(ResourceOwner owner);
75extern ResourceOwner ResourceOwnerGetParent(ResourceOwner owner);
76extern void ResourceOwnerNewParent(ResourceOwner owner,
77 ResourceOwner newparent);
78extern void RegisterResourceReleaseCallback(ResourceReleaseCallback callback,
79 void *arg);
80extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback,
81 void *arg);
82extern void CreateAuxProcessResourceOwner(void);
83extern void ReleaseAuxProcessResources(bool isCommit);
84
85#endif /* RESOWNER_H */
86