Skip to content

Commit b883ec4

Browse files
committed
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.
1 parent 0abccc6 commit b883ec4

File tree

2 files changed

+25
-15
lines changed

2 files changed

+25
-15
lines changed

src/rt/rust_kernel.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#include "rust_internal.h"
22

33
#define KLOG(...) \
4-
if (_log.is_tracing(rust_log::KERN)) { \
5-
log(rust_log::KERN, __VA_ARGS__); \
6-
} else
4+
do { \
5+
if (_log.is_tracing(rust_log::KERN)) { \
6+
log(rust_log::KERN, __VA_ARGS__); \
7+
} \
8+
} while(0)
79

810
rust_kernel::rust_kernel(rust_srv *srv) :
911
_region(&srv->local_region),

src/rt/rust_log.h

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
#ifndef RUST_LOG_H
22
#define RUST_LOG_H
33

4-
#define DLOG(dom, mask, ...) \
5-
if ((dom)->get_log().is_tracing(mask)) { \
6-
(dom)->log(mask, __VA_ARGS__); \
7-
} else
8-
#define LOG(task, mask, ...) \
4+
#define DLOG(dom, mask, ...) \
5+
do { \
6+
rust_dom *_dom = dom; \
7+
uint32_t _mask = mask; \
8+
if ((_dom)->get_log().is_tracing(_mask)) { \
9+
(_dom)->log(_mask, __VA_ARGS__); \
10+
} \
11+
} while(0)
12+
#define LOG(task, mask, ...) \
913
DLOG((task)->dom, mask, __VA_ARGS__)
10-
#define LOG_I(task, mask, ...) \
11-
if ((task)->dom->get_log().is_tracing(mask)) { \
12-
(task)->dom->get_log().reset_indent(0); \
13-
(task)->dom->log(mask, __VA_ARGS__); \
14-
(task)->dom->get_log().indent(); \
15-
} else
16-
#define LOGPTR(dom, msg, ptrval) \
14+
#define LOG_I(task, mask, ...) \
15+
do { \
16+
rust_task *_task = task; \
17+
uint32_t _mask = mask; \
18+
if ((_task)->dom->get_log().is_tracing(_mask)) { \
19+
(_task)->dom->get_log().reset_indent(0); \
20+
(_task)->dom->log(_mask, __VA_ARGS__); \
21+
(_task)->dom->get_log().indent(); \
22+
} \
23+
} while(0)
24+
#define LOGPTR(dom, msg, ptrval) \
1725
DLOG(dom, rust_log::MEM, "%s 0x%" PRIxPTR, msg, ptrval)
1826

1927
class rust_dom;

0 commit comments

Comments
 (0)