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