| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #ifndef NETDATA_EXIT_INITIATED_H |
| 4 | #define NETDATA_EXIT_INITIATED_H |
| 5 | |
| 6 | #include "../libnetdata-base.h" |
| 7 | #include "../template-enum.h" |
| 8 | |
| 9 | typedef enum { |
| 10 | EXIT_REASON_NONE = 0, |
| 11 | |
| 12 | // signals - abnormal termination |
| 13 | EXIT_REASON_SIGBUS = (1 << 0), |
| 14 | EXIT_REASON_SIGSEGV = (1 << 1), |
| 15 | EXIT_REASON_SIGFPE = (1 << 2), |
| 16 | EXIT_REASON_SIGILL = (1 << 3), |
| 17 | EXIT_REASON_SIGABRT = (1 << 4), |
| 18 | EXIT_REASON_SIGSYS = (1 << 5), // Bad system call |
| 19 | EXIT_REASON_SIGXCPU = (1 << 6), // CPU time limit exceeded |
| 20 | EXIT_REASON_SIGXFSZ = (1 << 7), // File size limit exceeded |
| 21 | EXIT_REASON_OUT_OF_MEMORY = (1 << 8), |
| 22 | EXIT_REASON_ALREADY_RUNNING = (1 << 9), |
| 23 | |
| 24 | // abnormal termination via a fatal message |
| 25 | EXIT_REASON_FATAL = (1 << 10), // a fatal message |
| 26 | |
| 27 | // normal termination via APIs |
| 28 | EXIT_REASON_API_QUIT = (1 << 11), // developer only |
| 29 | EXIT_REASON_CMD_EXIT = (1 << 12), // netdatacli |
| 30 | |
| 31 | // signals - normal termination |
| 32 | EXIT_REASON_SIGQUIT = (1 << 13), // rare, but graceful |
| 33 | EXIT_REASON_SIGTERM = (1 << 14), // received on Linux, FreeBSD, MacOS |
| 34 | EXIT_REASON_SIGINT = (1 << 15), // received on Windows on normal termination |
| 35 | |
| 36 | // windows specific, service stop |
| 37 | EXIT_REASON_SERVICE_STOP = (1 << 16), |
| 38 | |
| 39 | // automatically detect when exit_initiated_set() is called |
| 40 | // supports Linux, FreeBSD, MacOS, Windows |
| 41 | EXIT_REASON_SYSTEM_SHUTDOWN = (1 << 17), |
| 42 | |
| 43 | // netdata update |
| 44 | EXIT_REASON_UPDATE = (1 << 18), |
| 45 | |
| 46 | // timeout while shutting down |
| 47 | EXIT_REASON_SHUTDOWN_TIMEOUT = (1 << 19), |
| 48 | } EXIT_REASON; |
| 49 | |
| 50 | #define EXIT_REASON_NORMAL \ |
| 51 | ( \ |
| 52 | EXIT_REASON_SIGINT \ |
| 53 | | EXIT_REASON_SIGTERM \ |
| 54 | | EXIT_REASON_SIGQUIT \ |
| 55 | | EXIT_REASON_API_QUIT \ |
| 56 | | EXIT_REASON_CMD_EXIT \ |
| 57 | | EXIT_REASON_SERVICE_STOP \ |
| 58 | | EXIT_REASON_SYSTEM_SHUTDOWN \ |
| 59 | | EXIT_REASON_UPDATE \ |
| 60 | ) |
| 61 | |
| 62 | #define EXIT_REASON_DEADLY_SIGNAL \ |
| 63 | ( \ |
| 64 | EXIT_REASON_SIGBUS \ |
| 65 | | EXIT_REASON_SIGSEGV \ |
| 66 | | EXIT_REASON_SIGFPE \ |
| 67 | | EXIT_REASON_SIGILL \ |
| 68 | | EXIT_REASON_SIGSYS \ |
| 69 | | EXIT_REASON_SIGXCPU \ |
| 70 | | EXIT_REASON_SIGXFSZ \ |
| 71 | ) |
| 72 | |
| 73 | #define EXIT_REASON_ABNORMAL \ |
| 74 | ( \ |
| 75 | EXIT_REASON_DEADLY_SIGNAL \ |
| 76 | | EXIT_REASON_SIGABRT \ |
| 77 | | EXIT_REASON_FATAL \ |
| 78 | | EXIT_REASON_ALREADY_RUNNING \ |
| 79 | | EXIT_REASON_OUT_OF_MEMORY \ |
| 80 | | EXIT_REASON_SHUTDOWN_TIMEOUT \ |
| 81 | ) |
| 82 | |
| 83 | #define is_deadly_signal(reason) ((reason) & (EXIT_REASON_DEADLY_SIGNAL)) |
| 84 | #define is_exit_reason_normal(reason) (((reason == EXIT_REASON_NONE) || ((reason) & EXIT_REASON_NORMAL)) && !((reason) & EXIT_REASON_ABNORMAL)) |
| 85 | |
| 86 | typedef struct web_buffer BUFFER; |
| 87 | BITMAP_STR_DEFINE_FUNCTIONS_EXTERN(EXIT_REASON); |
| 88 | |
| 89 | void exit_initiated_init(void); |
| 90 | EXIT_REASON exit_initiated_get(void); |
| 91 | void exit_initiated_set(EXIT_REASON reason); |
| 92 | void exit_initiated_add(EXIT_REASON reason); |
| 93 | |
| 94 | #endif //NETDATA_EXIT_INITIATED_H |