resowner.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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-2022, 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. * ResourceOwner objects are an opaque data structure known only within
  23. * resowner.c.
  24. */
  25. typedef struct ResourceOwnerData *ResourceOwner;
  26. /*
  27. * Globally known ResourceOwners
  28. */
  29. extern PGDLLIMPORT ResourceOwner CurrentResourceOwner;
  30. extern PGDLLIMPORT ResourceOwner CurTransactionResourceOwner;
  31. extern PGDLLIMPORT ResourceOwner TopTransactionResourceOwner;
  32. extern PGDLLIMPORT ResourceOwner AuxProcessResourceOwner;
  33. /*
  34. * Resource releasing is done in three phases: pre-locks, locks, and
  35. * post-locks. The pre-lock phase must release any resources that are
  36. * visible to other backends (such as pinned buffers); this ensures that
  37. * when we release a lock that another backend may be waiting on, it will
  38. * see us as being fully out of our transaction. The post-lock phase
  39. * should be used for backend-internal cleanup.
  40. */
  41. typedef enum
  42. {
  43. RESOURCE_RELEASE_BEFORE_LOCKS,
  44. RESOURCE_RELEASE_LOCKS,
  45. RESOURCE_RELEASE_AFTER_LOCKS
  46. } ResourceReleasePhase;
  47. /*
  48. * Dynamically loaded modules can get control during ResourceOwnerRelease
  49. * by providing a callback of this form.
  50. */
  51. typedef void (*ResourceReleaseCallback) (ResourceReleasePhase phase,
  52. bool isCommit,
  53. bool isTopLevel,
  54. void *arg);
  55. /*
  56. * Functions in resowner.c
  57. */
  58. /* generic routines */
  59. extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent,
  60. const char *name);
  61. extern void ResourceOwnerRelease(ResourceOwner owner,
  62. ResourceReleasePhase phase,
  63. bool isCommit,
  64. bool isTopLevel);
  65. extern void ResourceOwnerReleaseAllPlanCacheRefs(ResourceOwner owner);
  66. extern void ResourceOwnerDelete(ResourceOwner owner);
  67. extern ResourceOwner ResourceOwnerGetParent(ResourceOwner owner);
  68. extern void ResourceOwnerNewParent(ResourceOwner owner,
  69. ResourceOwner newparent);
  70. extern void RegisterResourceReleaseCallback(ResourceReleaseCallback callback,
  71. void *arg);
  72. extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback,
  73. void *arg);
  74. extern void CreateAuxProcessResourceOwner(void);
  75. extern void ReleaseAuxProcessResources(bool isCommit);
  76. #endif /* RESOWNER_H */