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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user