PostgreSQL Source Code  git master
wait_event.h File Reference
#include "utils/wait_event_types.h"
Include dependency graph for wait_event.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#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
 
#define PG_WAIT_INJECTIONPOINT   0x0B000000U
 

Functions

const char * pgstat_get_wait_event (uint32 wait_event_info)
 
const char * pgstat_get_wait_event_type (uint32 wait_event_info)
 
static void pgstat_report_wait_start (uint32 wait_event_info)
 
static void pgstat_report_wait_end (void)
 
void pgstat_set_wait_event_storage (uint32 *wait_event_info)
 
void pgstat_reset_wait_event_storage (void)
 
uint32 WaitEventExtensionNew (const char *wait_event_name)
 
uint32 WaitEventInjectionPointNew (const char *wait_event_name)
 
void WaitEventCustomShmemInit (void)
 
Size WaitEventCustomShmemSize (void)
 
char ** GetWaitEventCustomNames (uint32 classId, int *nwaitevents)
 

Variables

PGDLLIMPORT uint32my_wait_event_info
 

Macro Definition Documentation

◆ PG_WAIT_ACTIVITY

#define PG_WAIT_ACTIVITY   0x05000000U

Definition at line 21 of file wait_event.h.

◆ PG_WAIT_BUFFERPIN

#define PG_WAIT_BUFFERPIN   0x04000000U

Definition at line 20 of file wait_event.h.

◆ PG_WAIT_CLIENT

#define PG_WAIT_CLIENT   0x06000000U

Definition at line 22 of file wait_event.h.

◆ PG_WAIT_EXTENSION

#define PG_WAIT_EXTENSION   0x07000000U

Definition at line 23 of file wait_event.h.

◆ PG_WAIT_INJECTIONPOINT

#define PG_WAIT_INJECTIONPOINT   0x0B000000U

Definition at line 27 of file wait_event.h.

◆ PG_WAIT_IO

#define PG_WAIT_IO   0x0A000000U

Definition at line 26 of file wait_event.h.

◆ PG_WAIT_IPC

#define PG_WAIT_IPC   0x08000000U

Definition at line 24 of file wait_event.h.

◆ PG_WAIT_LOCK

#define PG_WAIT_LOCK   0x03000000U

Definition at line 19 of file wait_event.h.

◆ PG_WAIT_LWLOCK

#define PG_WAIT_LWLOCK   0x01000000U

Definition at line 18 of file wait_event.h.

◆ PG_WAIT_TIMEOUT

#define PG_WAIT_TIMEOUT   0x09000000U

Definition at line 25 of file wait_event.h.

Function Documentation

◆ GetWaitEventCustomNames()

char** GetWaitEventCustomNames ( uint32  classId,
int *  nwaitevents 
)

Definition at line 307 of file wait_event.c.

308 {
309  char **waiteventnames;
311  HASH_SEQ_STATUS hash_seq;
312  int index;
313  int els;
314 
315  LWLockAcquire(WaitEventCustomLock, LW_SHARED);
316 
317  /* Now we can safely count the number of entries */
319 
320  /* Allocate enough space for all entries */
321  waiteventnames = palloc(els * sizeof(char *));
322 
323  /* Now scan the hash table to copy the data */
325 
326  index = 0;
327  while ((hentry = (WaitEventCustomEntryByName *) hash_seq_search(&hash_seq)) != NULL)
328  {
329  if ((hentry->wait_event_info & WAIT_EVENT_CLASS_MASK) != classId)
330  continue;
331  waiteventnames[index] = pstrdup(hentry->wait_event_name);
332  index++;
333  }
334 
335  LWLockRelease(WaitEventCustomLock);
336 
337  *nwaitevents = index;
338  return waiteventnames;
339 }
long hash_get_num_entries(HTAB *hashp)
Definition: dynahash.c:1341
void * hash_seq_search(HASH_SEQ_STATUS *status)
Definition: dynahash.c:1395
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
Definition: dynahash.c:1385
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
Definition: lwlock.c:1168
void LWLockRelease(LWLock *lock)
Definition: lwlock.c:1781
@ LW_SHARED
Definition: lwlock.h:115
char * pstrdup(const char *in)
Definition: mcxt.c:1696
void * palloc(Size size)
Definition: mcxt.c:1317
char wait_event_name[NAMEDATALEN]
Definition: wait_event.c:79
Definition: type.h:95
static HTAB * WaitEventCustomHashByName
Definition: wait_event.c:65
#define WAIT_EVENT_CLASS_MASK
Definition: wait_event.c:43

