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-2017, 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 37 /* 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. 44 */ 45 typedef enum 46 { 47 RESOURCE_RELEASE_BEFORE_LOCKS, 48 RESOURCE_RELEASE_LOCKS, 49 RESOURCE_RELEASE_AFTER_LOCKS 50 } ResourceReleasePhase; 51 52 /* 53 * Dynamically loaded modules can get control during ResourceOwnerRelease 54 * by providing a callback of this form. 55 */ 56 typedef void (*ResourceReleaseCallback) (ResourceReleasePhase phase, 57 bool isCommit, 58 bool isTopLevel, 59 void *arg); 60 61 62 /* 63 * Functions in resowner.c 64 */ 65 66 /* generic routines */ 67 extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent, 68 const char *name); 69 extern void ResourceOwnerRelease(ResourceOwner owner, 70 ResourceReleasePhase phase, 71 bool isCommit, 72 bool isTopLevel); 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, 78 void *arg); 79 extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, 80 void *arg); 81 82 #endif /* RESOWNER_H */ 83