/*------------------------------------------------------------------------- * wait_event.h * Definitions related to wait event reporting * * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/utils/wait_event.h * ---------- */ #ifndef WAIT_EVENT_H #define WAIT_EVENT_H /* ---------- * Wait Classes * ---------- */ #define PG_WAIT_LWLOCK 0x01000000U #define PG_WAIT_LOCK 0x03000000U #define PG_WAIT_BUFFERPIN 0x04000000U #define PG_WAIT_ACTIVITY 0x05000000U #define PG_WAIT_CLIENT 0x06000000U #define PG_WAIT_EXTENSION 0x07000000U #define PG_WAIT_IPC 0x08000000U #define PG_WAIT_TIMEOUT 0x09000000U #define PG_WAIT_IO 0x0A000000U /* enums for wait events */ #include "utils/wait_event_types.h" extern const char *pgstat_get_wait_event(uint32 wait_event_info); extern const char *pgstat_get_wait_event_type(uint32 wait_event_info); static inline void pgstat_report_wait_start(uint32 wait_event_info); static inline void pgstat_report_wait_end(void); extern void pgstat_set_wait_event_storage(uint32 *wait_event_info); extern void pgstat_reset_wait_event_storage(void); extern PGDLLIMPORT uint32 *my_wait_event_info; /* ---------- * Wait Events - Extension * * Use this category when the server process is waiting for some condition * defined by an extension module. * * Extensions can define their own wait events in this category. They should * call WaitEventExtensionNew() with a wait event string. If the wait event * associated to a string is already allocated, it returns the wait event * information to use. If not, it gets one wait event ID allocated from * a shared counter, associates the string to the ID in the shared dynamic * hash and returns the wait event information. * * The ID retrieved can be used with pgstat_report_wait_start() or equivalent. */ typedef enum { WAIT_EVENT_EXTENSION = PG_WAIT_EXTENSION, WAIT_EVENT_EXTENSION_FIRST_USER_DEFINED, } WaitEventExtension; extern void WaitEventExtensionShmemInit(void); extern Size WaitEventExtensionShmemSize(void); extern uint32 WaitEventExtensionNew(const char *wait_event_name); extern char **GetWaitEventExtensionNames(int *nwaitevents); /* ---------- * pgstat_report_wait_start() - * * Called from places where server process needs to wait. This is called * to report wait event information. The wait information is stored * as 4-bytes where first byte represents the wait event class (type of * wait, for different types of wait, refer WaitClass) and the next * 3-bytes represent the actual wait event. Currently 2-bytes are used * for wait event which is sufficient for current usage, 1-byte is * reserved for future usage. * * Historically we used to make this reporting conditional on * pgstat_track_activities, but the check for that seems to add more cost * than it saves. * * my_wait_event_info initially points to local memory, making it safe to * call this before MyProc has been initialized. * ---------- */ static inline void pgstat_report_wait_start(uint32 wait_event_info) { /* * Since this is a four-byte field which is always read and written as * four-bytes, updates are atomic. */ *(volatile uint32 *) my_wait_event_info = wait_event_info; } /* ---------- * pgstat_report_wait_end() - * * Called to report end of a wait. * ---------- */ static inline void pgstat_report_wait_end(void) { /* see pgstat_report_wait_start() */ *(volatile uint32 *) my_wait_event_info = 0; } #endif /* WAIT_EVENT_H */