References hash_get_num_entries(), hash_seq_init(), hash_seq_search(), LW_SHARED, LWLockAcquire(), LWLockRelease(), palloc(), pstrdup(), WAIT_EVENT_CLASS_MASK, WaitEventCustomEntryByName::wait_event_info, WaitEventCustomEntryByName::wait_event_name, and WaitEventCustomHashByName.

Referenced by pg_get_wait_events().

◆ pgstat_get_wait_event()

const char* pgstat_get_wait_event ( uint32  wait_event_info)

Definition at line 432 of file wait_event.c.

433 {
434  uint32 classId;
435  uint16 eventId;
436  const char *event_name;
437 
438  /* report process as not waiting. */
439  if (wait_event_info == 0)
440  return NULL;
441 
442  classId = wait_event_info & WAIT_EVENT_CLASS_MASK;
443  eventId = wait_event_info & WAIT_EVENT_ID_MASK;
444 
445  switch (classId)
446  {
447  case PG_WAIT_LWLOCK:
448  event_name = GetLWLockIdentifier(classId, eventId);
449  break;
450  case PG_WAIT_LOCK:
451  event_name = GetLockNameFromTagType(eventId);
452  break;
453  case PG_WAIT_EXTENSION:
455  event_name = GetWaitEventCustomIdentifier(wait_event_info);
456  break;
457  case PG_WAIT_BUFFERPIN:
458  {
459  WaitEventBufferPin w = (WaitEventBufferPin) wait_event_info;
460 
461  event_name = pgstat_get_wait_bufferpin(w);
462  break;
463  }
464  case PG_WAIT_ACTIVITY:
465  {
466  WaitEventActivity w = (WaitEventActivity) wait_event_info;
467 
468  event_name = pgstat_get_wait_activity(w);
469  break;
470  }
471  case PG_WAIT_CLIENT:
472  {
473  WaitEventClient w = (WaitEventClient) wait_event_info;
474 
475  event_name = pgstat_get_wait_client(w);
476  break;
477  }
478  case PG_WAIT_IPC:
479  {
480  WaitEventIPC w = (WaitEventIPC) wait_event_info;
481 
482  event_name = pgstat_get_wait_ipc(w);
483  break;
484  }
485  case PG_WAIT_TIMEOUT:
486  {
487  WaitEventTimeout w = (WaitEventTimeout) wait_event_info;
488 
489  event_name = pgstat_get_wait_timeout(w);
490  break;
491  }
492  case PG_WAIT_IO:
493  {
494  WaitEventIO w = (WaitEventIO) wait_event_info;
495 
496  event_name = pgstat_get_wait_io(w);
497  break;
498  }
499  default:
500  event_name = "unknown wait event";
501  break;
502  }
503 
504  return event_name;
505 }
unsigned short uint16
Definition: c.h:505
unsigned int uint32
Definition: c.h:506
const char * GetLockNameFromTagType(uint16 locktag_type)
Definition: lmgr.c:1330
const char * GetLWLockIdentifier(uint32 classId, uint16 eventId)
Definition: lwlock.c:767
static const char * pgstat_get_wait_ipc(WaitEventIPC w)
static const char * pgstat_get_wait_io(WaitEventIO w)
static const char * pgstat_get_wait_bufferpin(WaitEventBufferPin w)
static const char * GetWaitEventCustomIdentifier(uint32 wait_event_info)
Definition: wait_event.c:277
static const char * pgstat_get_wait_timeout(WaitEventTimeout w)
static const char * pgstat_get_wait_client(WaitEventClient w)
#define WAIT_EVENT_ID_MASK
Definition: wait_event.c:44
static const char * pgstat_get_wait_activity(WaitEventActivity w)
#define PG_WAIT_TIMEOUT
Definition: wait_event.h:25
#define PG_WAIT_INJECTIONPOINT
Definition: wait_event.h:27
#define PG_WAIT_LWLOCK
Definition: wait_event.h:18
#define PG_WAIT_BUFFERPIN
Definition: wait_event.h:20
#define PG_WAIT_IPC
Definition: wait_event.h:24
#define PG_WAIT_CLIENT
Definition: wait_event.h:22
#define PG_WAIT_EXTENSION
Definition: wait_event.h:23
#define PG_WAIT_ACTIVITY
Definition: wait_event.h:21
#define PG_WAIT_LOCK
Definition: wait_event.h:19
#define PG_WAIT_IO
Definition: wait_event.h:26

