mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +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
|
||||
}
|
||||
|
@ -11,6 +11,19 @@
|
||||
#ifndef INJECTION_POINT_H
|
||||
#define INJECTION_POINT_H
|
||||
|
||||
#include "nodes/pg_list.h"
|
||||
|
||||
/*
|
||||
* Injection point data, used when retrieving a list of all the attached
|
||||
* injection points.
|
||||
*/
|
||||
typedef struct InjectionPointData
|
||||
{
|
||||
const char *name;
|
||||
const char *library;
|
||||
const char *function;
|
||||
} InjectionPointData;
|
||||
|
||||
/*
|
||||
* Injection points require --enable-injection-points.
|
||||
*/
|
||||
@ -47,6 +60,9 @@ extern void InjectionPointCached(const char *name, void *arg);
|
||||
extern bool IsInjectionPointAttached(const char *name);
|
||||
extern bool InjectionPointDetach(const char *name);
|
||||
|
||||
/* Get the current set of injection points attached */
|
||||
extern List *InjectionPointList(void);
|
||||
|
||||
#ifdef EXEC_BACKEND
|
||||
extern PGDLLIMPORT struct InjectionPointsCtl *ActiveInjectionPoints;
|
||||
#endif
|
||||
|
@ -1291,6 +1291,7 @@ InjectionPointCacheEntry
|
||||
InjectionPointCallback
|
||||
InjectionPointCondition
|
||||
InjectionPointConditionType
|
||||
InjectionPointData
|
||||
InjectionPointEntry
|
||||
InjectionPointSharedState
|
||||
InjectionPointsCtl
|
||||
|
Reference in New Issue
Block a user