1/*-------------------------------------------------------------------------
2 *
3 * timeout.h
4 * Routines to multiplex SIGALRM interrupts for multiple timeout reasons.
5 *
6 *
7 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/utils/timeout.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef TIMEOUT_H
15#define TIMEOUT_H
16
17#include "datatype/timestamp.h"
18
19/*
20 * Identifiers for timeout reasons. Note that in case multiple timeouts
21 * trigger at the same time, they are serviced in the order of this enum.
22 */
23typedef enum TimeoutId
24{
25 /* Predefined timeout reasons */
26 STARTUP_PACKET_TIMEOUT,
27 DEADLOCK_TIMEOUT,
28 LOCK_TIMEOUT,
29 STATEMENT_TIMEOUT,
30 STANDBY_DEADLOCK_TIMEOUT,
31 STANDBY_TIMEOUT,
32 STANDBY_LOCK_TIMEOUT,
33 IDLE_IN_TRANSACTION_SESSION_TIMEOUT,
34 /* First user-definable timeout reason */
35 USER_TIMEOUT,
36 /* Maximum number of timeout reasons */
37 MAX_TIMEOUTS = 16
38} TimeoutId;
39
40/* callback function signature */
41typedef void (*timeout_handler_proc) (void);
42
43/*
44 * Parameter structure for setting multiple timeouts at once
45 */
46typedef enum TimeoutType
47{
48 TMPARAM_AFTER,
49 TMPARAM_AT
50} TimeoutType;
51
52typedef struct
53{
54 TimeoutId id; /* timeout to set */
55 TimeoutType type; /* TMPARAM_AFTER or TMPARAM_AT */
56 int delay_ms; /* only used for TMPARAM_AFTER */
57 TimestampTz fin_time; /* only used for TMPARAM_AT */
58} EnableTimeoutParams;
59
60/*
61 * Parameter structure for clearing multiple timeouts at once
62 */
63typedef struct
64{
65 TimeoutId id; /* timeout to clear */
66 bool keep_indicator; /* keep the indicator flag? */
67} DisableTimeoutParams;
68
69/* timeout setup */
70extern void InitializeTimeouts(void);
71extern TimeoutId RegisterTimeout(TimeoutId id, timeout_handler_proc handler);
72extern void reschedule_timeouts(void);
73
74/* timeout operation */
75extern void enable_timeout_after(TimeoutId id, int delay_ms);
76extern void enable_timeout_at(TimeoutId id, TimestampTz fin_time);
77extern void enable_timeouts(const EnableTimeoutParams *timeouts, int count);
78extern void disable_timeout(TimeoutId id, bool keep_indicator);
79extern void disable_timeouts(const DisableTimeoutParams *timeouts, int count);
80extern void disable_all_timeouts(bool keep_indicators);
81
82/* accessors */
83extern bool get_timeout_indicator(TimeoutId id, bool reset_indicator);
84extern TimestampTz get_timeout_start_time(TimeoutId id);
85extern TimestampTz get_timeout_finish_time(TimeoutId id);
86
87#endif /* TIMEOUT_H */
88