73#define RESOWNER_ARRAY_SIZE 32
79#define RESOWNER_HASH_INIT_SIZE 64
91#define RESOWNER_HASH_MAX_ITEMS(capacity) \
92 Min(capacity - RESOWNER_ARRAY_SIZE, (capacity)/4 * 3)
95 "initial hash size too small compared to array size");
107#define MAX_RESOWNER_LOCKS 15
272 if (
ra->kind->release_phase ==
rb->kind->release_phase)
273 return pg_cmp_u32(
rb->kind->release_priority,
ra->kind->release_priority);
274 else if (
ra->kind->release_phase >
rb->kind->release_phase)
294 if (owner->
nhash == 0)
357 if (owner->
nhash == 0)
398 if (owner->
nhash == 0)
456 elog(
ERROR,
"ResourceOwnerEnlarge called after release started");
508 for (
int i = 0;
i < owner->
narr;
i++)
539 elog(
ERROR,
"ResourceOwnerRemember called but array was full");
569 elog(
ERROR,
"ResourceOwnerForget called for %s after release started", kind->
name);
573 for (
int i = owner->
narr - 1;
i >= 0;
i--)
589 if (owner->
nhash > 0)
618 elog(
ERROR,
"%s %p is not owned by resource owner %s",
666 elog(
LOG,
"RESOWNER STATS: lookups: array %d, hash %d",
781 locks = owner->
locks;
819 elog(
ERROR,
"ResourceOwnerForget called for %s after release started", kind->
name);
830 for (
int i = 0;
i < owner->
narr;
i++)
1087 for (
i = owner->
nlocks - 1;
i >= 0;
i--)
1096 elog(
ERROR,
"lock reference %p is not owned by resource owner %s",
Datum idx(PG_FUNCTION_ARGS)
void pgaio_io_release_resowner(dlist_node *ioh_node, bool on_error)
#define Assert(condition)
#define StaticAssertDecl(condition, errmessage)
static uint64 hash_combine64(uint64 a, uint64 b)
static uint64 murmurhash64(uint64 data)
static void dlist_init(dlist_head *head)
static void dlist_delete_from(dlist_head *head, dlist_node *node)
static dlist_node * dlist_head_node(dlist_head *head)
static bool dlist_is_empty(const dlist_head *head)
static void dlist_push_tail(dlist_head *head, dlist_node *node)
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
void ResourceOwnerRememberAioHandle(ResourceOwner owner, struct dlist_node *ioh_node)
static uint32 hash_resource_elem(Datum value, const ResourceOwnerDesc *kind)
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
void ResourceOwnerDelete(ResourceOwner owner)
ResourceOwner CurTransactionResourceOwner
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
#define RESOWNER_ARRAY_SIZE
static void ResourceOwnerSort(ResourceOwner owner)
void ResourceOwnerForgetLock(ResourceOwner owner, LOCALLOCK *locallock)
void ResourceOwnerForgetAioHandle(ResourceOwner owner, struct dlist_node *ioh_node)
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)