PostgreSQL Source Code  git master
timeout.h File Reference
Include dependency graph for timeout.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  EnableTimeoutParams
 
struct  DisableTimeoutParams
 

Typedefs

typedef enum TimeoutId TimeoutId
 
typedef void(* timeout_handler_proc) (void)
 
typedef enum TimeoutType TimeoutType
 

Enumerations

enum  TimeoutId {
  STARTUP_PACKET_TIMEOUT , DEADLOCK_TIMEOUT , LOCK_TIMEOUT , STATEMENT_TIMEOUT ,
  STANDBY_DEADLOCK_TIMEOUT , STANDBY_TIMEOUT , STANDBY_LOCK_TIMEOUT , IDLE_IN_TRANSACTION_SESSION_TIMEOUT ,
  IDLE_SESSION_TIMEOUT , CLIENT_CONNECTION_CHECK_TIMEOUT , STARTUP_PROGRESS_TIMEOUT , USER_TIMEOUT ,
  MAX_TIMEOUTS = USER_TIMEOUT + 10
}
 
enum  TimeoutType { TMPARAM_AFTER , TMPARAM_AT , TMPARAM_EVERY }
 

Functions

void InitializeTimeouts (void)
 
TimeoutId RegisterTimeout (TimeoutId id, timeout_handler_proc handler)
 
void reschedule_timeouts (void)
 
void enable_timeout_after (TimeoutId id, int delay_ms)
 
void enable_timeout_every (TimeoutId id, TimestampTz fin_time, int delay_ms)
 
void enable_timeout_at (TimeoutId id, TimestampTz fin_time)
 
void enable_timeouts (const EnableTimeoutParams *timeouts, int count)
 
void disable_timeout (TimeoutId id, bool keep_indicator)
 
void disable_timeouts (const DisableTimeoutParams *timeouts, int count)
 
void disable_all_timeouts (bool keep_indicators)
 
bool get_timeout_active (TimeoutId id)
 
bool get_timeout_indicator (TimeoutId id, bool reset_indicator)
 
TimestampTz get_timeout_start_time (TimeoutId id)
 
TimestampTz get_timeout_finish_time (TimeoutId id)
 

Typedef Documentation

◆ timeout_handler_proc

typedef void(* timeout_handler_proc) (void)

Definition at line 44 of file timeout.h.

◆ TimeoutId

typedef enum TimeoutId TimeoutId

◆ TimeoutType

typedef enum TimeoutType TimeoutType

Enumeration Type Documentation

◆ TimeoutId

enum TimeoutId
Enumerator
STARTUP_PACKET_TIMEOUT 
DEADLOCK_TIMEOUT 
LOCK_TIMEOUT 
STATEMENT_TIMEOUT 
STANDBY_DEADLOCK_TIMEOUT 
STANDBY_TIMEOUT 
STANDBY_LOCK_TIMEOUT 
IDLE_IN_TRANSACTION_SESSION_TIMEOUT 
IDLE_SESSION_TIMEOUT 
CLIENT_CONNECTION_CHECK_TIMEOUT 
STARTUP_PROGRESS_TIMEOUT 
USER_TIMEOUT 
MAX_TIMEOUTS 

Definition at line 23 of file timeout.h.

24 {
25  /* Predefined timeout reasons */
37  /* First user-definable timeout reason */
39  /* Maximum number of timeout reasons */
41 } TimeoutId;
TimeoutId
Definition: timeout.h:24
@ STARTUP_PROGRESS_TIMEOUT
Definition: timeout.h:36
@ STANDBY_LOCK_TIMEOUT
Definition: timeout.h:32
@ IDLE_SESSION_TIMEOUT
Definition: timeout.h:34
@ STARTUP_PACKET_TIMEOUT
Definition: timeout.h:26
@ IDLE_IN_TRANSACTION_SESSION_TIMEOUT
Definition: timeout.h:33
@ LOCK_TIMEOUT
Definition: timeout.h:28
@ STANDBY_DEADLOCK_TIMEOUT
Definition: timeout.h:30
@ STATEMENT_TIMEOUT
Definition: timeout.h:29
@ DEADLOCK_TIMEOUT
Definition: timeout.h:27
@ MAX_TIMEOUTS
Definition: timeout.h:40
@ USER_TIMEOUT
Definition: timeout.h:38
@ CLIENT_CONNECTION_CHECK_TIMEOUT
Definition: timeout.h:35
@ STANDBY_TIMEOUT
Definition: timeout.h:31

◆ TimeoutType

Enumerator
TMPARAM_AFTER 
TMPARAM_AT 
TMPARAM_EVERY 

