71#define RESOWNER_ARRAY_SIZE 32
77#define RESOWNER_HASH_INIT_SIZE 64
89#define RESOWNER_HASH_MAX_ITEMS(capacity) \
90 Min(capacity - RESOWNER_ARRAY_SIZE, (capacity)/4 * 3)
93 "initial hash size too small compared to array size");
105#define MAX_RESOWNER_LOCKS 15
173static int narray_lookups = 0;
174static int nhash_lookups = 0;
198 bool printLeakWarnings);
289 if (owner->
nhash == 0)
341 bool printLeakWarnings)
352 if (owner->
nhash == 0)
380 if (printLeakWarnings)
387 elog(
WARNING,
"resource was not closed: %s", res_str);
393 if (owner->
nhash == 0)
449 elog(
ERROR,
"ResourceOwnerEnlarge called after release started");
465 oldhash = owner->
hash;
477 owner->
hash = newhash;
489 for (
i = 0;
i < oldcap;
i++)
491 if (oldhash[
i].kind != NULL)
501 for (
int i = 0;
i < owner->
narr;
i++)
532 elog(
ERROR,
"ResourceOwnerRemember called but array was full");
562 elog(
ERROR,
"ResourceOwnerForget called for %s after release started", kind->
name);
566 for (
int i = owner->
narr - 1;
i >= 0;
i--)
582 if (owner->
nhash > 0)
611 elog(
ERROR,
"%s %p is not owned by resource owner %s",
659 elog(
LOG,
"RESOWNER STATS: lookups: array %d, hash %d",
660 narray_lookups, nhash_lookups);
767 locks = owner->
locks;
790 item->
callback(phase, isCommit, isTopLevel, item->
arg);
805 elog(
ERROR,
"ResourceOwnerForget called for %s after release started", kind->
name);
816 for (
int i = 0;
i < owner->
narr;
i++)
923 Assert(owner != newparent);
924 owner->
parent = newparent;
1029 bool isCommit = (code == 0);
1047 Assert(locallock != NULL);
1073 for (
i = owner->
nlocks - 1;
i >= 0;
i--)
1075 if (locallock == owner->
locks[
i])
1082 elog(
ERROR,
"lock reference %p is not owned by resource owner %s",
1083 locallock, owner->
name);
Datum idx(PG_FUNCTION_ARGS)
#define Assert(condition)
static uint64 hash_combine64(uint64 a, uint64 b)
static uint64 murmurhash64(uint64 data)
static uint32 hash_combine(uint32 a, uint32 b)
static uint32 murmurhash32(uint32 data)
static int pg_cmp_u32(uint32 a, uint32 b)
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks)
void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks)
void * MemoryContextAlloc(MemoryContext context, Size size)
void * MemoryContextAllocZero(MemoryContext context, Size size)
void pfree(void *pointer)
MemoryContext TopMemoryContext
#define qsort(a, b, c, d)
static Pointer DatumGetPointer(Datum X)
void ReleasePredicateLocks(bool isCommit, bool isReadOnlySafe)
char * psprintf(const char *fmt,...)
void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent)
#define MAX_RESOWNER_LOCKS
void ResourceOwnerRememberLock(ResourceOwner owner, LOCALLOCK *locallock)
static void ReleaseAuxProcessResourcesCallback(int code, Datum arg)
ResourceOwner TopTransactionResourceOwner
#define RESOWNER_HASH_INIT_SIZE
static void ResourceOwnerReleaseAll(ResourceOwner owner, ResourceReleasePhase phase, bool printLeakWarnings)
void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char *name)
#define RESOWNER_HASH_MAX_ITEMS(capacity)
void ReleaseAuxProcessResources(bool isCommit)
ResourceOwner ResourceOwnerGetParent(ResourceOwner owner)
ResourceOwner CurrentResourceOwner
static uint32 hash_resource_elem(Datum value, const ResourceOwnerDesc *kind)
struct ResourceElem ResourceElem
static ResourceReleaseCallbackItem * ResourceRelease_callbacks
static void ResourceOwnerAddToHash(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void CreateAuxProcessResourceOwner(void)
void ResourceOwnerRelease(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
static int resource_priority_cmp(const void *a, const void *b)
void RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
static void ResourceOwnerReleaseInternal(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerReleaseAllOfKind(ResourceOwner owner, const ResourceOwnerDesc *kind)
ResourceOwner AuxProcessResourceOwner
struct ResourceReleaseCallbackItem ResourceReleaseCallbackItem
void ResourceOwnerDelete(ResourceOwner owner)
ResourceOwner CurTransactionResourceOwner
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
#define RESOWNER_ARRAY_SIZE
static void ResourceOwnerSort(ResourceOwner owner)
StaticAssertDecl(RESOWNER_HASH_MAX_ITEMS(RESOWNER_HASH_INIT_SIZE) >=RESOWNER_ARRAY_SIZE, "initial hash size too small compared to array size")
void ResourceOwnerForgetLock(ResourceOwner owner, LOCALLOCK *locallock)
void ResourceOwnerEnlarge(ResourceOwner owner)
@ RESOURCE_RELEASE_BEFORE_LOCKS
@ RESOURCE_RELEASE_AFTER_LOCKS
struct ResourceOwnerData * ResourceOwner
void(* ResourceReleaseCallback)(ResourceReleasePhase phase, bool isCommit, bool isTopLevel, void *arg)
void ProcReleaseLocks(bool isCommit)
const ResourceOwnerDesc * kind
LOCALLOCK * locks[MAX_RESOWNER_LOCKS]
ResourceElem arr[RESOWNER_ARRAY_SIZE]
char *(* DebugPrint)(Datum res)
ResourceReleasePhase release_phase
void(* ReleaseResource)(Datum res)
ResourceReleasePriority release_priority
struct ResourceReleaseCallbackItem * next
ResourceReleaseCallback callback
static void callback(struct sockaddr *addr, struct sockaddr *mask, void *unused)