diff --git a/selfdrive/common/swaglog.cc b/selfdrive/common/swaglog.cc index d1f15fda74..fcd207d21c 100644 --- a/selfdrive/common/swaglog.cc +++ b/selfdrive/common/swaglog.cc @@ -11,20 +11,27 @@ #include "json11.hpp" -#include "common/timing.h" #include "common/util.h" #include "common/version.h" #include "swaglog.h" -typedef struct LogState { +class LogState { +public: + LogState() = default; + ~LogState(); std::mutex lock; bool inited; json11::Json::object ctx_j; void *zctx; void *sock; int print_level; -} LogState; +}; + +LogState::~LogState() { + zmq_close(sock); + zmq_ctx_destroy(zctx); +} static LogState s = {}; @@ -71,24 +78,26 @@ static void cloudlog_init() { s.inited = true; } -void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func, - const char* fmt, ...) { +void log(int levelnum, const char* filename, int lineno, const char* func, const char* msg, const std::string& log_s) { std::lock_guard lk(s.lock); cloudlog_init(); + if (levelnum >= s.print_level) { + printf("%s: %s\n", filename, msg); + } + char levelnum_c = levelnum; + zmq_send(s.sock, &levelnum_c, 1, ZMQ_NOBLOCK | ZMQ_SNDMORE); + zmq_send(s.sock, log_s.c_str(), log_s.length(), ZMQ_NOBLOCK); +} - char* msg_buf = NULL; +void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func, + const char* fmt, ...) { + char* msg_buf = nullptr; va_list args; va_start(args, fmt); vasprintf(&msg_buf, fmt, args); va_end(args); - if (!msg_buf) { - return; - } - - if (levelnum >= s.print_level) { - printf("%s: %s\n", filename, msg_buf); - } + if (!msg_buf) return; json11::Json log_j = json11::Json::object { {"msg", msg_buf}, @@ -99,15 +108,9 @@ void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func {"funcname", func}, {"created", seconds_since_epoch()} }; - std::string log_s = log_j.dump(); - + log(levelnum, filename, lineno, func, msg_buf, log_s); free(msg_buf); - - char levelnum_c = levelnum; - zmq_send(s.sock, &levelnum_c, 1, ZMQ_NOBLOCK | ZMQ_SNDMORE); - zmq_send(s.sock, log_s.c_str(), log_s.length(), ZMQ_NOBLOCK); - } void cloudlog_bind(const char* k, const char* v) {