#ifndef _EVENTLOG_H_ #define _EVENTLOG_H_ #include #include #include #define EVENTLOG_DATA_MAX_SIZE (128 - 16) #define EVENTLOG_TYPE_STRING 0 #define EVENTLOG_TRACE(event_name, ...) \ eventlog_trace_##event_name(__VA_ARGS__) typedef void (*event_printer_t)(const void* data, char* buf, size_t buf_size); typedef struct { uint32_t id; const char* name; event_printer_t printer; } event_def_t; #define EVENTLOG_REGISTER_EVENT_C(event_name, print_func) \ { .id = EVENT_ID_##event_name, .name = #event_name, .printer = print_func } struct eventlog_entry { atomic_uint_fast64_t timestamp; uint32_t type_id; uint32_t datalen; uint8_t data[EVENTLOG_DATA_MAX_SIZE]; }; struct eventlog_shm_header { uint32_t magic; uint32_t version; atomic_uint_fast64_t tail; uint64_t size; struct eventlog_entry* entries; }; enum eventlog_mode { EVENTLOG_MODE_CREATE = 0, EVENTLOG_MODE_ATTACH = 1, }; int eventlog_init(const char* path, enum eventlog_mode mode); int eventlog_shutdown(); int eventlog_emit_event(uint64_t timestamp, const char* fmt, ...); int eventlog_emit_event_struct(uint64_t timestamp, uint32_t type, void* data, size_t data_size); uint64_t eventlog_get_timestamp(); int eventlog_get_snapshot(uint64_t* head, struct eventlog_entry* buffer, size_t buffer_size, size_t* actual_size); #endif /* _EVENTLOG_H_ */