#include "event-filter.h"
#include "array.h"
#include "llist.h"
+#include "time-util.h"
#include "str.h"
#include "strescape.h"
#include "ioloop.h"
event->id = ++event_id_counter;
event->pool = pool;
event->tv_created_ioloop = ioloop_timeval;
+ if (gettimeofday(&event->tv_created, NULL) < 0)
+ i_panic("gettimeofday() failed: %m");
event->source_filename = p_strdup(pool, source_filename);
event->source_linenum = source_linenum;
if (parent != NULL) {
/* This event only intends to extend the parent event.
Use the parent's creation timestamp. */
event->tv_created_ioloop = parent->tv_created_ioloop;
+ event->tv_created = parent->tv_created;
event_last_passthrough = &event->event_passthrough;
} else {
event_last_passthrough = &parent->event_passthrough;
void event_get_create_time(struct event *event, struct timeval *tv_r)
{
- *tv_r = event->tv_created_ioloop;
+ *tv_r = event->tv_created;
}
bool event_get_last_send_time(struct event *event, struct timeval *tv_r)
return tv_r->tv_sec != 0;
}
+void event_get_last_duration(struct event *event, intmax_t *duration_r)
+{
+ if (event->tv_last_sent.tv_sec == 0) {
+ *duration_r = 0;
+ return;
+ }
+ *duration_r = timeval_diff_usecs(&event->tv_last_sent, &event->tv_created);
+}
+
const struct event_field *
event_get_fields(struct event *event, unsigned int *count_r)
{
void event_vsend(struct event *event, struct failure_context *ctx,
const char *fmt, va_list args)
{
- event->tv_last_sent = ioloop_timeval;
+ if (gettimeofday(&event->tv_last_sent, NULL) < 0)
+ i_panic("gettimeofday() failed: %m");
if (event_send_callbacks(event, EVENT_CALLBACK_TYPE_EVENT,
ctx, fmt, args)) {
if (ctx->type != LOG_TYPE_DEBUG ||
void event_export(const struct event *event, string_t *dest)
{
/* required fields: */
- str_printfa(dest, "%"PRIdTIME_T"\t%u",
+ str_printfa(dest, "%"PRIdTIME_T"\t%u\t%"PRIdTIME_T"\t%u",
event->tv_created_ioloop.tv_sec,
- (unsigned int)event->tv_created_ioloop.tv_usec);
+ (unsigned int)event->tv_created_ioloop.tv_usec,
+ event->tv_created.tv_sec,
+ (unsigned int)event->tv_created.tv_usec);
/* optional fields: */
if (event->source_filename != NULL) {
return FALSE;
}
args += 2;
+ if (!event_import_tv(args[0], args[1], &event->tv_created, &error)) {
+ *error_r = t_strdup_printf("Invalid tv_created: %s", error);
+ return FALSE;
+ }
+ args += 2;
/* optional fields: */
while (*args != NULL) {
/* Get the time when the event was last sent. Returns TRUE if time was
returned, FALSE if event has never been sent. */
bool event_get_last_send_time(struct event *event, struct timeval *tv_r);
+/* Get the event duration field, calculated after event has been sent. */
+void event_get_last_duration(struct event *event, intmax_t *duration_msec_r);
/* Returns field for a given key, or NULL if it doesn't exist. If the key
isn't found from the event itself, find it from parent events. */
const struct event_field *