Libevhtp 1.2.13
internal.h
Go to the documentation of this file.
1
5#ifndef __EVHTP_INTERNAL_H__
6#define __EVHTP_INTERNAL_H__
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12
13#if defined __GNUC__ || defined __llvm__
14# define evhtp_likely(x) __builtin_expect(!!(x), 1)
15# define evhtp_unlikely(x) __builtin_expect(!!(x), 0)
16#else
17# define evhtp_likely(x) (x)
18# define evhtp_unlikely(x) (x)
19#endif
20
21#ifndef TAILQ_FOREACH_SAFE
22#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
23 for ((var) = TAILQ_FIRST((head)); \
24 (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
25 (var) = (tvar))
26#endif
27
28
29#define __FILENAME__ \
30 (strrchr(__FILE__, '/') ? \
31 strrchr(__FILE__, '/') + 1 : __FILE__)
32
33#define clean_errno() \
34 (errno == 0 ? "None" : strerror(errno))
35
36#define __log_debug_color(X) "[\x1b[1;36m" X "\x1b[0;39m]"
37#define __log_error_color(X) "[\x1b[1;31m" X "\x1b[0;39m]"
38#define __log_warn_color(X) "[\x1b[1;33m" X "\x1b[0;39m]"
39#define __log_info_color(X) "[\x1b[32m" X "\x1b[0;39m]"
40#define __log_func_color(X) "\x1b[33m" X "\x1b[39m"
41#define __log_args_color(X) "\x1b[94m" X "\x1b[39m"
42#define __log_errno_color(X) "\x1b[35m" X "\x1b[39m"
43
44
45#if !defined(EVHTP_DEBUG)
46/* compile with all debug messages removed */
47#define log_debug(M, ...)
48#else
49#define log_debug(M, ...) \
50 fprintf(stderr, __log_debug_color("DEBUG") " " \
51 __log_func_color("%s/%s:%-9d") \
52 __log_args_color(M) \
53 "\n", \
54 __FILENAME__, __FUNCTION__, __LINE__, ## __VA_ARGS__)
55#endif
56
57#define log_error(M, ...) \
58 fprintf(stderr, __log_error_color("ERROR") " " \
59 __log_func_color("%s:%-9d") \
60 __log_args_color(M) \
61 " :: " \
62 __log_errno_color("(errno: %s)") \
63 "\n", \
64 __FILENAME__, __LINE__, ## __VA_ARGS__, clean_errno())
65
66
67#define log_warn(M, ...) \
68 fprintf(stderr, __log_warn_color("WARN") " " \
69 __log_func_color("%s:%-9d") \
70 __log_args_color(M) \
71 " :: " \
72 __log_errno_color("(errno: %s)") \
73 "\n", \
74 __FILENAME__, __LINE__, ## __VA_ARGS__, clean_errno())
75
76#define log_info(M, ...) \
77 fprintf(stderr, __log_info_color("INFO") " " \
78 __log_func_color("%4s:%-9d") \
79 __log_args_color(M) "\n", \
80 __FILENAME__, __LINE__, ## __VA_ARGS__)
81
82#ifndef NDEBUG
83#define evhtp_assert(x) \
84 do { \
85 if (evhtp_unlikely(!(x))) { \
86 fprintf(stderr, "Assertion failed: %s (%s:%s:%d)\n", # x, \
87 __func__, __FILE__, __LINE__); \
88 fflush(stderr); \
89 abort(); \
90 } \
91 } while (0)
92
93#define evhtp_alloc_assert(x) \
94 do { \
95 if (evhtp_unlikely(!x)) { \
96 fprintf(stderr, "Out of memory (%s:%s:%d)\n", \
97 __func__, __FILE__, __LINE__); \
98 fflush(stderr); \
99 abort(); \
100 } \
101 } while (0)
102
103#define evhtp_assert_fmt(x, fmt, ...) \
104 do { \
105 if (evhtp_unlikely(!(x))) { \
106 fprintf(stderr, "Assertion failed: %s (%s:%s:%d) " fmt "\n", \
107 # x, __func__, __FILE__, __LINE__, __VA_ARGS__); \
108 fflush(stderr); \
109 abort(); \
110 } \
111 } while (0)
112
113#define evhtp_errno_assert(x) \
114 do { \
115 if (evhtp_unlikely(!(x))) { \
116 fprintf(stderr, "%s [%d] (%s:%s:%d)\n", \
117 strerror(errno), errno, \
118 __func__, __FILE__, __LINE__); \
119 fflush(stderr); \
120 abort(); \
121 } \
122 } while (0)
123#else
124#define evhtp_assert(x)
125#define evhtp_alloc_assert(x)
126#define evhtp_assert_fmt(x)
127#define evhtp_errno_assert(x)
128#endif
129
130
131
132
133#ifdef __cplusplus
134}
135#endif
136
137#endif
138