1/*--------------------------------------------------------------------------
3 * test_resowner_basic.c
4 * Test basic ResourceOwner functionality
6 * Copyright (c) 2022-2025, PostgreSQL Global Development Group
9 * src/test/modules/test_resowner/test_resowner_basic.c
11 * -------------------------------------------------------------------------
24 * A resource that tracks strings and prints the string when it's released.
25 * This makes the order that the resources are released visible.
28 .
name =
"test resource",
47/* demonstrates phases and priorities between a parent and child context */
60 elog(
ERROR,
"nkinds must be greater than zero");
62 elog(
ERROR,
"nresources must be greater than zero");
68 for (
int i = 0;
i < nkinds;
i++)
70 before_desc[
i].
name =
psprintf(
"test resource before locks %d",
i);
77 for (
int i = 0;
i < nkinds;
i++)
86 /* Add a bunch of resources to child, with different priorities */
87 for (
int i = 0;
i < nresources;
i++)
96 for (
int i = 0;
i < nresources;
i++)
106 /* And also to the parent */
107 for (
int i = 0;
i < nresources;
i++)
116 for (
int i = 0;
i < nresources;
i++)
126 elog(
NOTICE,
"releasing resources before locks");
130 elog(
NOTICE,
"releasing resources after locks");
150 /* don't call ResourceOwnerForget, so that it is leaked */
172 * Try to remember a new resource. Fails because we already called
173 * ResourceOwnerRelease.
179 elog(
ERROR,
"ResourceOwnerEnlarge should have errored out");
200 * Try to forget the resource that was remembered earlier. Fails because
201 * we already called ResourceOwnerRelease.
206 elog(
ERROR,
"ResourceOwnerForget should have errored out");
#define PG_GETARG_INT32(n)
static Pointer DatumGetPointer(Datum X)
static Datum CStringGetDatum(const char *X)
char * psprintf(const char *fmt,...)
ResourceOwner ResourceOwnerCreate(ResourceOwner parent, const char *name)
ResourceOwner CurrentResourceOwner
void ResourceOwnerRelease(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel)
void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerDelete(ResourceOwner owner)
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerEnlarge(ResourceOwner owner)
@ RESOURCE_RELEASE_BEFORE_LOCKS
@ RESOURCE_RELEASE_AFTER_LOCKS
#define RELEASE_PRIO_FIRST
char *(* DebugPrint)(Datum res)
ResourceReleasePhase release_phase
void(* ReleaseResource)(Datum res)
ResourceReleasePriority release_priority
static void ReleaseString(Datum res)
Datum test_resowner_forget_between_phases(PG_FUNCTION_ARGS)
static const ResourceOwnerDesc string_desc
Datum test_resowner_remember_between_phases(PG_FUNCTION_ARGS)
PG_FUNCTION_INFO_V1(test_resowner_priorities)
Datum test_resowner_leak(PG_FUNCTION_ARGS)
static char * PrintString(Datum res)
Datum test_resowner_priorities(PG_FUNCTION_ARGS)