Age Owner Branch data TLA Line data Source code
1 : : /*------------------------------------------------------------------------
2 : : *
3 : : * wait_event_funcs.c
4 : : * Functions for accessing wait event data.
5 : : *
6 : : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7 : : * Portions Copyright (c) 1994, Regents of the University of California
8 : : *
9 : : *
10 : : * IDENTIFICATION
11 : : * src/backend/utils/activity/wait_event_funcs.c
12 : : *
13 : : *------------------------------------------------------------------------
14 : : */
15 : : #include "postgres.h"
16 : :
17 : : #include "funcapi.h"
18 : : #include "utils/builtins.h"
19 : : #include "utils/wait_event.h"
20 : :
21 : : /*
22 : : * Each wait event has one corresponding entry in this structure, fed to
23 : : * the SQL function of this file.
24 : : */
25 : : static const struct
26 : : {
27 : : const char *type;
28 : : const char *name;
29 : : const char *description;
30 : : }
31 : :
32 : : waitEventData[] =
33 : : {
34 : : #include "wait_event_funcs_data.c"
35 : : /* end of list */
36 : : {NULL, NULL, NULL}
37 : : };
38 : :
39 : :
40 : : /*
41 : : * pg_get_wait_events
42 : : *
43 : : * List information about wait events (type, name and description).
44 : : */
45 : : Datum
238 michael@paquier.xyz 46 :GNC 4 : pg_get_wait_events(PG_FUNCTION_ARGS)
47 : : {
48 : : #define PG_GET_WAIT_EVENTS_COLS 3
49 : 4 : ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
50 : : char **waiteventnames;
51 : : int nbextwaitevents;
52 : :
53 : : /* Build tuplestore to hold the result rows */
54 : 4 : InitMaterializedSRF(fcinfo, 0);
55 : :
56 : : /* Iterate over the list of wait events */
57 [ + + ]: 1060 : for (int idx = 0; waitEventData[idx].type != NULL; idx++)
58 : : {
59 : 1056 : Datum values[PG_GET_WAIT_EVENTS_COLS] = {0};
60 : 1056 : bool nulls[PG_GET_WAIT_EVENTS_COLS] = {0};
61 : :
62 : 1056 : values[0] = CStringGetTextDatum(waitEventData[idx].type);
63 : 1056 : values[1] = CStringGetTextDatum(waitEventData[idx].name);
64 : 1056 : values[2] = CStringGetTextDatum(waitEventData[idx].description);
65 : :
66 : 1056 : tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
67 : : }
68 : :
69 : : /* Handle custom wait events for extensions */
70 : 4 : waiteventnames = GetWaitEventExtensionNames(&nbextwaitevents);
71 : :
72 [ + + ]: 5 : for (int idx = 0; idx < nbextwaitevents; idx++)
73 : : {
74 : : StringInfoData buf;
75 : 1 : Datum values[PG_GET_WAIT_EVENTS_COLS] = {0};
76 : 1 : bool nulls[PG_GET_WAIT_EVENTS_COLS] = {0};
77 : :
78 : :
79 : 1 : values[0] = CStringGetTextDatum("Extension");
80 : 1 : values[1] = CStringGetTextDatum(waiteventnames[idx]);
81 : :
82 : 1 : initStringInfo(&buf);
83 : 1 : appendStringInfo(&buf,
84 : : "Waiting for custom wait event \"%s\" defined by extension module",
85 : 1 : waiteventnames[idx]);
86 : :
87 : 1 : values[2] = CStringGetTextDatum(buf.data);
88 : :
89 : 1 : tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
90 : : }
91 : :
92 : 4 : return (Datum) 0;
93 : : }
|