Definition at line 49 of file timeout.h.

50 {
52  TMPARAM_AT,
54 } TimeoutType;
TimeoutType
Definition: timeout.h:50
@ TMPARAM_AT
Definition: timeout.h:52
@ TMPARAM_EVERY
Definition: timeout.h:53
@ TMPARAM_AFTER
Definition: timeout.h:51

Function Documentation

◆ disable_all_timeouts()

void disable_all_timeouts ( bool  keep_indicators)

Definition at line 742 of file timeout.c.

743 {
744  int i;
745 
746  disable_alarm();
747 
748  /*
749  * We used to disable the timer interrupt here, but in common usage
750  * patterns it's cheaper to leave it enabled; that may save us from having
751  * to enable it again shortly. See comments in schedule_alarm().
752  */
753 
755 
756  for (i = 0; i < MAX_TIMEOUTS; i++)
757  {
758  all_timeouts[i].active = false;
759  if (!keep_indicators)
760  all_timeouts[i].indicator = false;
761  }
762 }
int i
Definition: isn.c:73
volatile bool active
Definition: timeout.c:31
volatile bool indicator
Definition: timeout.c:32
#define disable_alarm()
Definition: timeout.c:69
static timeout_params all_timeouts[MAX_TIMEOUTS]
Definition: timeout.c:45
static volatile int num_active_timeouts
Definition: timeout.c:52

References timeout_params::active, all_timeouts, disable_alarm, i, timeout_params::indicator, MAX_TIMEOUTS, and num_active_timeouts.

Referenced by AutoVacLauncherMain(), PostgresMain(), ResolveRecoveryConflictWithBufferPin(), and ResolveRecoveryConflictWithLock().

◆ disable_timeout()

void disable_timeout ( TimeoutId  id,
bool  keep_indicator 
)

Definition at line 676 of file timeout.c.

677 {
678  /* Assert request is sane */
680  Assert(all_timeouts[id].timeout_handler != NULL);
681 
682  /* Disable timeout interrupts for safety. */
683  disable_alarm();
684 
685  /* Find the timeout and remove it from the active list. */
686  if (all_timeouts[id].active)
688 
689  /* Mark it inactive, whether it was active or not. */
690  if (!keep_indicator)
691  all_timeouts[id].indicator = false;
692 
693  /* Reschedule the interrupt, if any timeouts remain active. */
694  if (num_active_timeouts > 0)
696 }
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1580
Assert(fmt[strlen(fmt) - 1] !='\n')
static int find_active_timeout(TimeoutId id)
Definition: timeout.c:95
static bool all_timeouts_initialized
Definition: timeout.c:46
static void schedule_alarm(TimestampTz now)
Definition: timeout.c:209
static void remove_timeout_index(int index)
Definition: timeout.c:136

References all_timeouts, all_timeouts_initialized, Assert(), disable_alarm, find_active_timeout(), GetCurrentTimestamp(), timeout_params::indicator, num_active_timeouts, remove_timeout_index(), and schedule_alarm().

Referenced by BackendInitialize(), begin_startup_progress_phase(), disable_statement_timeout(), enable_statement_timeout(), PerformAuthentication(), PostgresMain(), ProcSleep(), and StandbyTimeoutHandler().

◆ disable_timeouts()

void disable_timeouts ( const DisableTimeoutParams timeouts,
int  count 
)

Definition at line 709 of file timeout.c.

710 {
711  int i;
712 
714 
715  /* Disable timeout interrupts for safety. */
716  disable_alarm();
717 
718  /* Cancel the timeout(s). */
719  for (i = 0; i < count; i++)
720  {
721  TimeoutId id = timeouts[i].id;
722 
723  Assert(all_timeouts[id].timeout_handler != NULL);
724 
725  if (all_timeouts[id].active)
727 
728  if (!timeouts[i].keep_indicator)
729  all_timeouts[id].indicator = false;
730  }
731 
732  /* Reschedule the interrupt, if any timeouts remain active. */
733  if (num_active_timeouts > 0)
735 }
TimeoutId id
Definition: timeout.h:69

References all_timeouts, all_timeouts_initialized, Assert(), disable_alarm, find_active_timeout(), GetCurrentTimestamp(), i, DisableTimeoutParams::id, timeout_params::indicator, num_active_timeouts, remove_timeout_index(), and schedule_alarm().

Referenced by LockErrorCleanup(), and ProcSleep().

◆ enable_timeout_after()

void enable_timeout_after ( TimeoutId  id,
int  delay_ms 
)

Definition at line 551 of file timeout.c.

