/* SPDX-License-Identifier: GPL-2.0 */ #ifndef foodebughfoo #define foodebughfoo /* FIXME: Should these be shared? */ /* clang-format off */ 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), }; /* clang-format on */ static inline bool debug_enabled(enum debug_lvl lvl) { return !!(lvl & debug_mask); } #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