/* log - a generic logging facility in the spirit of log4j */
-/* Copyright (c) 2004-2014. The SimGrid Team.
+/* Copyright (c) 2004-2015. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
*/
#define _XBT_LOG_ISENABLEDV(catv, priority) \
(priority >= XBT_LOG_STATIC_THRESHOLD \
- && (catv.initialized || _xbt_log_cat_init(&catv, priority)) \
- && priority >= catv.threshold)
+ && ((catv).initialized || _xbt_log_cat_init(&(catv), priority)) \
+ && priority >= (catv).threshold)
/*
* Internal Macros
fprintf(stderr,"%s:%d:\n" f, __FILE__, __LINE__, __VA_ARGS__)
# define XBT_LOG(...) XBT_CLOG(0, __VA_ARGS__)
#else
-# define XBT_CLOG_(catv, prio, ...) \
+
+// This code is duplicated to remove one level of indirection, working around a MSVC bug
+// See: http://stackoverflow.com/questions/9183993/msvc-variadic-macro-expansion
+
+# define XBT_CLOG(category, prio, ...) \
+ do { \
+ if (_XBT_LOG_ISENABLEDV((category), prio)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(category); \
+ _log_ev.priority = (prio); \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
+
+# define XBT_LOG(prio,...) \
do { \
- if (_XBT_LOG_ISENABLEDV(catv, prio)) { \
+ if (_XBT_LOG_ISENABLEDV((*_simgrid_log_category__default), prio)) { \
s_xbt_log_event_t _log_ev; \
- _log_ev.cat = &(catv); \
+ _log_ev.cat = _simgrid_log_category__default; \
_log_ev.priority = (prio); \
_log_ev.fileName = __FILE__; \
_log_ev.functionName = _XBT_FUNCTION; \
_xbt_log_event_log(&_log_ev, __VA_ARGS__); \
} \
} while (0)
-# define XBT_CLOG(cat, prio, ...) XBT_CLOG_(_XBT_LOGV(cat), prio, __VA_ARGS__)
-# define XBT_LOG(...) XBT_CLOG_((*_XBT_LOGV(default)), __VA_ARGS__)
#endif
/** @ingroup XBT_log
* \param ... the format string and its arguments
* @brief Log an event at the DEBUG priority on the specified category with these args.
*/
-#define XBT_CDEBUG(c, ...) XBT_CLOG(c, xbt_log_priority_debug, __VA_ARGS__)
+#define XBT_CDEBUG(categ, ...) \
+ do { \
+ if (XBT_LOG_ISENABLED (categ, xbt_log_priority_debug)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(_XBT_LOGV(categ)); \
+ _log_ev.priority = xbt_log_priority_debug; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the VERB priority on the specified category with these args.
*/
-#define XBT_CVERB(c, ...) XBT_CLOG(c, xbt_log_priority_verbose, __VA_ARGS__)
+#define XBT_CVERB(categ, ...) \
+ do { \
+ if (XBT_LOG_ISENABLED (categ, xbt_log_priority_verbose)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(_XBT_LOGV(categ)); \
+ _log_ev.priority = xbt_log_priority_verbose; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the INFO priority on the specified category with these args.
*/
-#define XBT_CINFO(c, ...) XBT_CLOG(c, xbt_log_priority_info, __VA_ARGS__)
+#define XBT_CINFO(categ, ...) \
+ do { \
+ if (XBT_LOG_ISENABLED (categ, xbt_log_priority_info)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(_XBT_LOGV(categ)); \
+ _log_ev.priority = xbt_log_priority_info; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
+
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the WARN priority on the specified category with these args.
*/
-#define XBT_CWARN(c, ...) XBT_CLOG(c, xbt_log_priority_warning, __VA_ARGS__)
+#define XBT_CWARN(categ, ...) \
+ do { \
+ if (XBT_LOG_ISENABLED (categ, xbt_log_priority_warning)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(_XBT_LOGV(categ)); \
+ _log_ev.priority = xbt_log_priority_warning; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
+
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the ERROR priority on the specified category with these args.
*/
-#define XBT_CERROR(c, ...) XBT_CLOG(c, xbt_log_priority_error, __VA_ARGS__)
+#define XBT_CERROR(categ, ...) \
+ do { \
+ if (XBT_LOG_ISENABLED (categ, xbt_log_priority_error)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(_XBT_LOGV(categ)); \
+ _log_ev.priority = xbt_log_priority_error; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the CRITICAL priority on the specified category with these args (CCRITICALn exists for any n<10).
*/
-#define XBT_CCRITICAL(c, ...) XBT_CLOG(c, xbt_log_priority_critical, __VA_ARGS__)
+#define XBT_CCRITICAL(categ, ...) \
+ do { \
+ if (XBT_LOG_ISENABLED (categ, xbt_log_priority_critical)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(_XBT_LOGV(categ)); \
+ _log_ev.priority = xbt_log_priority_critical; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* \param ... the format string and its arguments
* @brief Log an event at the DEBUG priority on the default category with these args.
*/
-#define XBT_DEBUG(...) XBT_LOG(xbt_log_priority_debug, __VA_ARGS__)
+#define XBT_DEBUG(...) \
+ do { \
+ if (_XBT_LOG_ISENABLEDV(*_simgrid_log_category__default, \
+ xbt_log_priority_debug)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = _simgrid_log_category__default; \
+ _log_ev.priority = xbt_log_priority_debug; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the VERB priority on the default category with these args.
*/
-#define XBT_VERB(...) XBT_LOG(xbt_log_priority_verbose, __VA_ARGS__)
+#define XBT_VERB(...) \
+ do { \
+ if (_XBT_LOG_ISENABLEDV(*_simgrid_log_category__default, \
+ xbt_log_priority_verbose)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = _simgrid_log_category__default; \
+ _log_ev.priority = xbt_log_priority_verbose; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the INFO priority on the default category with these args.
*/
-#define XBT_INFO(...) XBT_LOG(xbt_log_priority_info, __VA_ARGS__)
+#define XBT_INFO(...) \
+ do { \
+ if (_XBT_LOG_ISENABLEDV(*_simgrid_log_category__default, \
+ xbt_log_priority_info)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = _simgrid_log_category__default; \
+ _log_ev.priority = xbt_log_priority_info; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the WARN priority on the default category with these args.
*/
-#define XBT_WARN(...) XBT_LOG(xbt_log_priority_warning, __VA_ARGS__)
+#define XBT_WARN(...) \
+ do { \
+ if (_XBT_LOG_ISENABLEDV(*_simgrid_log_category__default, \
+ xbt_log_priority_warning)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = _simgrid_log_category__default; \
+ _log_ev.priority = xbt_log_priority_warning; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the ERROR priority on the default category with these args.
*/
-#define XBT_ERROR(...) XBT_LOG(xbt_log_priority_error, __VA_ARGS__)
+#define XBT_ERROR(...) \
+ do { \
+ if (_XBT_LOG_ISENABLEDV(*_simgrid_log_category__default, \
+ xbt_log_priority_error)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = _simgrid_log_category__default; \
+ _log_ev.priority = xbt_log_priority_error; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the CRITICAL priority on the default category with these args.
*/
-#define XBT_CRITICAL(...) XBT_LOG(xbt_log_priority_critical, __VA_ARGS__)
+#define XBT_CRITICAL(...) \
+ do { \
+ if (_XBT_LOG_ISENABLEDV(*_simgrid_log_category__default, \
+ xbt_log_priority_critical)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = _simgrid_log_category__default; \
+ _log_ev.priority = xbt_log_priority_critical; \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
#define _XBT_IN_OUT(...) \
_XBT_IF_ONE_ARG(_XBT_IN_OUT_ARG1, _XBT_IN_OUT_ARGN, __VA_ARGS__)(__VA_ARGS__)