552 {
554  TimestampTz fin_time;
555 
556  /* Disable timeout interrupts for safety. */
557  disable_alarm();
558 
559  /* Queue the timeout at the appropriate time. */
561  fin_time = TimestampTzPlusMilliseconds(now, delay_ms);
562  enable_timeout(id, now, fin_time, 0);
563 
564  /* Set the timer interrupt. */
566 }
Datum now(PG_FUNCTION_ARGS)
Definition: timestamp.c:1544
int64 TimestampTz
Definition: timestamp.h:39
static void enable_timeout(TimeoutId id, TimestampTz now, TimestampTz fin_time, int interval_in_ms)
Definition: timeout.c:157
#define TimestampTzPlusMilliseconds(tz, ms)
Definition: timestamp.h:56

References disable_alarm, enable_timeout(), GetCurrentTimestamp(), now(), schedule_alarm(), and TimestampTzPlusMilliseconds.

Referenced by BackendInitialize(), enable_statement_timeout(), PerformAuthentication(), PostgresMain(), ProcessInterrupts(), ProcSleep(), and start_xact_command().

◆ enable_timeout_at()

void enable_timeout_at ( TimeoutId  id,
TimestampTz  fin_time 
)

Definition at line 598 of file timeout.c.

599 {
601 
602  /* Disable timeout interrupts for safety. */
603  disable_alarm();
604 
605  /* Queue the timeout at the appropriate time. */
607  enable_timeout(id, now, fin_time, 0);
608 
609  /* Set the timer interrupt. */
611 }

References disable_alarm, enable_timeout(), GetCurrentTimestamp(), now(), and schedule_alarm().

◆ enable_timeout_every()

void enable_timeout_every ( TimeoutId  id,
TimestampTz  fin_time,
int  delay_ms 
)

Definition at line 575 of file timeout.c.

576 {
578 
579  /* Disable timeout interrupts for safety. */
580  disable_alarm();
581 
582  /* Queue the timeout at the appropriate time. */
584  enable_timeout(id, now, fin_time, delay_ms);
585 
586  /* Set the timer interrupt. */
588 }

References disable_alarm, enable_timeout(), GetCurrentTimestamp(), now(), and schedule_alarm().

Referenced by begin_startup_progress_phase().

◆ enable_timeouts()

void enable_timeouts ( const EnableTimeoutParams timeouts,
int  count 
)

Definition at line 621 of file timeout.c.

622 {
624  int i;
625 
626  /* Disable timeout interrupts for safety. */
627  disable_alarm();
628 
629  /* Queue the timeout(s) at the appropriate times. */
631 
632  for (i = 0; i < count; i++)
633  {
634  TimeoutId id = timeouts[i].id;
635  TimestampTz fin_time;
636 
637  switch (timeouts[i].type)
638  {
639  case TMPARAM_AFTER:
640  fin_time = TimestampTzPlusMilliseconds(now,
641  timeouts[i].delay_ms);
642  enable_timeout(id, now, fin_time, 0);
643  break;
644 
645  case TMPARAM_AT:
646  enable_timeout(id, now, timeouts[i].fin_time, 0);
647  break;
648 
649  case TMPARAM_EVERY:
650  fin_time = TimestampTzPlusMilliseconds(now,
651  timeouts[i].delay_ms);
652  enable_timeout(id, now, fin_time, timeouts[i].delay_ms);
653  break;
654 
655  default:
656  elog(ERROR, "unrecognized timeout type %d",
657  (int) timeouts[i].type);
658  break;
659  }
660  }
661 
662  /* Set the timer interrupt. */
664 }
#define ERROR
Definition: elog.h:33
#define elog(elevel,...)
Definition: elog.h:218
TimeoutId id
Definition: timeout.h:58

References disable_alarm, elog, enable_timeout(), ERROR, GetCurrentTimestamp(), i, EnableTimeoutParams::id, now(), schedule_alarm(), TimestampTzPlusMilliseconds, TMPARAM_AFTER, TMPARAM_AT, TMPARAM_EVERY, and generate_unaccent_rules::type.

Referenced by ProcSleep(), ResolveRecoveryConflictWithBufferPin(), and ResolveRecoveryConflictWithLock().

◆ get_timeout_active()

bool get_timeout_active ( TimeoutId  id)

Definition at line 771 of file timeout.c.

772 {
773  return all_timeouts[id].active;
774 }

References timeout_params::active, and all_timeouts.

Referenced by disable_statement_timeout(), enable_statement_timeout(), and start_xact_command().

◆ get_timeout_finish_time()

TimestampTz get_timeout_finish_time ( TimeoutId  id)

Definition at line 818 of file timeout.c.