References GetLockNameFromTagType(), GetLWLockIdentifier(), GetWaitEventCustomIdentifier(), PG_WAIT_ACTIVITY, PG_WAIT_BUFFERPIN, PG_WAIT_CLIENT, PG_WAIT_EXTENSION, PG_WAIT_INJECTIONPOINT, PG_WAIT_IO, PG_WAIT_IPC, PG_WAIT_LOCK, PG_WAIT_LWLOCK, PG_WAIT_TIMEOUT, pgstat_get_wait_activity(), pgstat_get_wait_bufferpin(), pgstat_get_wait_client(), pgstat_get_wait_io(), pgstat_get_wait_ipc(), pgstat_get_wait_timeout(), WAIT_EVENT_CLASS_MASK, and WAIT_EVENT_ID_MASK.

Referenced by pg_stat_get_activity(), and pg_stat_get_backend_wait_event().

◆ pgstat_get_wait_event_type()

const char* pgstat_get_wait_event_type ( uint32  wait_event_info)

Definition at line 374 of file wait_event.c.

375 {
376  uint32 classId;
377  const char *event_type;
378 
379  /* report process as not waiting. */
380  if (wait_event_info == 0)
381  return NULL;
382 
383  classId = wait_event_info & WAIT_EVENT_CLASS_MASK;
384 
385  switch (classId)
386  {
387  case PG_WAIT_LWLOCK:
388  event_type = "LWLock";
389  break;
390  case PG_WAIT_LOCK:
391  event_type = "Lock";
392  break;
393  case PG_WAIT_BUFFERPIN:
394  event_type = "BufferPin";
395  break;
396  case PG_WAIT_ACTIVITY:
397  event_type = "Activity";
398  break;
399  case PG_WAIT_CLIENT:
400  event_type = "Client";
401  break;
402  case PG_WAIT_EXTENSION:
403  event_type = "Extension";
404  break;
405  case PG_WAIT_IPC:
406  event_type = "IPC";
407  break;
408  case PG_WAIT_TIMEOUT:
409  event_type = "Timeout";
410  break;
411  case PG_WAIT_IO:
412  event_type = "IO";
413  break;
415  event_type = "InjectionPoint";
416  break;
417  default:
418  event_type = "???";
419  break;
420  }
421 
422  return event_type;
423 }

References PG_WAIT_ACTIVITY, PG_WAIT_BUFFERPIN, PG_WAIT_CLIENT, PG_WAIT_EXTENSION, PG_WAIT_INJECTIONPOINT, PG_WAIT_IO, PG_WAIT_IPC, PG_WAIT_LOCK, PG_WAIT_LWLOCK, PG_WAIT_TIMEOUT, and WAIT_EVENT_CLASS_MASK.

Referenced by pg_isolation_test_session_is_blocked(), pg_stat_get_activity(), pg_stat_get_backend_wait_event_type(), and WaitEventCustomNew().

◆ pgstat_report_wait_end()

static void pgstat_report_wait_end ( void  )
inlinestatic

Definition at line 101 of file wait_event.h.

102 {
103  /* see pgstat_report_wait_start() */
104  *(volatile uint32 *) my_wait_event_info = 0;
105 }
PGDLLIMPORT uint32 * my_wait_event_info
Definition: wait_event.c:41

References my_wait_event_info.

