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