819 {
820  return all_timeouts[id].fin_time;
821 }
TimestampTz fin_time
Definition: timeout.c:38

References all_timeouts, and timeout_params::fin_time.

Referenced by ProcessInterrupts().

◆ get_timeout_indicator()

bool get_timeout_indicator ( TimeoutId  id,
bool  reset_indicator 
)

Definition at line 784 of file timeout.c.

785 {
786  if (all_timeouts[id].indicator)
787  {
788  if (reset_indicator)
789  all_timeouts[id].indicator = false;
790  return true;
791  }
792  return false;
793 }

References all_timeouts, and timeout_params::indicator.

Referenced by ProcessInterrupts().

◆ get_timeout_start_time()

TimestampTz get_timeout_start_time ( TimeoutId  id)

Definition at line 804 of file timeout.c.

805 {
806  return all_timeouts[id].start_time;
807 }
TimestampTz start_time
Definition: timeout.c:37

References all_timeouts, and timeout_params::start_time.

Referenced by ProcSleep().

◆ InitializeTimeouts()

void InitializeTimeouts ( void  )

Definition at line 461 of file timeout.c.

462 {
463  int i;
464 
465  /* Initialize, or re-initialize, all local state */
466  disable_alarm();
467 
469 
470  for (i = 0; i < MAX_TIMEOUTS; i++)
471  {
472  all_timeouts[i].index = i;
473  all_timeouts[i].active = false;
474  all_timeouts[i].indicator = false;
477  all_timeouts[i].fin_time = 0;
479  }
480 
482 
483  /* Now establish the signal handler */
485 }
pqsigfunc pqsignal(int signum, pqsigfunc handler)
Definition: signal.c:170
int interval_in_ms
Definition: timeout.c:39
timeout_handler_proc timeout_handler
Definition: timeout.c:35
TimeoutId index
Definition: timeout.c:28
static void handle_sig_alarm(SIGNAL_ARGS)
Definition: timeout.c:351
#define SIGALRM
Definition: win32_port.h:173

References timeout_params::active, all_timeouts, all_timeouts_initialized, disable_alarm, timeout_params::fin_time, handle_sig_alarm(), i, timeout_params::index, timeout_params::indicator, timeout_params::interval_in_ms, MAX_TIMEOUTS, num_active_timeouts, pqsignal(), SIGALRM, timeout_params::start_time, and timeout_params::timeout_handler.

Referenced by AutoVacLauncherMain(), AutoVacWorkerMain(), BackendInitialize(), PostgresMain(), StartBackgroundWorker(), StartupProcessMain(), and WalSndSignals().

◆ RegisterTimeout()

TimeoutId RegisterTimeout ( TimeoutId  id,
timeout_handler_proc  handler 
)

Definition at line 496 of file timeout.c.

497 {
499 
500  /* There's no need to disable the signal handler here. */
501 
502  if (id >= USER_TIMEOUT)
503  {
504  /* Allocate a user-defined timeout reason */
505  for (id = USER_TIMEOUT; id < MAX_TIMEOUTS; id++)
506  if (all_timeouts[id].timeout_handler == NULL)
507  break;
508  if (id >= MAX_TIMEOUTS)
509  ereport(FATAL,
510  (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED),
511  errmsg("cannot add more timeout reasons")));
512  }
513 
514  Assert(all_timeouts[id].timeout_handler == NULL);
515 
516  all_timeouts[id].timeout_handler = handler;
517 
518  return id;
519 }
int errcode(int sqlerrcode)
Definition: elog.c:698
int errmsg(const char *fmt,...)
Definition: elog.c:909
#define FATAL
Definition: elog.h:35
#define ereport(elevel,...)
Definition: elog.h:143

References all_timeouts, all_timeouts_initialized, Assert(), ereport, errcode(), errmsg(), FATAL, MAX_TIMEOUTS, timeout_params::timeout_handler, and USER_TIMEOUT.

Referenced by BackendInitialize(), InitPostgres(), StartupProcessMain(), and StartupXLOG().

◆ reschedule_timeouts()

void reschedule_timeouts ( void  )

Definition at line 531 of file timeout.c.

532 {
533  /* For flexibility, allow this to be called before we're initialized. */
535  return;
536 
537  /* Disable timeout interrupts for safety. */
538  disable_alarm();
539 
540  /* Reschedule the interrupt, if any timeouts remain active. */
541  if (num_active_timeouts > 0)
543 }

References all_timeouts_initialized, disable_alarm, GetCurrentTimestamp(), num_active_timeouts, and schedule_alarm().

Referenced by AbortSubTransaction(), and AbortTransaction().