#ifndef LIB_EVENT_PRIVATE_H
#define LIB_EVENT_PRIVATE_H
+#include <sys/resource.h>
+
struct event_pointer {
const char *key;
void *value;
struct timeval tv_created_ioloop;
struct timeval tv_created;
struct timeval tv_last_sent;
+ struct rusage ru_last;
const char *source_filename;
unsigned int source_linenum;
static ARRAY(struct event *) global_event_stack;
static uint64_t event_id_counter = 0;
+static void get_self_rusage(struct rusage *ru_r)
+{
+ if (getrusage(RUSAGE_SELF, ru_r) < 0)
+ i_fatal("getrusage() failed: %m");
+}
+
static struct event *
event_create_internal(struct event *parent, const char *source_filename,
unsigned int source_linenum);
const char *fmt, va_list args)
{
i_gettimeofday(&event->tv_last_sent);
+
+ /* Skip adding user_cpu_usecs if not enabled. */
+ if (event->ru_last.ru_utime.tv_sec != 0 ||
+ event->ru_last.ru_utime.tv_usec != 0) {
+ struct rusage ru_current;
+ get_self_rusage(&ru_current);
+ long long udiff = timeval_diff_usecs(&ru_current.ru_utime,
+ &event->ru_last.ru_utime);
+ event_add_int(event, "user_cpu_usecs", udiff > 0 ? udiff : 0);
+ }
if (event_call_callbacks(event, EVENT_CALLBACK_TYPE_SEND,
ctx, fmt, args)) {
if (ctx->type != LOG_TYPE_DEBUG ||
event_passthrough_event,
};
+void event_enable_user_cpu_usecs(struct event *event)
+{
+ get_self_rusage(&event->ru_last);
+}
+
void lib_event_init(void)
{
i_array_init(&event_handlers, 4);
need to be called. */
void event_send_abort(struct event *event);
+/* Enable "user_cpu_usecs" event field to event by getting current resource
+ usage which will be used in consequent event_send() to calculate
+ cpu time. This function can be called multiple times to update the current
+ resource usage. */
+void event_enable_user_cpu_usecs(struct event *event);
+
void lib_event_init(void);
void lib_event_deinit(void);