/src/dovecot/src/lib/lib-event-private.h
Line | Count | Source |
1 | | #ifndef LIB_EVENT_PRIVATE_H |
2 | | #define LIB_EVENT_PRIVATE_H |
3 | | |
4 | | #include <sys/resource.h> |
5 | | |
6 | | struct event_pointer { |
7 | | const char *key; |
8 | | void *value; |
9 | | }; |
10 | | |
11 | | struct event { |
12 | | /* linked list of all events, newest first */ |
13 | | struct event *prev, *next; |
14 | | |
15 | | int refcount; |
16 | | pool_t pool; |
17 | | struct event *parent; |
18 | | uint64_t id; |
19 | | |
20 | | /* Avoid sending the event to stats over and over. The 'change_id' |
21 | | increments every time something about this event changes. If |
22 | | 'sent_to_stats_id' matches 'change_id', we skip sending this |
23 | | event out. If it doesn't match, we send it and set |
24 | | 'sent_to_stats_id' to 'change_id'. sent_to_stats_id=0 is reserved |
25 | | for "event hasn't been sent". 'change_id' can never be 0. */ |
26 | | uint32_t change_id; |
27 | | uint32_t sent_to_stats_id; |
28 | | |
29 | | char *log_prefix; |
30 | | unsigned int log_prefixes_dropped; |
31 | | /* sending_debug_log can be used if this value matches |
32 | | event_filter_replace_counter. */ |
33 | | unsigned int debug_level_checked_filter_counter; |
34 | | event_log_prefix_callback_t *log_prefix_callback; |
35 | | void *log_prefix_callback_context; |
36 | | event_log_message_callback_t *log_message_callback; |
37 | | void *log_message_callback_context; |
38 | | ARRAY(struct event_pointer) pointers; |
39 | | /* If the event's log level is at least this high, log it. If it's |
40 | | lower, check for debug log filters etc. */ |
41 | | enum log_type min_log_level; |
42 | | |
43 | | bool log_prefix_from_system_pool:1; |
44 | | bool log_prefix_replace:1; |
45 | | bool passthrough:1; |
46 | | bool forced_debug:1; |
47 | | bool forced_never_debug:1; |
48 | | bool always_log_source:1; |
49 | | bool sending_debug_log:1; |
50 | | bool disable_callbacks:1; |
51 | | |
52 | | /* Fields that are exported & imported: */ |
53 | | struct timeval tv_created_ioloop; |
54 | | struct timeval tv_created; |
55 | | struct timeval tv_last_sent; |
56 | | struct rusage ru_last; |
57 | | |
58 | | const char *source_filename; |
59 | | unsigned int source_linenum; |
60 | | |
61 | | /* This is the event's name while it's being sent. It'll be removed |
62 | | after the event is sent. */ |
63 | | char *sending_name; |
64 | | |
65 | | ARRAY(struct event_category *) categories; |
66 | | ARRAY(struct event_field) fields; |
67 | | }; |
68 | | |
69 | | enum event_callback_type { |
70 | | /* Event was just created */ |
71 | | EVENT_CALLBACK_TYPE_CREATE, |
72 | | /* Event is being sent */ |
73 | | EVENT_CALLBACK_TYPE_SEND, |
74 | | /* Event is being freed */ |
75 | | EVENT_CALLBACK_TYPE_FREE, |
76 | | }; |
77 | | |
78 | | /* Returns TRUE if the event should continue to the next handler. Unless |
79 | | stopped, the final handler logs the event if it matches the log filter. */ |
80 | | typedef bool event_callback_t(struct event *event, |
81 | | enum event_callback_type type, |
82 | | struct failure_context *ctx, |
83 | | const char *fmt, va_list args); |
84 | | /* Called when category is registered or unregistered. The parent category |
85 | | is always already registered. */ |
86 | | typedef void event_category_callback_t(struct event_category *category); |
87 | | |
88 | | void event_send(struct event *event, struct failure_context *ctx, |
89 | | const char *fmt, ...) ATTR_FORMAT(3, 4); |
90 | | void event_vsend(struct event *event, struct failure_context *ctx, |
91 | | const char *fmt, va_list args) ATTR_FORMAT(3, 0); |
92 | | |
93 | | struct event *events_get_head(void); |
94 | | |
95 | | /* Find event category by name. This only finds registered categories. */ |
96 | | struct event_category *event_category_find_registered(const char *name); |
97 | | /* Return all registered categories. */ |
98 | | struct event_category *const * |
99 | | event_get_registered_categories(unsigned int *count_r); |
100 | | |
101 | | /* Register callback to be called for event's different states. */ |
102 | | void event_register_callback(event_callback_t *callback); |
103 | | void event_unregister_callback(event_callback_t *callback); |
104 | | |
105 | | /* Register callback to be called whenever categories are registered or |
106 | | unregistered. */ |
107 | | void event_category_register_callback(event_category_callback_t *callback); |
108 | | void event_category_unregister_callback(event_category_callback_t *callback); |
109 | | |
110 | | static inline void event_recalculate_debug_level(struct event *event) |
111 | 0 | { |
112 | 0 | event->debug_level_checked_filter_counter = |
113 | 0 | event_filter_replace_counter - 1; |
114 | 0 | } Unexecuted instantiation: event-log.c:event_recalculate_debug_level Unexecuted instantiation: lib-event.c:event_recalculate_debug_level Unexecuted instantiation: event-filter.c:event_recalculate_debug_level Unexecuted instantiation: event-filter-parser.c:event_recalculate_debug_level |
115 | | |
116 | | #endif |