PostgreSQL Source Code git master
Loading...
Searching...
No Matches
resowner.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ResourceOwnerDesc
 

Macros

#define RELEASE_PRIO_BUFFER_IOS   100
 
#define RELEASE_PRIO_BUFFER_PINS   200
 
#define RELEASE_PRIO_RELCACHE_REFS   300
 
#define RELEASE_PRIO_DSMS   400
 
#define RELEASE_PRIO_JIT_CONTEXTS   500
 
#define RELEASE_PRIO_CRYPTOHASH_CONTEXTS   600
 
#define RELEASE_PRIO_HMAC_CONTEXTS   700
 
#define RELEASE_PRIO_CATCACHE_REFS   100
 
#define RELEASE_PRIO_CATCACHE_LIST_REFS   200
 
#define RELEASE_PRIO_PLANCACHE_REFS   300
 
#define RELEASE_PRIO_TUPDESC_REFS   400
 
#define RELEASE_PRIO_SNAPSHOT_REFS   500
 
#define RELEASE_PRIO_FILES   600
 
#define RELEASE_PRIO_WAITEVENTSETS   700
 
#define RELEASE_PRIO_FIRST   1
 
#define RELEASE_PRIO_LAST   UINT32_MAX
 

Typedefs

typedef struct ResourceOwnerDataResourceOwner
 
typedef uint32 ResourceReleasePriority
 
typedef struct ResourceOwnerDesc ResourceOwnerDesc
 
typedef void(* ResourceReleaseCallback) (ResourceReleasePhase phase, bool isCommit, bool isTopLevel, void *arg)
 

Enumerations

enum  ResourceReleasePhase { RESOURCE_RELEASE_BEFORE_LOCKS = 1 , RESOURCE_RELEASE_LOCKS , RESOURCE_RELEASE_AFTER_LOCKS }
 

Functions

ResourceOwner ResourceOwnerCreate (ResourceOwner parent, const char *name)
 
