29#ifndef TEMP_FAILURE_RETRY
30#define TEMP_FAILURE_RETRY(exp) \
35 } while (_rc == -1 && errno == EINTR); \
43#ifndef HAVE_GNU_STRERROR_R
44 #if defined(__APPLE__)
45 #define HAVE_GNU_STRERROR_R 0
47 #define HAVE_GNU_STRERROR_R 1
57#if !defined(AI_BUILD_TYPE) || !defined(AI_RELEASE) || !defined(AI_DEBUG)
58# warning "No build type defined, expected AI_BUILD_TYPE to be defined to either AI_RELEASE or AI_DEBUG"
60#if (AI_BUILD_TYPE != AI_RELEASE) && (AI_BUILD_TYPE != AI_DEBUG)
61# warning "AI_BUILD_TYPE is not equal to AI_RELEASE or AI_DEBUG"
71extern int __ai_debug_log_level;
72extern void __ai_debug_log_printf(
int level,
const char *file,
const char *func,
73 int line,
const char *fmt, ...)
74 __attribute__ ((format (printf, 5, 6)));
75extern
void __ai_debug_log_sys_printf(
int err,
int level, const
char *file,
76 const
char *func,
int line,
78 __attribute__ ((format (printf, 6, 7)));
81#define AI_DEBUG_LEVEL_PROD_MILESTONE -1
82#define AI_DEBUG_LEVEL_FATAL 0
83#define AI_DEBUG_LEVEL_ERROR 1
84#define AI_DEBUG_LEVEL_WARNING 2
85#define AI_DEBUG_LEVEL_MILESTONE 3
86#define AI_DEBUG_LEVEL_INFO 4
87#define AI_DEBUG_LEVEL_DEBUG 5
97#define __AI_LOG_PRINTF(level, fmt, ...) \
99 if (__builtin_expect(((level) <= __ai_debug_log_level),0)) \
100 __ai_debug_log_printf((level), __FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__); \
103#define __AI_LOG_SYS_PRINTF(err, level, fmt, ...) \
105 if (__builtin_expect(((level) <= __ai_debug_log_level),0)) \
106 __ai_debug_log_sys_printf((err), (level), __FILE__, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__); \
116#define AI_LOG_PROD_MILESTONE(fmt,...) \
117 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_PROD_MILESTONE, fmt, ##__VA_ARGS__)
119#define AI_LOG_MILESTONE(fmt,...) \
120 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_MILESTONE, fmt, ##__VA_ARGS__)
122#define AI_LOG_WARN(fmt,...) \
123 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_WARNING, fmt, ##__VA_ARGS__)
124#define AI_LOG_SYS_WARN(err,fmt,...) \
125 __AI_LOG_SYS_PRINTF(err, AI_DEBUG_LEVEL_WARNING, fmt, ##__VA_ARGS__)
127#define AI_LOG_ERROR(fmt,...) \
128 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
129#define AI_LOG_SYS_ERROR(err, fmt,...) \
130 __AI_LOG_SYS_PRINTF(err, AI_DEBUG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
131#define AI_LOG_ERROR_EXIT(fmt,...) \
133 AI_LOG_ERROR(fmt, ##__VA_ARGS__); \
136#define AI_LOG_SYS_ERROR_EXIT(err,fmt,...) \
138 AI_LOG_SYS_ERROR(err, fmt, ##__VA_ARGS__); \
142#define AI_LOG_FATAL(fmt,...) \
143 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_FATAL, fmt, ##__VA_ARGS__)
144#define AI_LOG_SYS_FATAL(err,fmt,...) \
145 __AI_LOG_SYS_PRINTF(err, AI_DEBUG_LEVEL_FATAL, fmt, ##__VA_ARGS__)
146#define AI_LOG_FATAL_EXIT(fmt,...) \
148 AI_LOG_FATAL(fmt, ##__VA_ARGS__); \
151#define AI_LOG_SYS_FATAL_EXIT(err,fmt,...) \
153 AI_LOG_SYS_FATAL(err, fmt, ##__VA_ARGS__); \
161#if (AI_BUILD_TYPE == AI_RELEASE)
162 #define AI_LOG_FN_ENTRY()
163 #define AI_LOG_FN_EXIT()
164 #define AI_LOG_DEBUG(fmt,...)
165 #define AI_LOG_INFO(fmt,...)
166 #define AI_DEBUG_ASSERT(condition)
172 #define AI_LOG_FN_ENTRY() \
173 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_DEBUG, "entry")
174 #define AI_LOG_FN_EXIT() \
175 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_DEBUG, "exit")
176 #define AI_LOG_DEBUG(fmt,...) \
177 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
178 #define AI_LOG_INFO(fmt,...) \
179 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_INFO, fmt, ##__VA_ARGS__)
181 #define AI_DEBUG_ASSERT(condition) \
183 if (! (condition) ) \
184 __AI_LOG_PRINTF(AI_DEBUG_LEVEL_FATAL, "ASSERT - " #condition ); \
185 assert( condition ); \
203 typedef std::function<void (
int level,
const char *file,
const char *func,
int line,
const char *message)> diag_printer_t;
205 void initLogging(diag_printer_t diagPrinter =
nullptr);