You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

59 lines
1.4 KiB

#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_ */