#include #include #include #include #include #include "kp_records.h" struct kp_records* kprec_create(int max_recs) { struct kp_records* recs = (struct kp_records*)valloc(KP_RECS_SIZE); *recs = (struct kp_records){ .max_recs = max_recs, .log_lvl = KLOG_DEBUG, .kp_ent_wp = &recs->kp_ents.ents }; llist_init_head(&recs->kp_ents.ents); return recs; } static inline int kprecs_full(struct kp_records* recs) { return recs->cur_recs >= recs->max_recs; } struct kp_entry* kprec_put(struct kp_records* recs, int lvl, char* content, size_t len) { assert(len < 256); struct kp_entry* ent; if (!kprecs_full(recs)) { assert(recs->kp_ent_wp == &recs->kp_ents.ents); ent = (struct kp_entry*)vzalloc(KP_ENT_SIZE); llist_append(&recs->kp_ents.ents, &ent->ents); recs->cur_recs++; } else { recs->kp_ent_wp = recs->kp_ent_wp->next; ent = container_of(recs->kp_ent_wp, struct kp_entry, ents); } vfree_safe(ent->content); char* _content = valloc(len); memcpy(_content, content, len); ent->lvl = lvl; ent->content = _content; ent->time = clock_systime(); ent->len = len; return ent; }