1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-25 13:17:41 +03:00

Add InjectionPointList() to retrieve list of injection points

This routine has come as a useful piece to be able to know the list of
injection points currently attached in a system.  One area would be to
use it in a set-returning function, or just let out-of-core code play
with it.

This hides the internals of the shared memory array lookup holding the
information about the injection points (point name, library and function
name), allocating the result in a palloc'd List consumable by the
caller.

Reviewed-by: Jeff Davis <pgsql@j-davis.com>
Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com>
Reviewed-by: Rahila Syed <rahilasyed90@gmail.com>
Discussion: https://postgr.es/m/Z_xYkA21KyLEHvWR@paquier.xyz
Discussion: https://postgr.es/m/aBG2rPwl3GE7m1-Q@paquier.xyz
This commit is contained in:
Michael Paquier
2025-07-03 08:41:25 +09:00
parent fe05430ace
commit 7b2eb72b1b
3 changed files with 63 additions and 0 deletions

View File

@@ -584,3 +584,49 @@ IsInjectionPointAttached(const char *name)
return false; /* silence compiler */
#endif
}
/*
* Retrieve a list of all the injection points currently attached.
*
* This list is palloc'd in the current memory context.
*/
List *
InjectionPointList(void)
{
#ifdef USE_INJECTION_POINTS
List *inj_points = NIL;
uint32 max_inuse;
LWLockAcquire(InjectionPointLock, LW_SHARED);
max_inuse = pg_atomic_read_u32(&ActiveInjectionPoints->max_inuse);
for (uint32 idx = 0; idx < max_inuse; idx++)
{
InjectionPointEntry *entry;
InjectionPointData *inj_point;
uint64 generation;
entry = &ActiveInjectionPoints->entries[idx];
generation = pg_atomic_read_u64(&entry->generation);
/* skip free slots */
if (generation % 2 == 0)
continue;
inj_point = (InjectionPointData *) palloc0(sizeof(InjectionPointData));
inj_point->name = pstrdup(entry->name);
inj_point->library = pstrdup(entry->library);
inj_point->function = pstrdup(entry->function);
inj_points = lappend(inj_points, inj_point);
}
LWLockRelease(InjectionPointLock);
return inj_points;
#else
elog(ERROR, "Injection points are not supported by this build");
return NIL; /* keep compiler quiet */
#endif
}