43 #define FileGetDatum(file) Int32GetDatum(file) 44 #define DatumGetFile(datum) ((File) DatumGetInt32(datum)) 45 #define BufferGetDatum(buffer) Int32GetDatum(buffer) 46 #define DatumGetBuffer(datum) ((Buffer) DatumGetInt32(datum)) 78 #define RESARRAY_INIT_SIZE 16 83 #define RESARRAY_MAX_ARRAY 64 84 #define RESARRAY_IS_ARRAY(resarr) ((resarr)->capacity <= RESARRAY_MAX_ARRAY) 90 #define RESARRAY_MAX_ITEMS(capacity) \ 91 ((capacity) <= RESARRAY_MAX_ARRAY ? (capacity) : (capacity)/4 * 3) 109 #define MAX_RESOWNER_LOCKS 15 228 newcap *
sizeof(
Datum));
229 for (i = 0; i < newcap; i++)
238 if (olditemsarr != NULL)
247 for (i = 0; i < oldcap; i++)
288 idx = (idx + 1) & mask;
315 if (lastidx < resarr->
nitems &&
324 for (i = 0; i < resarr->
nitems; i++)
348 for (i = 0; i < resarr->
capacity; i++)
356 idx = (idx + 1) & mask;
511 CurrentResourceOwner = owner;
581 if (owner == TopTransactionResourceOwner)
610 locks = owner->
locks;
690 for (item = ResourceRelease_callbacks; item; item = item->
next)
691 item->
callback(phase, isCommit, isTopLevel, item->
arg);
693 CurrentResourceOwner = save;
726 Assert(owner != CurrentResourceOwner);
811 Assert(owner != newparent);
812 owner->
parent = newparent;
843 ResourceRelease_callbacks = item;
853 for (item = ResourceRelease_callbacks; item; prev = item, item = item->
next)
855 if (item->callback == callback && item->arg == arg)
860 ResourceRelease_callbacks = item->
next;
873 Assert(AuxProcessResourceOwner == NULL);
874 Assert(CurrentResourceOwner == NULL);
916 bool isCommit = (code == 0);
955 elog(
ERROR,
"buffer %d is not owned by resource owner %s",
956 buffer, owner->
name);
972 Assert(locallock != NULL);
998 for (i = owner->
nlocks - 1; i >= 0; i--)
1000 if (locallock == owner->
locks[i])
1007 elog(
ERROR,
"lock reference %p is not owned by resource owner %s",
1008 locallock, owner->
name);
1042 elog(
ERROR,
"catcache reference %p is not owned by resource owner %s",
1043 tuple, owner->
name);
1077 elog(
ERROR,
"catcache list reference %p is not owned by resource owner %s",
1112 elog(
ERROR,
"relcache reference %s is not owned by resource owner %s",
1122 elog(
WARNING,
"relcache reference leak: relation \"%s\" not closed",
1157 elog(
ERROR,
"plancache reference %p is not owned by resource owner %s",
1167 elog(
WARNING,
"plancache reference leak: plan %p not closed", plan);
1201 elog(
ERROR,
"tupdesc reference %p is not owned by resource owner %s",
1202 tupdesc, owner->
name);
1212 "TupleDesc reference leak: TupleDesc %p (%u,%d) still referenced",
1247 elog(
ERROR,
"snapshot reference %p is not owned by resource owner %s",
1248 snapshot, owner->
name);
1257 elog(
WARNING,
"Snapshot reference leak: Snapshot %p still referenced",
1293 elog(
ERROR,
"temporary file %d is not owned by resource owner %s",
1303 elog(
WARNING,
"temporary file leak: File %d still referenced",
1338 elog(
ERROR,
"dynamic shared memory segment %u is not owned by resource owner %s",
1348 elog(
WARNING,
"dynamic shared memory leak: segment %u still referenced",
1383 elog(
ERROR,
"JIT context %p is not owned by resource owner %s",
1418 elog(
ERROR,
"cryptohash context %p is not owned by resource owner %s",
1428 elog(
WARNING,
"cryptohash context reference leak: context %p still referenced",
#define DatumGetUInt32(X)
#define RESARRAY_INIT_SIZE
static void ResourceArrayEnlarge(ResourceArray *resarr)
void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
void ResourceOwnerRememberDSM(ResourceOwner owner, dsm_segment *seg)
void PrintCatCacheListLeakWarning(CatCList *list)
void ResourceOwnerRememberCatCacheRef(ResourceOwner owner, HeapTuple tuple)
HeapTupleData * HeapTuple
void PrintBufferLeakWarning(Buffer buffer)
#define DatumGetFile(datum)
ResourceOwner TopTransactionResourceOwner
#define PointerGetDatum(X)
ResourceOwner CurTransactionResourceOwner
ResourceOwner CurrentResourceOwner
void ReleaseAuxProcessResources(bool isCommit)
void ResourceOwnerEnlargeSnapshots(ResourceOwner owner)
void ResourceOwnerRememberRelationRef(ResourceOwner owner, Relation rel)
void ResourceOwnerDelete(ResourceOwner owner)
dsm_handle dsm_segment_handle(dsm_segment *seg)
void ResourceOwnerEnlargeCatCacheListRefs(ResourceOwner owner)
void ResourceOwnerForgetCatCacheRef(ResourceOwner owner, HeapTuple tuple)
void ResourceOwnerRememberPlanCacheRef(ResourceOwner owner, CachedPlan *plan)
void ResourceOwnerEnlargePlanCacheRefs(ResourceOwner owner)
Datum idx(PG_FUNCTION_ARGS)
void ReleaseCachedPlan(CachedPlan *plan, ResourceOwner owner)
void ReleaseBuffer(Buffer buffer)
static bool ResourceArrayGetAny(ResourceArray *resarr, Datum *value)
ResourceArray snapshotarr
void ReleasePredicateLocks(bool isCommit, bool isReadOnlySafe)
struct SnapshotData * Snapshot
static void ResourceOwnerReleaseInternal(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
void ResourceOwnerReleaseAllPlanCacheRefs(ResourceOwner owner)
void ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer)
ResourceOwner AuxProcessResourceOwner
void ResourceOwnerRememberTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
static ResourceReleaseCallbackItem * ResourceRelease_callbacks
void ResourceOwnerForgetPlanCacheRef(ResourceOwner owner, CachedPlan *plan)
void ReleaseCatCacheList(CatCList *list)
struct ResourceOwnerData * ResourceOwner
#define MAX_RESOWNER_LOCKS
void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks)
struct RelationData * Relation
#define RESARRAY_MAX_ITEMS(capacity)
void pfree(void *pointer)
struct ResourceArray ResourceArray
static void ReleaseAuxProcessResourcesCallback(int code, Datum arg)
static void PrintSnapshotLeakWarning(Snapshot snapshot)
void ResourceOwnerForgetRelationRef(ResourceOwner owner, Relation rel)
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)
static void ResourceArrayFree(ResourceArray *resarr)
void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks)
void ResourceOwnerRememberCryptoHash(ResourceOwner owner, Datum handle)
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
static void PrintPlanCacheLeakWarning(CachedPlan *plan)
void ResourceOwnerEnlargeDSMs(ResourceOwner owner)
void ResourceOwnerRememberFile(ResourceOwner owner, File file)
void ResourceOwnerForgetSnapshot(ResourceOwner owner, Snapshot snapshot)
#define RelationGetRelationName(relation)
void ProcReleaseLocks(bool isCommit)
void ResourceOwnerEnlargeRelationRefs(ResourceOwner owner)
struct ResourceReleaseCallbackItem ResourceReleaseCallbackItem
void RelationClose(Relation relation)
static Datum hash_any(const unsigned char *k, int keylen)
void ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc)
void ResourceOwnerEnlargeTupleDescs(ResourceOwner owner)
static void ResourceArrayInit(ResourceArray *resarr, Datum invalidval)
MemoryContext TopMemoryContext
void ResourceOwnerEnlargeCryptoHash(ResourceOwner owner)
void UnregisterSnapshot(Snapshot snapshot)
void ResourceOwnerEnlargeBuffers(ResourceOwner owner)
static void PrintRelCacheLeakWarning(Relation rel)
struct ResourceReleaseCallbackItem * next
void ResourceOwnerRememberJIT(ResourceOwner owner, Datum handle)
ResourceOwner ResourceOwnerGetParent(ResourceOwner owner)
void ResourceOwnerForgetLock(ResourceOwner owner, LOCALLOCK *locallock)
ResourceReleaseCallback callback
void PrintCatCacheLeakWarning(HeapTuple tuple)
void * MemoryContextAllocZero(MemoryContext context, Size size)
static void PrintTupleDescLeakWarning(TupleDesc tupdesc)
void ReleaseCatCache(HeapTuple tuple)
void ResourceOwnerForgetCatCacheListRef(ResourceOwner owner, CatCList *list)
void FileClose(File file)
#define BufferGetDatum(buffer)
#define FileGetDatum(file)
void ResourceOwnerForgetJIT(ResourceOwner owner, Datum handle)
#define Assert(condition)
void ResourceOwnerForgetCryptoHash(ResourceOwner owner, Datum handle)
void ResourceOwnerRelease(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
void DecrTupleDescRefCount(TupleDesc tupdesc)
void CreateAuxProcessResourceOwner(void)
void ResourceOwnerForgetDSM(ResourceOwner owner, dsm_segment *seg)
static void PrintFileLeakWarning(File file)
static bool ResourceArrayRemove(ResourceArray *resarr, Datum value)
#define DatumGetPointer(X)
void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent)
void dsm_detach(dsm_segment *seg)
#define DatumGetBuffer(datum)
struct TupleDescData * TupleDesc
void RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
void jit_release_context(JitContext *context)
void ResourceOwnerRememberSnapshot(ResourceOwner owner, Snapshot snapshot)
LOCALLOCK * locks[MAX_RESOWNER_LOCKS]
void ResourceOwnerEnlargeFiles(ResourceOwner owner)
void * MemoryContextAlloc(MemoryContext context, Size size)
void(* ResourceReleaseCallback)(ResourceReleasePhase phase, bool isCommit, bool isTopLevel, void *arg)
ResourceArray catlistrefarr
struct ResourceOwnerData ResourceOwnerData
void ResourceOwnerEnlargeJIT(ResourceOwner owner)
static void PrintDSMLeakWarning(dsm_segment *seg)
static void ResourceArrayAdd(ResourceArray *resarr, Datum value)
void pg_cryptohash_free(pg_cryptohash_ctx *ctx)
void ResourceOwnerForgetFile(ResourceOwner owner, File file)
#define RESARRAY_IS_ARRAY(resarr)
void ResourceOwnerRememberLock(ResourceOwner owner, LOCALLOCK *locallock)
void ResourceOwnerEnlargeCatCacheRefs(ResourceOwner owner)
static void PrintCryptoHashLeakWarning(Datum handle)
ResourceArray cryptohasharr
ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char *name)
void ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer)
void ResourceOwnerRememberCatCacheListRef(ResourceOwner owner, CatCList *list)