Referenced by AbortSubTransaction(), AbortTransaction(), AddToDataDirLockFile(), ApplyLogicalMappingFile(), assign_wal_sync_method(), BackgroundWriterMain(), basebackup_read_file(), BootStrapXLOG(), CheckpointerMain(), CheckPointLogicalRewriteHeap(), copy_file(), CreateCheckPoint(), CreateDirAndVersionFile(), CreateLockFile(), dsm_impl_mmap(), dsm_impl_posix_resize(), ExecuteRecoveryCommand(), FileFallocate(), FilePrefetch(), FileReadV(), FileSync(), FileTruncate(), FileWriteback(), FileWriteV(), FileZero(), heap_xlog_logical_rewrite(), issue_xlog_fsync(), LWLockReportWaitEnd(), perform_spin_delay(), pgarch_archiveXlog(), ProcArrayGroupClearXid(), read_relmap_file(), ReadControlFile(), readTimeLineHistory(), ReadTwoPhaseFile(), RecheckDataDirLockFile(), RecreateTwoPhaseFile(), ReorderBufferSerializeChange(), RestoreArchivedFile(), RestoreSlotFromDisk(), SaveSlotToPath(), SendTimeLineHistory(), shell_archive_file(), ShutdownAuxiliaryProcess(), SlruPhysicalReadPage(), SlruPhysicalWritePage(), SlruSyncFileTag(), SnapBuildRestoreContents(), SnapBuildSerialize(), TransactionGroupUpdateXidStatus(), update_controlfile(), vacuum_delay_point(), WaitEventSetWait(), WaitExceedsMaxStandbyDelay(), WALRead(), WalSndErrorCleanup(), WalSummarizerMain(), WalWriterMain(), write_relmap_file(), WriteControlFile(), writeTimeLineHistory(), writeTimeLineHistoryFile(), XLogFileCopy(), XLogFileInitInternal(), XLogPageRead(), and XLogWrite().

◆ pgstat_report_wait_start()

static void pgstat_report_wait_start ( uint32  wait_event_info)
inlinestatic

Definition at line 85 of file wait_event.h.

86 {
87  /*
88  * Since this is a four-byte field which is always read and written as
89  * four-bytes, updates are atomic.
90  */
91  *(volatile uint32 *) my_wait_event_info = wait_event_info;
92 }

References my_wait_event_info.

Referenced by AddToDataDirLockFile(), ApplyLogicalMappingFile(), assign_wal_sync_method(), basebackup_read_file(), BootStrapXLOG(), CheckPointLogicalRewriteHeap(), copy_file(), CreateCheckPoint(), CreateDirAndVersionFile(), CreateLockFile(), dsm_impl_mmap(), dsm_impl_posix_resize(), ExecuteRecoveryCommand(), FileFallocate(), FilePrefetch(), FileReadV(), FileSync(), FileTruncate(), FileWriteback(), FileWriteV(), FileZero(), heap_xlog_logical_rewrite(), issue_xlog_fsync(), LWLockReportWaitStart(), perform_spin_delay(), ProcArrayGroupClearXid(), read_relmap_file(), ReadControlFile(), readTimeLineHistory(), ReadTwoPhaseFile(), RecheckDataDirLockFile(), RecreateTwoPhaseFile(), ReorderBufferSerializeChange(), RestoreArchivedFile(), RestoreSlotFromDisk(), SaveSlotToPath(), SendTimeLineHistory(), shell_archive_file(), SlruPhysicalReadPage(), SlruPhysicalWritePage(), SlruSyncFileTag(), SnapBuildRestoreContents(), SnapBuildSerialize(), TransactionGroupUpdateXidStatus(), update_controlfile(), vacuum_delay_point(), WaitEventSetWait(), WaitExceedsMaxStandbyDelay(), WALRead(), write_relmap_file(), WriteControlFile(), writeTimeLineHistory(), writeTimeLineHistoryFile(), XLogFileCopy(), XLogFileInitInternal(), XLogPageRead(), and XLogWrite().

◆ pgstat_reset_wait_event_storage()

void pgstat_reset_wait_event_storage ( void  )

Definition at line 362 of file wait_event.c.

363 {
365 }
static uint32 local_my_wait_event_info
Definition: wait_event.c:40
uint32 * my_wait_event_info
Definition: wait_event.c:41

References local_my_wait_event_info, and my_wait_event_info.

Referenced by AuxiliaryProcKill(), and ProcKill().

◆ pgstat_set_wait_event_storage()

void pgstat_set_wait_event_storage ( uint32 wait_event_info)

Definition at line 350 of file wait_event.c.

351 {
352  my_wait_event_info = wait_event_info;
353 }

References my_wait_event_info.

Referenced by InitAuxiliaryProcess(), and InitProcess().

◆ WaitEventCustomShmemInit()

void WaitEventCustomShmemInit ( void  )

Definition at line 120 of file wait_event.c.

