summaryrefslogtreecommitdiff
path: root/shared/debug.h
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-23 20:56:22 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-23 20:56:22 +0200
commitea053d96f7e89e053d4af8d39b04c5428760345f (patch)
tree8182ca73675ad3933b0f38cb48a99c69101309b4 /shared/debug.h
parent8c27290245b7bcc7cd2f72f3b4a7562294b43bbe (diff)
Big renaming, move some more functionality to shared lib
Diffstat (limited to 'shared/debug.h')
-rw-r--r--shared/debug.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/shared/debug.h b/shared/debug.h
new file mode 100644
index 0000000..8581a9a
--- /dev/null
+++ b/shared/debug.h
@@ -0,0 +1,94 @@
+#ifndef foodebughfoo
+#define foodebughfoo
+
+enum debug_lvl {
+ DBG_ERROR = (0x1 << 1),
+ DBG_INFO = (0x1 << 2),
+ DBG_VERBOSE = (0x1 << 3),
+ DBG_CFG = (0x1 << 4),
+ DBG_REF = (0x1 << 5),
+ DBG_MALLOC = (0x1 << 6),
+ DBG_ANN = (0x1 << 7),
+ DBG_SIG = (0x1 << 8),
+ DBG_UR = (0x1 << 9),
+ DBG_SRV = (0x1 << 10),
+ DBG_PROXY = (0x1 << 11),
+ DBG_RCON = (0x1 << 12),
+ DBG_IDLE = (0x1 << 13),
+ DBG_IGMP = (0x1 << 14),
+ DBG_SYSD = (0x1 << 15),
+ DBG_DNS = (0x1 << 16),
+ DBG_TIMER = (0x1 << 17),
+};
+
+static inline bool
+debug_enabled(enum debug_lvl lvl)
+{
+ return !!(lvl & debug_mask);
+}
+
+/* These need to be defined in the linking binary */
+void __debug(enum debug_lvl lvl, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
+
+void __die(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
+
+#define __ifdebug(lvl, fmt, ...) \
+ do { \
+ if (debug_enabled((lvl))) \
+ __debug((lvl), fmt "\n"__VA_OPT__(,) __VA_ARGS__); \
+ } while (0)
+
+#define debug(lvl, fmt, ...) __ifdebug((lvl), "%s:%s:%i: " fmt, \
+ __FILE__, __func__, __LINE__ \
+ __VA_OPT__(,) __VA_ARGS__)
+#define verbose(fmt, ...) __ifdebug(DBG_VERBOSE, fmt, __VA_ARGS__)
+#define info(fmt, ...) __ifdebug(DBG_INFO, fmt, __VA_ARGS__)
+#define error(fmt, ...) __ifdebug(DBG_ERROR, "%s:%s:%i: " fmt, \
+ __FILE__, __func__, __LINE__ \
+ __VA_OPT__(,) __VA_ARGS__)
+
+#define die(fmt, ...) \
+ __die("%s:%s:%i: " fmt "\n", \
+ __FILE__, __func__, __LINE__ \
+ __VA_OPT__(,) __VA_ARGS__)
+
+#define assert_log(expr, msg) \
+ ((expr) ? \
+ (true) : \
+ (__debug(DBG_ERROR, "%s:%s:%i: assertion \"" msg "\" failed\n", \
+ __FILE__, __func__, __LINE__), false))
+
+#define assert_return(expr, ...) \
+ do { \
+ if (!assert_log(expr, #expr)) \
+ return __VA_ARGS__; \
+ } while (0)
+
+#define assert_return_silent(expr, ...) \
+ do { \
+ if (!(expr)) \
+ return __VA_ARGS__; \
+ } while (0)
+
+#define assert_die(expr, msg) \
+ do { \
+ if (!assert_log(expr, #expr)) \
+ die(msg); \
+ } while (0)
+
+#define assert_task_alive_or(lvl, t, cmd) \
+do { \
+ if (!(t)) { \
+ error("invalid task"); \
+ cmd; \
+ } \
+ \
+ if ((t)->dead) { \
+ debug((lvl), "task dead"); \
+ cmd; \
+ } \
+} while(0)
+
+#define assert_task_alive(lvl, t) assert_task_alive_or((lvl), (t), return)
+
+#endif