void ResourceOwnerRelease (ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
 
void ResourceOwnerDelete (ResourceOwner owner)
 
ResourceOwner ResourceOwnerGetParent (ResourceOwner owner)
 
void ResourceOwnerNewParent (ResourceOwner owner, ResourceOwner newparent)
 
void ResourceOwnerEnlarge (ResourceOwner owner)
 
void ResourceOwnerRemember (ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
 
void ResourceOwnerForget (ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
 
void ResourceOwnerReleaseAllOfKind (ResourceOwner owner, const ResourceOwnerDesc *kind)
 
void RegisterResourceReleaseCallback (ResourceReleaseCallback callback, void *arg)
 
void UnregisterResourceReleaseCallback (ResourceReleaseCallback callback, void *arg)
 
void CreateAuxProcessResourceOwner (void)
 
void ReleaseAuxProcessResources (bool isCommit)
 
void ResourceOwnerRememberLock (ResourceOwner owner, struct LOCALLOCK *locallock)
 
void ResourceOwnerForgetLock (ResourceOwner owner, struct LOCALLOCK *locallock)
 
void ResourceOwnerRememberAioHandle (ResourceOwner owner, struct dlist_node *ioh_node)
 
void ResourceOwnerForgetAioHandle (ResourceOwner owner, struct dlist_node *ioh_node)
 

Variables

PGDLLIMPORT ResourceOwner CurrentResourceOwner
 
PGDLLIMPORT ResourceOwner CurTransactionResourceOwner
 
PGDLLIMPORT ResourceOwner TopTransactionResourceOwner
 
PGDLLIMPORT ResourceOwner AuxProcessResourceOwner
 

Macro Definition Documentation

◆ RELEASE_PRIO_BUFFER_IOS

#define RELEASE_PRIO_BUFFER_IOS   100

Definition at line 62 of file resowner.h.

◆ RELEASE_PRIO_BUFFER_PINS

#define RELEASE_PRIO_BUFFER_PINS   200

Definition at line 63 of file resowner.h.

◆ RELEASE_PRIO_CATCACHE_LIST_REFS

#define RELEASE_PRIO_CATCACHE_LIST_REFS   200

Definition at line 72 of file resowner.h.

◆ RELEASE_PRIO_CATCACHE_REFS

#define RELEASE_PRIO_CATCACHE_REFS   100

Definition at line 71 of file resowner.h.

◆ RELEASE_PRIO_CRYPTOHASH_CONTEXTS

#define RELEASE_PRIO_CRYPTOHASH_CONTEXTS   600

Definition at line 67 of file resowner.h.

◆ RELEASE_PRIO_DSMS

#define RELEASE_PRIO_DSMS   400

Definition at line 65 of file resowner.h.

◆ RELEASE_PRIO_FILES

#define RELEASE_PRIO_FILES   600

Definition at line 76 of file resowner.h.

◆ RELEASE_PRIO_FIRST

#define RELEASE_PRIO_FIRST   1

Definition at line 80 of file resowner.h.

◆ RELEASE_PRIO_HMAC_CONTEXTS

#define RELEASE_PRIO_HMAC_CONTEXTS   700

Definition at line 68 of file resowner.h.

◆ RELEASE_PRIO_JIT_CONTEXTS

#define RELEASE_PRIO_JIT_CONTEXTS   500

Definition at line 66 of file resowner.h.

◆ RELEASE_PRIO_LAST

#define RELEASE_PRIO_LAST   UINT32_MAX

Definition at line 81 of file resowner.h.

◆ RELEASE_PRIO_PLANCACHE_REFS

#define RELEASE_PRIO_PLANCACHE_REFS   300

Definition at line 73 of file resowner.h.

◆ RELEASE_PRIO_RELCACHE_REFS

#define RELEASE_PRIO_RELCACHE_REFS   300

Definition at line 64 of file resowner.h.

◆ RELEASE_PRIO_SNAPSHOT_REFS

#define RELEASE_PRIO_SNAPSHOT_REFS   500

Definition at line 75 of file resowner.h.

◆ RELEASE_PRIO_TUPDESC_REFS

#define RELEASE_PRIO_TUPDESC_REFS   400

Definition at line 74 of file resowner.h.

◆ RELEASE_PRIO_WAITEVENTSETS

#define RELEASE_PRIO_WAITEVENTSETS   700

Definition at line 77 of file resowner.h.

Typedef Documentation

◆ ResourceOwner

Definition at line 27 of file resowner.h.

◆ ResourceOwnerDesc

◆ ResourceReleaseCallback

typedef void(* ResourceReleaseCallback) (ResourceReleasePhase phase, bool isCommit, bool isTopLevel, void *arg)

Definition at line 126 of file resowner.h.

◆ ResourceReleasePriority

Definition at line 59 of file resowner.h.

Enumeration Type Documentation

◆ ResourceReleasePhase

Enumerator
RESOURCE_RELEASE_BEFORE_LOCKS 
RESOURCE_RELEASE_LOCKS 
RESOURCE_RELEASE_AFTER_LOCKS 

Definition at line 52 of file resowner.h.

53{
ResourceReleasePhase
Definition resowner.h:53
@ RESOURCE_RELEASE_LOCKS
Definition resowner.h:55
@ RESOURCE_RELEASE_BEFORE_LOCKS
Definition resowner.h:54
@ RESOURCE_RELEASE_AFTER_LOCKS
Definition resowner.h:56

Function Documentation

◆ CreateAuxProcessResourceOwner()

void CreateAuxProcessResourceOwner ( void  )
extern

Definition at line 1006 of file resowner.c.

1007{
1010 AuxProcessResourceOwner = ResourceOwnerCreate(NULL, "AuxiliaryProcess");
1012
1013 /*
1014 * Register a shmem-exit callback for cleanup of aux-process resource
1015 * owner. (This needs to run after, e.g., ShutdownXLOG.)
1016 */
1018}
#define Assert(condition)
Definition c.h:1002
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition ipc.c:372
static int fb(int x)
static void ReleaseAuxProcessResourcesCallback(int code, Datum arg)
Definition resowner.c:1051
ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char *name)
Definition resowner.c:428
ResourceOwner CurrentResourceOwner
Definition resowner.c:173
ResourceOwner AuxProcessResourceOwner
Definition resowner.c:176

References Assert, AuxProcessResourceOwner, CurrentResourceOwner, fb(), on_shmem_exit(), ReleaseAuxProcessResourcesCallback(), and ResourceOwnerCreate().

Referenced by AuxiliaryProcessMainCommon(), InitPostgres(), and InitWalSender().

◆ RegisterResourceReleaseCallback()

void RegisterResourceReleaseCallback ( ResourceReleaseCallback  callback,
void arg 
)
extern

Definition at line 968 of file resowner.c.

969{
971
975 item->callback = callback;
976 item->arg = arg;
979}
Datum arg
Definition elog.c:1323
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition mcxt.c:1235
MemoryContext TopMemoryContext
Definition mcxt.c:167
static ResourceReleaseCallbackItem * ResourceRelease_callbacks
Definition resowner.c:195
struct ResourceReleaseCallbackItem * next
Definition resowner.c:190
ResourceReleaseCallback callback
Definition resowner.c:191
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)

References arg, ResourceReleaseCallbackItem::arg, ResourceReleaseCallbackItem::callback, callback(), MemoryContextAlloc(), ResourceReleaseCallbackItem::next, ResourceRelease_callbacks, and TopMemoryContext.

◆ ReleaseAuxProcessResources()

void ReleaseAuxProcessResources ( bool  isCommit)
extern

Definition at line 1026 of file resowner.c.

1027{
1028 /*
1029 * At this writing, the only thing that could actually get released is
1030 * buffer pins; but we may as well do the full release protocol.
1031 */
1034 isCommit, true);
1037 isCommit, true);
1040 isCommit, true);
1041 /* allow it to be reused */
1044}
void ResourceOwnerRelease(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
Definition resowner.c:665

References AuxProcessResourceOwner, fb(), ResourceOwnerData::releasing, RESOURCE_RELEASE_AFTER_LOCKS, RESOURCE_RELEASE_BEFORE_LOCKS, RESOURCE_RELEASE_LOCKS, ResourceOwnerRelease(), and ResourceOwnerData::sorted.

Referenced by AutoVacLauncherMain(), BackgroundWriterMain(), CheckpointerMain(), InitPostgres(), perform_base_backup(), pgarch_archiveXlog(), ReleaseAuxProcessResourcesCallback(), UploadManifest(), WalSndErrorCleanup(), WalSummarizerMain(), and WalWriterMain().

◆ ResourceOwnerCreate()

ResourceOwner ResourceOwnerCreate ( ResourceOwner  parent,
const char name 
)
extern

Definition at line 428 of file resowner.c.

429{
430 ResourceOwner owner;
431
433 sizeof(struct ResourceOwnerData));
434 owner->name = name;
435
436 if (parent)
437 {
438 owner->parent = parent;
439 owner->nextchild = parent->firstchild;
440 parent->firstchild = owner;
441 }
442
443 dlist_init(&owner->aio_handles);
444
445 return owner;
446}
static void dlist_init(dlist_head *head)
Definition ilist.h:314
void * MemoryContextAllocZero(MemoryContext context, Size size)
Definition mcxt.c:1269
struct ResourceOwnerData * ResourceOwner
Definition resowner.h:27
ResourceOwner parent
Definition resowner.c:114
dlist_head aio_handles
Definition resowner.c:165
const char * name
Definition resowner.c:117
ResourceOwner nextchild
Definition resowner.c:116
ResourceOwner firstchild
Definition resowner.c:115
const char * name