121 {
122  bool found;
123  HASHCTL info;
124 
126  ShmemInitStruct("WaitEventCustomCounterData",
127  sizeof(WaitEventCustomCounterData), &found);
128 
129  if (!found)
130  {
131  /* initialize the allocation counter and its spinlock. */
134  }
135 
136  /* initialize or attach the hash tables to store custom wait events */
137  info.keysize = sizeof(uint32);
138  info.entrysize = sizeof(WaitEventCustomEntryByInfo);
140  ShmemInitHash("WaitEventCustom hash by wait event information",
143  &info,
145 
146  /* key is a NULL-terminated string */
147  info.keysize = sizeof(char[NAMEDATALEN]);
148  info.entrysize = sizeof(WaitEventCustomEntryByName);
150  ShmemInitHash("WaitEventCustom hash by name",
153  &info,
155 }
#define HASH_STRINGS
Definition: hsearch.h:96
#define HASH_ELEM
Definition: hsearch.h:95
#define HASH_BLOBS
Definition: hsearch.h:97
#define NAMEDATALEN
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition: shmem.c:387
HTAB * ShmemInitHash(const char *name, long init_size, long max_size, HASHCTL *infoP, int hash_flags)
Definition: shmem.c:332
#define SpinLockInit(lock)
Definition: spin.h:60
Size keysize
Definition: hsearch.h:75
Size entrysize
Definition: hsearch.h:76
#define WAIT_EVENT_CUSTOM_HASH_MAX_SIZE
Definition: wait_event.c:68
struct WaitEventCustomEntryByName WaitEventCustomEntryByName
#define WAIT_EVENT_CUSTOM_HASH_INIT_SIZE
Definition: wait_event.c:67
static WaitEventCustomCounterData * WaitEventCustomCounter
Definition: wait_event.c:92
struct WaitEventCustomEntryByInfo WaitEventCustomEntryByInfo
static HTAB * WaitEventCustomHashByInfo
Definition: wait_event.c:64
#define WAIT_EVENT_CUSTOM_INITIAL_ID
Definition: wait_event.c:95

References HASHCTL::entrysize, HASH_BLOBS, HASH_ELEM, HASH_STRINGS, HASHCTL::keysize, WaitEventCustomCounterData::mutex, NAMEDATALEN, WaitEventCustomCounterData::nextId, ShmemInitHash(), ShmemInitStruct(), SpinLockInit, WAIT_EVENT_CUSTOM_HASH_INIT_SIZE, WAIT_EVENT_CUSTOM_HASH_MAX_SIZE, WAIT_EVENT_CUSTOM_INITIAL_ID, WaitEventCustomCounter, WaitEventCustomHashByInfo, and WaitEventCustomHashByName.

Referenced by CreateOrAttachShmemStructs().

◆ WaitEventCustomShmemSize()

Size WaitEventCustomShmemSize ( void  )

Definition at line 104 of file wait_event.c.

105 {
106  Size sz;
107 
108  sz = MAXALIGN(sizeof(WaitEventCustomCounterData));
110  sizeof(WaitEventCustomEntryByInfo)));
112  sizeof(WaitEventCustomEntryByName)));
113  return sz;
114 }
#define MAXALIGN(LEN)
Definition: c.h:811
size_t Size
Definition: c.h:605
Size hash_estimate_size(long num_entries, Size entrysize)
Definition: dynahash.c:783
Size add_size(Size s1, Size s2)
Definition: shmem.c:493

References add_size(), hash_estimate_size(), MAXALIGN, and WAIT_EVENT_CUSTOM_HASH_MAX_SIZE.

Referenced by CalculateShmemSize().

◆ WaitEventExtensionNew()

uint32 WaitEventExtensionNew ( const char *  wait_event_name)

Definition at line 164 of file wait_event.c.

165 {
166  return WaitEventCustomNew(PG_WAIT_EXTENSION, wait_event_name);
167 }
static uint32 WaitEventCustomNew(uint32 classId, const char *wait_event_name)
Definition: wait_event.c:176

References PG_WAIT_EXTENSION, and WaitEventCustomNew().

Referenced by connect_pg_server(), dblink_connect(), dblink_get_conn(), dblink_init(), GetConnection(), pgfdw_get_cleanup_result(), test_shm_mq_pipelined(), wait_for_workers_to_become_ready(), and worker_spi_main().

◆ WaitEventInjectionPointNew()

uint32 WaitEventInjectionPointNew ( const char *  wait_event_name)

Definition at line 170 of file wait_event.c.

171 {
172  return WaitEventCustomNew(PG_WAIT_INJECTIONPOINT, wait_event_name);
173 }

References PG_WAIT_INJECTIONPOINT, and WaitEventCustomNew().

Referenced by injection_wait().

Variable Documentation

◆ my_wait_event_info