#include #include elog_t *elog_init(void *arena, size_t size) { elog_t *ptr = (elog_t *)arena; ptr->buflen = size - sizeof(elog_t); // Adjust for the size of the elog_t structure ptr->offset = 0; return ptr; } int elog_put(elog_t *log, const char *const msg, int n, msgparam_t args[]) { elog_entry_t *e = (elog_entry_t *)(log->buffer + log->offset); // 计算当前可写的位置e(即log->buffer) long esize = n * sizeof(msgparam_t); // 参数占用字节数 long newoff = log->offset + sizeof(elog_entry_t) + esize; // 计算新的偏移量,开始是elog_entry_t头 + n个msg(id和长度组成) if (newoff < log->buflen) { e->msgid = MSGPTR_MAKE(n, (msgptr_t)msg); // 通过字符串地址和个数生成msgid,并写入e memcpy(e->data, args, esize); // 参数列表写入e log->offset = newoff; return 1; } return 0; } int elog_put_str(elog_t *log, const char *const msg, const char *str) { elog_entry_t *e = (elog_entry_t *)(log->buffer + log->offset); // 计算当前可写的位置e(即log->buffer) long esize = strlen(str) + 1; // 参数占用字节数 long newoff = log->offset + sizeof(elog_entry_t) + esize; // 计算新的偏移量,开始是elog_entry_t头 + n个msg(id和长度组成) if (newoff < log->buflen) { e->msgid = MSGPTR_MAKE(STR_FIXED_LEN, (msgptr_t)msg); // 通过字符串地址和个数生成msgid,并写入e memcpy(e->data, str, esize); // 参数列表写入e log->offset = newoff; return 1; } return 0; } void elog_flush(elog_t *log, elog_flush_func_t func, void *ctx) { long off = 0; while (off < log->offset) // 也可以直接发送出去上位机,在上位机端解码 { elog_entry_t *e = ((elog_entry_t *)(log->buffer + off)); size_t len = MSGPTR_LEN(e->msgid) * sizeof(long); if (STR_FIXED_LEN == MSGPTR_LEN(e->msgid)) { len = strlen((void *)e->data) + 1; } size_t incr = sizeof(elog_entry_t) + len; off += incr; func(e, incr, ctx); // 解出一个e[id + data] } log->offset = 0; }