References ResourceOwnerData::aio_handles, dlist_init(), ResourceOwnerData::firstchild, MemoryContextAllocZero(), name, ResourceOwnerData::name, ResourceOwnerData::nextchild, ResourceOwnerData::parent, and TopMemoryContext.

Referenced by AtStart_ResourceOwner(), AtSubStart_ResourceOwner(), CreateAuxProcessResourceOwner(), CreatePortal(), plpgsql_call_handler(), plpgsql_create_econtext(), plpgsql_inline_handler(), test_dsa_resowners(), test_resowner_forget_between_phases(), test_resowner_leak(), test_resowner_many(), test_resowner_priorities(), and test_resowner_remember_between_phases().

◆ ResourceOwnerDelete()

void ResourceOwnerDelete ( ResourceOwner  owner)
extern

Definition at line 878 of file resowner.c.

879{
880 /* We had better not be deleting CurrentResourceOwner ... */
882
883 /* And it better not own any resources, either */
884 Assert(owner->narr == 0);
885 Assert(owner->nhash == 0);
886 Assert(owner->nlocks == 0 || owner->nlocks == MAX_RESOWNER_LOCKS + 1);
887
888 /*
889 * Delete children. The recursive call will delink the child from me, so
890 * just iterate as long as there is a child.
891 */
892 while (owner->firstchild != NULL)
894
895 /*
896 * We delink the owner from its parent before deleting it, so that if
897 * there's an error we won't have deleted/busted owners still attached to
898 * the owner tree. Better a leak than a crash.
899 */
901
902 /* And free the object. */
903 if (owner->hash)
904 pfree(owner->hash);
905 pfree(owner);
906}
void pfree(void *pointer)
Definition mcxt.c:1619
void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent)
Definition resowner.c:921
#define MAX_RESOWNER_LOCKS
Definition resowner.c:107
void ResourceOwnerDelete(ResourceOwner owner)
Definition resowner.c:878
ResourceElem * hash
Definition resowner.c:154

References Assert, CurrentResourceOwner, fb(), ResourceOwnerData::firstchild, ResourceOwnerData::hash, MAX_RESOWNER_LOCKS, ResourceOwnerData::narr, ResourceOwnerData::nhash, ResourceOwnerData::nlocks, pfree(), ResourceOwnerDelete(), and ResourceOwnerNewParent().

Referenced by CleanupSubTransaction(), CleanupTransaction(), CommitSubTransaction(), CommitTransaction(), plpgsql_call_handler(), plpgsql_inline_handler(), PortalDrop(), PrepareTransaction(), ResourceOwnerDelete(), test_dsa_resowners(), test_resowner_leak(), test_resowner_many(), and test_resowner_priorities().

◆ ResourceOwnerEnlarge()

void ResourceOwnerEnlarge ( ResourceOwner  owner)
extern

