From b0714d24b3bc237382e2c09edcf8f9c94018a009 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Thu, 20 Oct 2022 13:26:33 +0900 Subject: [PATCH] util: Add helper macros Change-Id: I955e2744468e314250af2bc3479496b992cb604c --- src/util.h | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/util.h b/src/util.h index 4603544..f821c35 100644 --- a/src/util.h +++ b/src/util.h @@ -1,8 +1,84 @@ #ifndef DS_UTIL_H #define DS_UTIL_H +#include #include #include +#include + +#include "libds/log.h" + +#ifndef DS_LIKELY +#ifdef __GNUC__ +#define DS_LIKELY(x) (__builtin_expect(!!(x),1)) +#define DS_UNLIKELY(x) (__builtin_expect(!!(x),0)) +#else +#define DS_LIKELY(x) (x) +#define DS_UNLIKELY(x) (x) +#endif +#endif + +#define DS_RETURN_IF_FAIL(expr) \ + do { \ + if (DS_UNLIKELY(!(expr))) { \ + ds_err("'%s' failed at %s:%u %s()\n", \ + #expr, __FILE__, __LINE__, __func__); \ + return; \ + } \ + } while (false) + +#define DS_RETURN_VAL_IF_FAIL(expr, val) \ + do { \ + if (DS_UNLIKELY(!(expr))) { \ + ds_err("'%s' failed at %s:%u %s()\n", \ + #expr, __FILE__, __LINE__, __func__); \ + return (val); \ + } \ + } while (false) + +#define DS_ASSERT(expr) \ + do { \ + if (DS_UNLIKELY(!(expr))) { \ + ds_err("'%s' failed at %s:%u %s()\n", \ + #expr, __FILE__, __LINE__, __func__); \ + abort(); \ + } \ + } while (false) + +#define DS_ASSERT_NOT_REACHED() \ + do { \ + ds_err("Code should not be reached at %s:%u %s()\n", \ + __FILE__, __LINE__, __func__); \ + abort(); \ + } while (false) + +#define DS_FLAG_MASK(field, mask, flag) (((field) & (mask)) == (flag)) +#define DS_FLAG_IS_SET(field, flag) DS_FLAG_MASK(field, flag, flag) + +#define DS_FLAG_SET(field, flag) ((field) |= (flag)) +#define DS_FLAG_CLEAR(field, flag) ((field) &= ~(__typeof__(field))(flag)) +#define DS_FLAG_UPDATE(field, flag, val) ((val) ? \ + DS_FLAG_SET((field), (flag)) : DS_FLAG_CLEAR((field), (flag))) + +#define DS_MIN(a, b) \ +({ \ + __typeof__(a) _min_a = (a); \ + __typeof__(b) _min_b = (b); \ + DS_LIKELY(_min_a <= _min_b) ? _min_a : _min_b; \ +}) + +#define DS_MAX(a, b) \ +({ \ + __typeof__(a) _max_a = (a); \ + __typeof__(b) _max_b = (b); \ + DS_LIKELY(_max_a >= _max_b) ? _max_a : _max_b; \ +}) + +#define DS_SWAP(a, b) \ +({ \ + __typeof__(a) _t = (a); \ + (a) = b; (b) = _t; \ +}) int64_t timespec_to_msec(const struct timespec *a); -- 2.7.4