112 lines
3.4 KiB
C
112 lines
3.4 KiB
C
/*-------------------------------------------------------------------------
|
|
* 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 */
|