Definition at line 459 of file resowner.c.

460{
461 /*
462 * Mustn't try to remember more resources after we have already started
463 * releasing
464 */
465 if (owner->releasing)
466 elog(ERROR, "ResourceOwnerEnlarge called after release started");
467
468 if (owner->narr < RESOWNER_ARRAY_SIZE)
469 return; /* no work needed */
470
471 /*
472 * Is there space in the hash? If not, enlarge it.
473 */
474 if (owner->narr + owner->nhash >= owner->grow_at)
475 {
476 uint32 i,
477 oldcap,
478 newcap;
481
482 oldhash = owner->hash;
483 oldcap = owner->capacity;
484
485 /* Double the capacity (it must stay a power of 2!) */
488 newcap * sizeof(ResourceElem));
489
490 /*
491 * We assume we can't fail below this point, so OK to scribble on the
492 * owner
493 */
494 owner->hash = newhash;
495 owner->capacity = newcap;
497 owner->nhash = 0;
498
499 if (oldhash != NULL)
500 {
501 /*
502 * Transfer any pre-existing entries into the new hash table; they
503 * don't necessarily go where they were before, so this simple
504 * logic is the best way.
505 */
506 for (i = 0; i < oldcap; i++)
507 {
508 if (oldhash[i].kind != NULL)
509 ResourceOwnerAddToHash(owner, oldhash[i].item, oldhash[i].kind);
510 }
511
512 /* And release old hash table. */
513 pfree(oldhash);
514 }
515 }
516
517 /* Move items from the array to the hash */
518 for (int i = 0; i < owner->narr; i++)
519 ResourceOwnerAddToHash(owner, owner->arr[i].item, owner->arr[i].kind);
520 owner->narr = 0;
521
522 Assert(owner->nhash <= owner->grow_at);
523}
uint32_t uint32
Definition c.h:683
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
int i
Definition isn.c:77
#define RESOWNER_HASH_INIT_SIZE
Definition resowner.c:79
#define RESOWNER_HASH_MAX_ITEMS(capacity)
Definition resowner.c:91
static void ResourceOwnerAddToHash(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
Definition resowner.c:242
#define RESOWNER_ARRAY_SIZE
Definition resowner.c:73
Datum item
Definition resowner.c:66
const ResourceOwnerDesc * kind
Definition resowner.c:67
ResourceElem arr[RESOWNER_ARRAY_SIZE]
Definition resowner.c:142

References ResourceOwnerData::arr, Assert, ResourceOwnerData::capacity, elog, ERROR, fb(), ResourceOwnerData::grow_at, ResourceOwnerData::hash, i, ResourceElem::item, ResourceElem::kind, MemoryContextAllocZero(), ResourceOwnerData::narr, ResourceOwnerData::nhash, pfree(), ResourceOwnerData::releasing, ResourceOwnerAddToHash(), RESOWNER_ARRAY_SIZE, RESOWNER_HASH_INIT_SIZE, RESOWNER_HASH_MAX_ITEMS, and TopMemoryContext.

Referenced by BufferAlloc(), CachedPlanAllowsSimpleValidityCheck(), CachedPlanIsSimplyValid(), CreateWaitEventSet(), dsm_create_descriptor(), dsm_unpin_mapping(), EvictAllUnpinnedBuffers(), EvictRelUnpinnedBuffers(), EvictUnpinnedBuffer(), ExtendBufferedRelLocal(), ExtendBufferedRelShared(), FlushDatabaseBuffers(), FlushRelationBuffers(), FlushRelationsAllBuffers(), GetCachedPlan(), GetLocalVictimBuffer(), GetVictimBuffer(), IncrBufferRefCount(), IncrTupleDescRefCount(), llvm_create_context(), LocalBufferAlloc(), MarkDirtyAllUnpinnedBuffers(), MarkDirtyRelUnpinnedBuffers(), MarkDirtyUnpinnedBuffer(), OpenTemporaryFile(), PathNameCreateTemporaryFile(), PathNameOpenTemporaryFile(), pg_cryptohash_create(), pg_hmac_create(), px_find_cipher(), px_find_digest(), ReadRecentBuffer(), RegisterSnapshotOnOwner(), RelationIncrementReferenceCount(), RememberManyTestResources(), SearchCatCacheInternal(), SearchCatCacheList(), SearchCatCacheMiss(), StartSharedBufferIO(), SyncOneBuffer(), test_resowner_forget_between_phases(), test_resowner_leak(), test_resowner_priorities(), and test_resowner_remember_between_phases().

◆ ResourceOwnerForget()

void ResourceOwnerForget ( ResourceOwner  owner,
Datum  value,
const ResourceOwnerDesc kind 
)
extern

Definition at line 571 of file resowner.c.

572{
573 /*
574 * Mustn't call this after we have already started releasing resources.
575 * (Release callback functions are not allowed to release additional
576 * resources.)
577 */
578 if (owner->releasing)
579 elog(ERROR, "ResourceOwnerForget called for %s after release started", kind->name);
580 Assert(!owner->sorted);
581
582 /* Search through all items in the array first. */
583 for (int i = owner->narr - 1; i >= 0; i--)
584 {
585 if (owner->arr[i].item == value &&
586 owner->arr[i].kind == kind)
587 {
588 owner->arr[i] = owner->arr[owner->narr - 1];
589 owner->narr--;
590
591#ifdef RESOWNER_STATS
593#endif
594 return;
595 }
596 }
597
598 /* Search hash */
599 if (owner->nhash > 0)
600 {
601 uint32 mask = owner->capacity - 1;
602 uint32 idx;
603
604 idx = hash_resource_elem(value, kind) & mask;
605 for (uint32 i = 0; i < owner->capacity; i++)
606 {
607 if (owner->hash[idx].item == value &&
608 owner->hash[idx].kind == kind)
609 {
610 owner->hash[idx].item = (Datum) 0;
611 owner->hash[idx].kind = NULL;
612 owner->nhash--;
613
614#ifdef RESOWNER_STATS
616#endif
617 return;
618 }
619 idx = (idx + 1) & mask;
620 }
621 }
622
623 /*
624 * Use %p to print the reference, since most objects tracked by a resource
625 * owner are pointers. It's a bit misleading if it's not a pointer, but
626 * this is a programmer error, anyway.
627 */
628 elog(ERROR, "%s %p is not owned by resource owner %s",
629 kind->name, DatumGetPointer(value), owner->name);
630}
Datum idx(PG_FUNCTION_ARGS)
Definition _int_op.c:263
static struct @175 value
uint64_t Datum
Definition postgres.h:70
static Pointer DatumGetPointer(Datum X)
Definition postgres.h:332
static uint32 hash_resource_elem(Datum value, const ResourceOwnerDesc *kind)
Definition resowner.c:222
const char * name
Definition resowner.h:93

References ResourceOwnerData::arr, Assert, ResourceOwnerData::capacity, DatumGetPointer(), elog, ERROR, fb(), ResourceOwnerData::hash, hash_resource_elem(), i, idx(), ResourceElem::item, ResourceElem::kind, ResourceOwnerData::name, ResourceOwnerDesc::name, ResourceOwnerData::narr, ResourceOwnerData::nhash, ResourceOwnerData::releasing, ResourceOwnerData::sorted, and value.

Referenced by ForgetManyTestResources(), ResourceOwnerForgetBuffer(), ResourceOwnerForgetBufferIO(), ResourceOwnerForgetCatCacheListRef(), ResourceOwnerForgetCatCacheRef(), ResourceOwnerForgetCryptoHash(), ResourceOwnerForgetDSM(), ResourceOwnerForgetFile(), ResourceOwnerForgetHMAC(), ResourceOwnerForgetJIT(), ResourceOwnerForgetOSSLCipher(), ResourceOwnerForgetOSSLDigest(), ResourceOwnerForgetPlanCacheRef(), ResourceOwnerForgetRelationRef(), ResourceOwnerForgetSnapshot(), ResourceOwnerForgetTupleDesc(), ResourceOwnerForgetWaitEventSet(), and test_resowner_forget_between_phases().

◆ ResourceOwnerForgetAioHandle()

void ResourceOwnerForgetAioHandle ( ResourceOwner  owner,
struct dlist_node ioh_node 
)
extern

Definition at line 1117 of file resowner.c.

1118{
1120}
static void dlist_delete_from(dlist_head *head, dlist_node *node)
Definition ilist.h:429

References ResourceOwnerData::aio_handles, dlist_delete_from(), and fb().

Referenced by pgaio_io_reclaim(), and pgaio_io_release_resowner().

◆ ResourceOwnerForgetLock()

void ResourceOwnerForgetLock ( ResourceOwner  owner,
struct LOCALLOCK locallock 
)
extern

Definition at line 1089 of file resowner.c.

1090{
1091 int i;
1092
1093 if (owner->nlocks > MAX_RESOWNER_LOCKS)
1094 return; /* we have overflowed */
1095
1096 Assert(owner->nlocks > 0);
1097 for (i = owner->nlocks - 1; i >= 0; i--)
1098 {
1099 if (locallock == owner->locks[i])
1100 {
1101 owner->locks[i] = owner->locks[owner->nlocks - 1];
1102 owner->nlocks--;
1103 return;
1104 }
1105 }
1106 elog(ERROR, "lock reference %p is not owned by resource owner %s",
1107 locallock, owner->name);
1108}
LOCALLOCK * locks[MAX_RESOWNER_LOCKS]
Definition resowner.c:159

References Assert, elog, ERROR, fb(), i, ResourceOwnerData::locks, MAX_RESOWNER_LOCKS, ResourceOwnerData::name, and ResourceOwnerData::nlocks.

Referenced by LockReassignOwner(), LockRelease(), LockReleaseAll(), ReleaseLockIfHeld(), and RemoveLocalLock().

◆ ResourceOwnerGetParent()

ResourceOwner ResourceOwnerGetParent ( ResourceOwner  owner)
extern

Definition at line 912 of file resowner.c.

913{
914 return owner->parent;
915}

References ResourceOwnerData::parent.

Referenced by LockReassignCurrentOwner().

◆ ResourceOwnerNewParent()

void ResourceOwnerNewParent ( ResourceOwner  owner,
ResourceOwner  newparent 
)
extern

Definition at line 921 of file resowner.c.

923{
925
926 if (oldparent)
927 {
928 if (owner == oldparent->firstchild)
930 else
931 {
932 ResourceOwner child;
933
934 for (child = oldparent->firstchild; child; child = child->nextchild)
935 {
936 if (owner == child->nextchild)
937 {
938 child->nextchild = owner->nextchild;
939 break;
940 }
941 }
942 }
943 }
944
945 if (newparent)
946 {
947 Assert(owner != newparent);
948 owner->parent = newparent;
950 newparent->firstchild = owner;
951 }
952 else
953 {
954 owner->parent = NULL;
955 owner->nextchild = NULL;
956 }
957}

References Assert, fb(), ResourceOwnerData::firstchild, ResourceOwnerData::nextchild, and ResourceOwnerData::parent.

Referenced by AtSubAbort_Portals(), AtSubCommit_Portals(), and ResourceOwnerDelete().

◆ ResourceOwnerRelease()

void ResourceOwnerRelease ( ResourceOwner  owner,
ResourceReleasePhase  phase,
bool  isCommit,
bool  isTopLevel 
)
extern

Definition at line 665 of file resowner.c.

669{
670 /* There's not currently any setup needed before recursing */
672
673#ifdef RESOWNER_STATS
674 if (isTopLevel)
675 {
676 elog(LOG, "RESOWNER STATS: lookups: array %d, hash %d",
678 narray_lookups = 0;
679 nhash_lookups = 0;
680 }
681#endif
682}
#define LOG
Definition elog.h:32
static void ResourceOwnerReleaseInternal(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
Definition resowner.c:685

References elog, fb(), LOG, and ResourceOwnerReleaseInternal().

Referenced by AbortSubTransaction(), AbortTransaction(), CommitSubTransaction(), CommitTransaction(), PortalDrop(), PrepareTransaction(), ReleaseAuxProcessResources(), test_dsa_resowners(), test_resowner_forget_between_phases(), test_resowner_leak(), test_resowner_many(), test_resowner_priorities(), and test_resowner_remember_between_phases().

◆ ResourceOwnerReleaseAllOfKind()

void ResourceOwnerReleaseAllOfKind ( ResourceOwner  owner,
const ResourceOwnerDesc kind 
)
extern

Definition at line 825 of file resowner.c.

826{
827 /* Mustn't call this after we have already started releasing resources. */
828 if (owner->releasing)
829 elog(ERROR, "ResourceOwnerForget called for %s after release started", kind->name);
830 Assert(!owner->sorted);
831
832 /*
833 * Temporarily set 'releasing', to prevent calls to ResourceOwnerRemember
834 * while we're scanning the owner. Enlarging the hash would cause us to
835 * lose track of the point we're scanning.
836 */
837 owner->releasing = true;
838
839 /* Array first */
840 for (int i = 0; i < owner->narr; i++)
841 {
842 if (owner->arr[i].kind == kind)
843 {
844 Datum value = owner->arr[i].item;
845
846 owner->arr[i] = owner->arr[owner->narr - 1];
847 owner->narr--;
848 i--;
849
850 kind->ReleaseResource(value);
851 }
852 }
853
854 /* Then hash */
855 for (int i = 0; i < owner->capacity; i++)
856 {
857 if (owner->hash[i].kind == kind)
858 {
859 Datum value = owner->hash[i].item;
860
861 owner->hash[i].item = (Datum) 0;
862 owner->hash[i].kind = NULL;
863 owner->nhash--;
864
865 kind->ReleaseResource(value);
866 }
867 }
868 owner->releasing = false;
869}
void(* ReleaseResource)(Datum res)
Definition resowner.h:108

References ResourceOwnerData::arr, Assert, ResourceOwnerData::capacity, elog, ERROR, fb(), ResourceOwnerData::hash, i, ResourceElem::item, ResourceElem::kind, ResourceOwnerDesc::name, ResourceOwnerData::narr, ResourceOwnerData::nhash, ResourceOwnerDesc::ReleaseResource, ResourceOwnerData::releasing, ResourceOwnerData::sorted, and value.

Referenced by ReleaseAllPlanCacheRefsInOwner().

◆ ResourceOwnerRemember()

void ResourceOwnerRemember ( ResourceOwner  owner,
Datum  value,
const ResourceOwnerDesc kind 
)
extern

Definition at line 531 of file resowner.c.

532{
533 uint32 idx;
534
535 /* sanity check the ResourceOwnerDesc */
536 Assert(kind->release_phase != 0);
537 Assert(kind->release_priority != 0);
538
539 /*
540 * Mustn't try to remember more resources after we have already started
541 * releasing. We already checked this in ResourceOwnerEnlarge.
542 */
543 Assert(!owner->releasing);
544 Assert(!owner->sorted);
545
546 if (owner->narr >= RESOWNER_ARRAY_SIZE)
547 {
548 /* forgot to call ResourceOwnerEnlarge? */
549 elog(ERROR, "ResourceOwnerRemember called but array was full");
550 }
551
552 /* Append to the array. */
553 idx = owner->narr;
554 owner->arr[idx].item = value;
555 owner->arr[idx].kind = kind;
556 owner->narr++;
557}
ResourceReleasePhase release_phase
Definition resowner.h:96
ResourceReleasePriority release_priority
Definition resowner.h:97

References ResourceOwnerData::arr, Assert, elog, ERROR, idx(), ResourceElem::item, ResourceElem::kind, ResourceOwnerData::narr, ResourceOwnerDesc::release_phase, ResourceOwnerDesc::release_priority, ResourceOwnerData::releasing, RESOWNER_ARRAY_SIZE, ResourceOwnerData::sorted, and value.

Referenced by RememberManyTestResources(), ResourceOwnerRememberBuffer(), ResourceOwnerRememberBufferIO(), ResourceOwnerRememberCatCacheListRef(), ResourceOwnerRememberCatCacheRef(), ResourceOwnerRememberCryptoHash(), ResourceOwnerRememberDSM(), ResourceOwnerRememberFile(), ResourceOwnerRememberHMAC(), ResourceOwnerRememberJIT(), ResourceOwnerRememberOSSLCipher(), ResourceOwnerRememberOSSLDigest(), ResourceOwnerRememberPlanCacheRef(), ResourceOwnerRememberRelationRef(), ResourceOwnerRememberSnapshot(), ResourceOwnerRememberTupleDesc(), ResourceOwnerRememberWaitEventSet(), test_resowner_forget_between_phases(), test_resowner_leak(), test_resowner_priorities(), and test_resowner_remember_between_phases().

◆ ResourceOwnerRememberAioHandle()

void ResourceOwnerRememberAioHandle ( ResourceOwner  owner,
struct dlist_node ioh_node 
)
extern

Definition at line 1111 of file resowner.c.

1112{
1114}
static void dlist_push_tail(dlist_head *head, dlist_node *node)
Definition ilist.h:364

References ResourceOwnerData::aio_handles, dlist_push_tail(), and fb().

Referenced by pgaio_io_resowner_register().

◆ ResourceOwnerRememberLock()

void ResourceOwnerRememberLock ( ResourceOwner  owner,
struct LOCALLOCK locallock 
)
extern

Definition at line 1069 of file resowner.c.

1070{
1071 Assert(locallock != NULL);
1072
1073 if (owner->nlocks > MAX_RESOWNER_LOCKS)
1074 return; /* we have already overflowed */
1075
1076 if (owner->nlocks < MAX_RESOWNER_LOCKS)
1077 owner->locks[owner->nlocks] = locallock;
1078 else
1079 {
1080 /* overflowed */
1081 }
1082 owner->nlocks++;
1083}

References Assert, fb(), ResourceOwnerData::locks, MAX_RESOWNER_LOCKS, and ResourceOwnerData::nlocks.

Referenced by GrantLockLocal(), and LockReassignOwner().

◆ UnregisterResourceReleaseCallback()

void UnregisterResourceReleaseCallback ( ResourceReleaseCallback  callback,
void arg 
)
extern

Definition at line 982 of file resowner.c.

983{
986
987 prev = NULL;
988 for (item = ResourceRelease_callbacks; item; prev = item, item = item->next)
989 {
990 if (item->callback == callback && item->arg == arg)
991 {
992 if (prev)
993 prev->next = item->next;
994 else
996 pfree(item);
997 break;
998 }
999 }
1000}

References arg, ResourceReleaseCallbackItem::arg, ResourceReleaseCallbackItem::callback, callback(), fb(), ResourceReleaseCallbackItem::next, pfree(), and ResourceRelease_callbacks.

Variable Documentation

◆ AuxProcessResourceOwner

◆ CurrentResourceOwner

PGDLLIMPORT ResourceOwner CurrentResourceOwner
extern

Definition at line 173 of file resowner.c.

Referenced by _SPI_execute_plan(), apply_spooled_messages(), AssignTransactionId(), AsyncReadBuffers(), AtAbort_ResourceOwner(), AtStart_ResourceOwner(), AtSubAbort_ResourceOwner(), AtSubStart_ResourceOwner(), attach_internal(), buffer_call_start_io(), buffer_stage_common(), BufferAlloc(), CleanupSubTransaction(), CleanupTransaction(), close_lo_relation(), CommitSubTransaction(), CommitTransaction(), create_internal(), CreateAuxProcessResourceOwner(), DecrTupleDescRefCount(), dsm_create_descriptor(), dsm_unpin_mapping(), EvictAllUnpinnedBuffers(), EvictRelUnpinnedBuffers(), EvictUnpinnedBuffer(), exec_eval_simple_expr(), exec_init_tuple_store(), exec_simple_check_plan(), exec_stmt_block(), ExecAppendAsyncEventWait(), ExplainExecuteQuery(), ExtendBufferedRelLocal(), ExtendBufferedRelShared(), extendBufFile(), FlushDatabaseBuffers(), FlushRelationBuffers(), FlushRelationsAllBuffers(), get_segment_by_index(), GetCurrentFDWTuplestore(), GetLocalVictimBuffer(), GetVictimBuffer(), handle_get(), handle_get_and_error(), handle_get_release(), handle_get_twice(), IncrBufferRefCount(), IncrTupleDescRefCount(), init_execution_state(), InitPostgres(), llvm_create_context(), LocalBufferAlloc(), lock_and_open_sequence(), LockAcquireExtended(), LockReassignCurrentOwner(), LockReassignOwner(), LockRelease(), LogicalSlotAdvanceAndCheckSnapState(), make_callstmt_target(), make_new_segment(), makeBufFileCommon(), MakeTransitionCaptureState(), MarkDirtyAllUnpinnedBuffers(), MarkDirtyRelUnpinnedBuffers(), MarkDirtyUnpinnedBuffer(), open_lo_relation(), OpenTemporaryFile(), PathNameCreateTemporaryFile(), PathNameOpenTemporaryFile(), perform_base_backup(), PersistHoldablePortal(), pg_cryptohash_create(), pg_hmac_create(), pg_logical_slot_get_changes_guts(), PinBuffer(), PinLocalBuffer(), plperl_spi_exec(), plperl_spi_exec_prepared(), plperl_spi_fetchrow(), plperl_spi_prepare(), plperl_spi_query(), plperl_spi_query_prepared(), plpgsql_estate_setup(), pltcl_func_handler(), pltcl_init_tuple_store(), pltcl_returnnext(), pltcl_SPI_execute(), pltcl_SPI_execute_plan(), pltcl_SPI_prepare(), pltcl_subtrans_abort(), pltcl_subtrans_commit(), pltcl_subtransaction(), PLy_abort_open_subtransactions(), PLy_cursor_fetch(), PLy_cursor_iternext(), PLy_cursor_plan(), PLy_cursor_query(), PLy_spi_execute_plan(), PLy_spi_execute_query(), PLy_spi_prepare(), PLy_spi_subtransaction_abort(), PLy_spi_subtransaction_commit(), PLy_subtransaction_enter(), PLy_subtransaction_exit(), PopTransaction(), PortalCleanup(), PortalRun(), PortalRunFetch(), PortalStart(), PrepareTransaction(), px_find_cipher(), px_find_digest(), read_rel_block_ll(), ReadRecentBuffer(), RegisterSnapshot(), RegisterTemporaryFile(), RelationDecrementReferenceCount(), RelationIncrementReferenceCount(), ReleaseCatCache(), ReleaseCatCacheList(), ReleaseLockIfHeld(), ReorderBufferImmediateInvalidation(), ReorderBufferProcessTXN(), repack_setup_logical_decoding(), repack_store_change(), ResourceOwnerDelete(), ResourceOwnerReleaseInternal(), SearchCatCacheInternal(), SearchCatCacheList(), SearchCatCacheMiss(), ShutdownXLOG(), SnapBuildClearExportedSnapshot(), SnapBuildExportSnapshot(), SPI_plan_get_cached_plan(), StartSharedBufferIO(), StartupXLOG(), SyncOneBuffer(), TerminateBufferIO(), test_dsa_resowners(), test_resowner_forget_between_phases(), test_resowner_leak(), test_resowner_many(), test_resowner_priorities(), test_resowner_remember_between_phases(), TrackNewBufferPin(), tuplestore_begin_common(), tuplestore_puttuple_common(), UnlockReleaseBuffer(), UnpinBuffer(), UnpinLocalBuffer(), UnregisterSnapshot(), UploadManifest(), and WaitLatchOrSocket().

◆ CurTransactionResourceOwner

◆ TopTransactionResourceOwner