From 0095249feb8f6dbd66ae91720c083c8ec33400d3 Mon Sep 17 00:00:00 2001 From: Guy Zana <guy@cloudius-systems.com> Date: Sun, 3 Mar 2013 10:35:54 +0200 Subject: [PATCH] Added a variadic logger function, and exposed a tprintf (tag printf) to C code --- core/debug.cc | 26 ++++++++++++++++++++++++-- drivers/pci.hh | 8 ++++---- drivers/virtio-net.cc | 8 ++++---- drivers/virtio-vring.hh | 8 ++++---- include/debug.hh | 12 +++--------- include/osv/debug.h | 11 +++++++++++ tests/tst-eventlist.hh | 2 +- 7 files changed, 51 insertions(+), 24 deletions(-) diff --git a/core/debug.cc b/core/debug.cc index f16b85ecd..c3b17cdc1 100644 --- a/core/debug.cc +++ b/core/debug.cc @@ -1,10 +1,12 @@ #include <cstring> +#include <cstdarg> #include <iostream> #include <iomanip> #include "boost/format.hpp" #include "drivers/console.hh" #include "sched.hh" #include "debug.hh" +#include "osv/debug.h" using namespace std; @@ -44,7 +46,7 @@ void logger::add_tag(const char* tag, logger_severity severity) _log_level.insert(make_pair(tag, severity)); } -logger::logger_severity logger::get_tag(const char* tag) +logger_severity logger::get_tag(const char* tag) { auto it = _log_level.find(tag); if (it == _log_level.end()) { @@ -103,14 +105,34 @@ void logger::log(const char* tag, logger_severity severity, const boost::format& } void logger::log(const char* tag, logger_severity severity, const char* _fmt, ...) +{ + va_list ap; + va_start(ap, _fmt); + this->log(tag, severity, _fmt, ap); + va_end(ap); +} + +void logger::log(const char* tag, logger_severity severity, const char* _fmt, va_list ap) { if (this->is_filtered(tag, severity)) { return; } - // FIXME: implement... + unsigned long tid = sched::thread::current()->id(); + kprintf("[%s/%d %s]: ", loggable_severity(severity), tid, tag); + vkprintf(_fmt, ap); + kprintf("\n"); } +extern "C" { +void tprintf(const char* tag, logger_severity severity, const char* _fmt, ...) +{ + va_list ap; + va_start(ap, _fmt); + logger::instance()->log(tag, severity, _fmt, ap); + va_end(ap); +} +} void debug(std::string str, bool lf) { console::write(str.c_str(), str.length(), lf); diff --git a/drivers/pci.hh b/drivers/pci.hh index 18e96696d..7258e7697 100644 --- a/drivers/pci.hh +++ b/drivers/pci.hh @@ -35,10 +35,10 @@ class Driver; #define pci_tag "pci" -#define pci_d(fmt) logger::instance()->log(pci_tag, logger::logger_debug, (fmt)) -#define pci_i(fmt) logger::instance()->log(pci_tag, logger::logger_info, (fmt)) -#define pci_w(fmt) logger::instance()->log(pci_tag, logger::logger_warn, (fmt)) -#define pci_e(fmt) logger::instance()->log(pci_tag, logger::logger_error, (fmt)) +#define pci_d(fmt) logger::instance()->log(pci_tag, logger_debug, (fmt)) +#define pci_i(fmt) logger::instance()->log(pci_tag, logger_info, (fmt)) +#define pci_w(fmt) logger::instance()->log(pci_tag, logger_warn, (fmt)) +#define pci_e(fmt) logger::instance()->log(pci_tag, logger_error, (fmt)) namespace pci { diff --git a/drivers/virtio-net.cc b/drivers/virtio-net.cc index 98e51bb36..14d029b5c 100644 --- a/drivers/virtio-net.cc +++ b/drivers/virtio-net.cc @@ -37,10 +37,10 @@ namespace virtio { int virtio_net::_instance = 0; #define virtio_net_tag "virtio-net" - #define virtio_net_d(fmt) logger::instance()->log(virtio_net_tag, logger::logger_debug, (fmt)) - #define virtio_net_i(fmt) logger::instance()->log(virtio_net_tag, logger::logger_info, (fmt)) - #define virtio_net_w(fmt) logger::instance()->log(virtio_net_tag, logger::logger_warn, (fmt)) - #define virtio_net_e(fmt) logger::instance()->log(virtio_net_tag, logger::logger_error, (fmt)) + #define virtio_net_d(fmt) logger::instance()->log(virtio_net_tag, logger_debug, (fmt)) + #define virtio_net_i(fmt) logger::instance()->log(virtio_net_tag, logger_info, (fmt)) + #define virtio_net_w(fmt) logger::instance()->log(virtio_net_tag, logger_warn, (fmt)) + #define virtio_net_e(fmt) logger::instance()->log(virtio_net_tag, logger_error, (fmt)) virtio_net::virtio_net(virtio_device* dev) diff --git a/drivers/virtio-vring.hh b/drivers/virtio-vring.hh index a2cdf9304..a53a46ca8 100644 --- a/drivers/virtio-vring.hh +++ b/drivers/virtio-vring.hh @@ -8,10 +8,10 @@ class sglist; #define virtio_tag "virtio" -#define virtio_d(fmt) logger::instance()->log(virtio_tag, logger::logger_debug, (fmt)) -#define virtio_i(fmt) logger::instance()->log(virtio_tag, logger::logger_info, (fmt)) -#define virtio_w(fmt) logger::instance()->log(virtio_tag, logger::logger_warn, (fmt)) -#define virtio_e(fmt) logger::instance()->log(virtio_tag, logger::logger_error, (fmt)) +#define virtio_d(fmt) logger::instance()->log(virtio_tag, logger_debug, (fmt)) +#define virtio_i(fmt) logger::instance()->log(virtio_tag, logger_info, (fmt)) +#define virtio_w(fmt) logger::instance()->log(virtio_tag, logger_warn, (fmt)) +#define virtio_e(fmt) logger::instance()->log(virtio_tag, logger_error, (fmt)) namespace virtio { diff --git a/include/debug.hh b/include/debug.hh index 07dc35fd1..d10c7dfe6 100644 --- a/include/debug.hh +++ b/include/debug.hh @@ -4,6 +4,8 @@ #include <iostream> #include <map> #include <string> +#include <cstdarg> +#include <osv/debug.h> #include "boost/format.hpp" typedef boost::format fmt; @@ -13,15 +15,6 @@ class IsaSerialConsole; class logger { public: - enum logger_severity { - logger_debug = 0, - logger_info = 1, - logger_warn = 2, - logger_error = 3, - // Suppress output, even errors - logger_none = 4 - }; - logger(); virtual ~logger(); @@ -38,6 +31,7 @@ public: // void log(const char* tag, logger_severity severity, const boost::format& _fmt); void log(const char* tag, logger_severity severity, const char* _fmt, ...); + void log(const char* tag, logger_severity severity, const char* _fmt, va_list ap); private: static logger* _instance; diff --git a/include/osv/debug.h b/include/osv/debug.h index d1fd04d2c..0b417b35a 100644 --- a/include/osv/debug.h +++ b/include/osv/debug.h @@ -5,6 +5,15 @@ #include <sys/types.h> #include <stdarg.h> +typedef enum logger_severity_e { + logger_debug = 0, + logger_info = 1, + logger_warn = 2, + logger_error = 3, + // Suppress output, even errors + logger_none = 4 + } logger_severity; + __BEGIN_DECLS void debug(const char *msg); void debug_write(const char *msg, size_t len); @@ -13,6 +22,8 @@ int vkprintf(const char *__restrict fmt, va_list ap) __attribute__((format(printf, 1, 0))); int kprintf(const char *__restrict fmt, ...) __attribute__((format(printf, 1, 2))); + +void tprintf(const char* tag, logger_severity severity, const char* _fmt, ...); __END_DECLS #endif /* _DEBUG_H */ diff --git a/tests/tst-eventlist.hh b/tests/tst-eventlist.hh index b9ee01180..cf3bba119 100644 --- a/tests/tst-eventlist.hh +++ b/tests/tst-eventlist.hh @@ -5,7 +5,7 @@ #include "debug.hh" #include "tst-hub.hh" -#define dbg_d(fmt) logger::instance()->log("tst-eventlist", logger::logger_debug, (fmt)) +#define dbg_d(fmt) logger::instance()->log("tst-eventlist", logger_debug, (fmt)) class test_eventlist : public unit_tests::vtest { public: -- GitLab