Avoid some gotchas with logging macros

I think this is sufficient to eliminate multiple evaluation and the
possibility of accidental miscompilation from the logging macros.
This commit is contained in:
Brian Anderson 2011-04-07 20:37:56 -04:00
parent 0abccc6370
commit b883ec4c9d
2 changed files with 25 additions and 15 deletions

View File

@ -1,9 +1,11 @@
#include "rust_internal.h" #include "rust_internal.h"
#define KLOG(...) \ #define KLOG(...) \
if (_log.is_tracing(rust_log::KERN)) { \ do { \
log(rust_log::KERN, __VA_ARGS__); \ if (_log.is_tracing(rust_log::KERN)) { \
} else log(rust_log::KERN, __VA_ARGS__); \
} \
} while(0)
rust_kernel::rust_kernel(rust_srv *srv) : rust_kernel::rust_kernel(rust_srv *srv) :
_region(&srv->local_region), _region(&srv->local_region),

View File

@ -1,19 +1,27 @@
#ifndef RUST_LOG_H #ifndef RUST_LOG_H
#define RUST_LOG_H #define RUST_LOG_H
#define DLOG(dom, mask, ...) \ #define DLOG(dom, mask, ...) \
if ((dom)->get_log().is_tracing(mask)) { \ do { \
(dom)->log(mask, __VA_ARGS__); \ rust_dom *_dom = dom; \
} else uint32_t _mask = mask; \
#define LOG(task, mask, ...) \ if ((_dom)->get_log().is_tracing(_mask)) { \
(_dom)->log(_mask, __VA_ARGS__); \
} \
} while(0)
#define LOG(task, mask, ...) \
DLOG((task)->dom, mask, __VA_ARGS__) DLOG((task)->dom, mask, __VA_ARGS__)
#define LOG_I(task, mask, ...) \ #define LOG_I(task, mask, ...) \
if ((task)->dom->get_log().is_tracing(mask)) { \ do { \
(task)->dom->get_log().reset_indent(0); \ rust_task *_task = task; \
(task)->dom->log(mask, __VA_ARGS__); \ uint32_t _mask = mask; \
(task)->dom->get_log().indent(); \ if ((_task)->dom->get_log().is_tracing(_mask)) { \
} else (_task)->dom->get_log().reset_indent(0); \
#define LOGPTR(dom, msg, ptrval) \ (_task)->dom->log(_mask, __VA_ARGS__); \
(_task)->dom->get_log().indent(); \
} \
} while(0)
#define LOGPTR(dom, msg, ptrval) \
DLOG(dom, rust_log::MEM, "%s 0x%" PRIxPTR, msg, ptrval) DLOG(dom, rust_log::MEM, "%s 0x%" PRIxPTR, msg, ptrval)
class rust_dom; class rust_dom;