|
|
|
|
#ifndef _EVENTLOG_H_
|
|
|
|
|
#define _EVENTLOG_H_
|
|
|
|
|
|
|
|
|
|
#include <stdatomic.h>
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
|
|
#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_ */
|
|
|
|
|
|