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-2021, 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 */ 33 extern PGDLLIMPORT ResourceOwner CurrentResourceOwner; 34 extern PGDLLIMPORT ResourceOwner CurTransactionResourceOwner; 35 extern PGDLLIMPORT ResourceOwner TopTransactionResourceOwner; 36 extern 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 */ 46 typedef 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 */ 57 typedef 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 */ 68 extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent, 69 const char *name); 70 extern void ResourceOwnerRelease(ResourceOwner owner, 71 ResourceReleasePhase phase, 72 bool isCommit, 73 bool isTopLevel); 74 extern void ResourceOwnerReleaseAllPlanCacheRefs(ResourceOwner owner); 75 extern void ResourceOwnerDelete(ResourceOwner owner); 76 extern ResourceOwner ResourceOwnerGetParent(ResourceOwner owner); 77 extern void ResourceOwnerNewParent(ResourceOwner owner, 78 ResourceOwner newparent); 79 extern void RegisterResourceReleaseCallback(ResourceReleaseCallback callback, 80 void *arg); 81 extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, 82 void *arg); 83 extern void CreateAuxProcessResourceOwner(void); 84 extern void ReleaseAuxProcessResources(bool isCommit); 85 86 #endif /* RESOWNER_H */ 87