resowner.h 2.5 KB

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