aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Anderson <[email protected]>2011-04-07 20:37:56 -0400
committerBrian Anderson <[email protected]>2011-04-07 22:53:16 -0400
commitb883ec4c9d09848a9c9a0822cde4bef4a347cbab (patch)
tree56880d5c7818ecd71d41ef8d061bea096b2b7223
parentAdd a test case for calling generic functions taking alias args with box types (diff)
downloadrust-b883ec4c9d09848a9c9a0822cde4bef4a347cbab.tar.xz
rust-b883ec4c9d09848a9c9a0822cde4bef4a347cbab.zip
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.
-rw-r--r--src/rt/rust_kernel.cpp8
-rw-r--r--src/rt/rust_log.h32
2 files changed, 25 insertions, 15 deletions
diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp
index 9b8347bc..1eba9585 100644
--- a/src/rt/rust_kernel.cpp
+++ b/src/rt/rust_kernel.cpp
@@ -1,9 +1,11 @@
#include "rust_internal.h"
#define KLOG(...) \
- if (_log.is_tracing(rust_log::KERN)) { \
- log(rust_log::KERN, __VA_ARGS__); \
- } else
+ do { \
+ if (_log.is_tracing(rust_log::KERN)) { \
+ log(rust_log::KERN, __VA_ARGS__); \
+ } \
+ } while(0)
rust_kernel::rust_kernel(rust_srv *srv) :
_region(&srv->local_region),
diff --git a/src/rt/rust_log.h b/src/rt/rust_log.h
index 8d3d4bcb..3b40869b 100644
--- a/src/rt/rust_log.h
+++ b/src/rt/rust_log.h
@@ -1,19 +1,27 @@
#ifndef RUST_LOG_H
#define RUST_LOG_H
-#define DLOG(dom, mask, ...) \
- if ((dom)->get_log().is_tracing(mask)) { \
- (dom)->log(mask, __VA_ARGS__); \
- } else
-#define LOG(task, mask, ...) \
+#define DLOG(dom, mask, ...) \
+ do { \
+ rust_dom *_dom = dom; \
+ uint32_t _mask = 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__)
-#define LOG_I(task, mask, ...) \
- if ((task)->dom->get_log().is_tracing(mask)) { \
- (task)->dom->get_log().reset_indent(0); \
- (task)->dom->log(mask, __VA_ARGS__); \
- (task)->dom->get_log().indent(); \
- } else
-#define LOGPTR(dom, msg, ptrval) \
+#define LOG_I(task, mask, ...) \
+ do { \
+ rust_task *_task = task; \
+ uint32_t _mask = mask; \
+ if ((_task)->dom->get_log().is_tracing(_mask)) { \
+ (_task)->dom->get_log().reset_indent(0); \
+ (_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)
class rust_dom;