/* log - a generic logging facility in the spirit of log4j */
-/* Copyright (c) 2004-2018. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-/** @addtogroup XBT_log
- * @brief A generic logging facility in the spirit of log4j (grounding feature)
- *
- */
-
-/** \defgroup XBT_log_cats Existing log categories
- * \ingroup XBT_log
- * \brief (automatically extracted)
- *
- * This is the list of all existing log categories in SimGrid.
- * This list is automatically extracted from the source code by the tools/doxygen/xbt_log_extract_hierarchy.pl utility.
- *
- * It should thus contain every categories that are defined in the SimGrid library.
- * If you want to see the one defined in your code in addition, provide `--help-logs` on the command line of your simulator.
- */
-
-/* XBT_LOG_MAYDAY: define this to replace the logging facilities with basic
- printf function. Useful to debug the logging facilities themselves, or to not make source analysis tools mad */
+/* Define the XBT_LOG_MAYDAY symbol to change all logging facilities into basic printfs, e.g. to debug the logs
+ * themselves. */
//#define XBT_LOG_MAYDAY
#ifndef XBT_LOG_H
#include <stdarg.h>
#include <stddef.h> /* NULL */
-#include <xbt/misc.h>
-SG_BEGIN_DECL()
-/**\brief Log priorities
- * \ingroup XBT_log
+#include <stdio.h> /* FILE */
+#include <xbt/base.h>
+SG_BEGIN_DECL
+/**@brief Log priorities
+ * @ingroup XBT_log
*
* The different existing priorities.
-*/
+ */
typedef enum {
//! @cond
xbt_log_priority_none = 0, /** used internally (don't poke with)*/
xbt_log_priority_trace = 1, /**< enter and return of some functions */
xbt_log_priority_debug = 2, /**< crufty output */
xbt_log_priority_verbose = 3, /**< verbose output for the user wanting more */
- xbt_log_priority_info = 4, /**< output about the regular functionning */
+ xbt_log_priority_info = 4, /**< output about the regular functioning */
xbt_log_priority_warning = 5, /**< minor issue encountered */
xbt_log_priority_error = 6, /**< issue encountered */
xbt_log_priority_critical = 7, /**< major issue encountered */
#endif /* !defined(NLOG) */
/* Transforms a category name to a global variable name. */
-#define _XBT_LOGV(cat) _XBT_LOG_CONCAT(_simgrid_log_category__, cat)
-#define _XBT_LOGV_CTOR(cat) _XBT_LOG_CONCAT2(_XBT_LOGV(cat), __constructor__)
-#define _XBT_LOG_CONCAT(x, y) x ## y
-#define _XBT_LOG_CONCAT2(x, y) _XBT_LOG_CONCAT(x, y)
+#define _XBT_LOGV(cat) _XBT_CONCAT(_simgrid_log_category__, cat)
+#define _XBT_LOGV_CTOR(cat) _XBT_CONCAT2(_XBT_LOGV(cat), __constructor__)
/* The root of the category hierarchy. */
#define XBT_LOG_ROOT_CAT root
* Implementation of XBT_LOG_NEW_SUBCATEGORY, which must declare "extern parent" in addition to avoid an extra
* declaration of root when XBT_LOG_NEW_SUBCATEGORY is called by XBT_LOG_NEW_CATEGORY */
#define XBT_LOG_NEW_SUBCATEGORY_helper(catName, parent, desc) \
- SG_BEGIN_DECL() \
+ SG_BEGIN_DECL \
extern void _XBT_LOGV_CTOR(catName)(void) XBT_ATTRIB_CONSTRUCTOR(600); \
+ SG_END_DECL \
void _XBT_LOGV_CTOR(catName)(void) \
{ \
XBT_LOG_EXTERNAL_CATEGORY(catName); \
- if (!_XBT_LOGV(catName).initialized) { \
- _xbt_log_cat_init(&_XBT_LOGV(catName), xbt_log_priority_uninitialized); \
- } \
+ (void)_xbt_log_cat_init(&_XBT_LOGV(catName), xbt_log_priority_uninitialized); \
} \
- SG_END_DECL() \
XBT_EXPORT_NO_IMPORT s_xbt_log_category_t _XBT_LOGV(catName) = { \
&_XBT_LOGV(parent), \
NULL /* firstChild */, \
NULL /* nextSibling */, \
- #catName, \
- desc, \
+ _XBT_STRINGIFY(catName), \
+ (desc), \
0 /*initialized */, \
xbt_log_priority_uninitialized /* threshold */, \
1 /* isThreshInherited */, \
}
/**
- * \ingroup XBT_log
- * \param catName name of new category
- * \param parent father of the new category in the tree
- * \param desc string describing the purpose of this category
- * \hideinitializer
+ * @ingroup XBT_log
+ * @param catName name of new category
+ * @param parent father of the new category in the tree
+ * @param desc string describing the purpose of this category
+ * @hideinitializer
*
* Defines a new subcategory of the parent.
*/
-#define XBT_LOG_NEW_SUBCATEGORY(catName, parent, desc) \
- XBT_LOG_EXTERNAL_CATEGORY(parent); \
- XBT_LOG_NEW_SUBCATEGORY_helper(catName, parent, desc) \
+#define XBT_LOG_NEW_SUBCATEGORY(catName, parent, desc) \
+ XBT_LOG_EXTERNAL_CATEGORY(parent); \
+ XBT_LOG_NEW_SUBCATEGORY_helper(catName, parent, (desc))
/**
- * \ingroup XBT_log
- * \param catName name of new category
- * \param desc string describing the purpose of this category
- * \hideinitializer
+ * @ingroup XBT_log
+ * @param catName name of new category
+ * @param desc string describing the purpose of this category
+ * @hideinitializer
*
* Creates a new subcategory of the root category.
*/
-# define XBT_LOG_NEW_CATEGORY(catName,desc) \
- XBT_LOG_NEW_SUBCATEGORY_helper(catName, XBT_LOG_ROOT_CAT, desc)
+#define XBT_LOG_NEW_CATEGORY(catName, desc) XBT_LOG_NEW_SUBCATEGORY_helper(catName, XBT_LOG_ROOT_CAT, (desc))
/**
- * \ingroup XBT_log
- * \param cname name of the cat
- * \hideinitializer
+ * @ingroup XBT_log
+ * @param cname name of the cat
+ * @hideinitializer
*
* Indicates which category is the default one.
*/
#endif
/**
- * \ingroup XBT_log
- * \param cname name of the cat
- * \param desc string describing the purpose of this category
- * \hideinitializer
+ * @ingroup XBT_log
+ * @param cname name of the cat
+ * @param desc string describing the purpose of this category
+ * @hideinitializer
*
* Creates a new subcategory of the root category and makes it the default (used by macros that don't explicitly
* specify a category).
*/
-# define XBT_LOG_NEW_DEFAULT_CATEGORY(cname,desc) \
- XBT_LOG_NEW_CATEGORY(cname,desc); \
- XBT_LOG_DEFAULT_CATEGORY(cname)
+#define XBT_LOG_NEW_DEFAULT_CATEGORY(cname, desc) \
+ XBT_LOG_NEW_CATEGORY(cname, (desc)); \
+ XBT_LOG_DEFAULT_CATEGORY(cname)
/**
- * \ingroup XBT_log
- * \param cname name of the cat
- * \param parent name of the parent
- * \param desc string describing the purpose of this category
- * \hideinitializer
+ * @ingroup XBT_log
+ * @param cname name of the cat
+ * @param parent name of the parent
+ * @param desc string describing the purpose of this category
+ * @hideinitializer
*
* Creates a new subcategory of the parent category and makes it the default
* (used by macros that don't explicitly specify a category).
*/
-#define XBT_LOG_NEW_DEFAULT_SUBCATEGORY(cname, parent, desc) \
- XBT_LOG_NEW_SUBCATEGORY(cname, parent, desc); \
- XBT_LOG_DEFAULT_CATEGORY(cname)
+#define XBT_LOG_NEW_DEFAULT_SUBCATEGORY(cname, parent, desc) \
+ XBT_LOG_NEW_SUBCATEGORY(cname, parent, (desc)); \
+ XBT_LOG_DEFAULT_CATEGORY(cname)
/**
- * \ingroup XBT_log
- * \param cname name of the cat
- * \hideinitializer
+ * @ingroup XBT_log
+ * @param cname name of the cat
+ * @hideinitializer
*
* Indicates that a category you'll use in this file (e.g., to get subcategories of it) really lives in another file.
*/
extern s_xbt_log_category_t _XBT_LOGV(cname)
/**
- * \ingroup XBT_log
- * \param cname name of the cat
- * \hideinitializer
+ * @ingroup XBT_log
+ * @param cname name of the cat
+ * @hideinitializer
*
* Indicates that the default category of this file was declared in another file.
*/
/* Functions you may call */
+/** Provide a log setting as if it were passed on the command line.
+ *
+ * Expected syntax:
+ * ( [category] "." [keyword] ":" value (" ")... )...
+ *
+ * where [category] is one the category names (see @ref XBT_log_cats for a complete list of the ones defined in the
+ * SimGrid library) and keyword is one of the following:
+ *
+ * - threshold: category's threshold priority. Possible values:
+ * TRACE,DEBUG,VERBOSE,INFO,WARNING,ERROR,CRITICAL
+ * - add or additivity: whether the logging actions must be passed to the parent category.
+ * Possible values: 0, 1, no, yes, on, off.
+ * Default value: yes.
+ * - fmt: the format to use. See @ref log_use_conf_fmt for more information.
+ * - app or appender: the appender to use. See @ref log_use_conf_app for more information.
+ */
XBT_PUBLIC void xbt_log_control_set(const char* cs);
/* Forward declarations */
typedef struct xbt_log_appender_s s_xbt_log_appender_t;
-typedef struct xbt_log_appender_s* xbt_log_appender_t;
+typedef s_xbt_log_appender_t* xbt_log_appender_t;
typedef struct xbt_log_layout_s s_xbt_log_layout_t;
-typedef struct xbt_log_layout_s* xbt_log_layout_t;
+typedef s_xbt_log_layout_t* xbt_log_layout_t;
typedef struct xbt_log_event_s s_xbt_log_event_t;
-typedef struct xbt_log_event_s* xbt_log_event_t;
+typedef s_xbt_log_event_t* xbt_log_event_t;
typedef struct xbt_log_category_s s_xbt_log_category_t;
-typedef struct xbt_log_category_s* xbt_log_category_t;
+typedef s_xbt_log_category_t* xbt_log_category_t;
/* Do NOT access any members of this structure directly. FIXME: move to private? */
};
/**
- * \ingroup XBT_log_implem
- * \param cat the category (not only its name, but the variable)
- * \param thresholdPriority the priority
+ * @ingroup XBT_log_implem
+ * @param cat the category (not only its name, but the variable)
+ * @param thresholdPriority the priority
*
- * Programatically alters a category's threshold priority (don't use).
+ * Programmatically alters a category's threshold priority (don't use).
*/
XBT_PUBLIC void xbt_log_threshold_set(xbt_log_category_t cat, e_xbt_log_priority_t thresholdPriority);
/**
- * \ingroup XBT_log_implem
- * \param cat the category (not only its name, but the variable)
- * \param app the appender
+ * @ingroup XBT_log_implem
+ * @param cat the category (not only its name, but the variable)
+ * @param app the appender
*
- * Programatically sets the category's appender. (the preferred interface is through xbt_log_control_set())
+ * Programmatically sets the category's appender. (the preferred interface is through xbt_log_control_set())
*/
XBT_PUBLIC void xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app);
/**
- * \ingroup XBT_log_implem
- * \param cat the category (not only its name, but the variable)
- * \param lay the layout
+ * @ingroup XBT_log_implem
+ * @param cat the category (not only its name, but the variable)
+ * @param lay the layout
*
- * Programatically sets the category's layout. (the preferred interface is through xbt_log_control_set())
+ * Programmatically sets the category's layout. (the preferred interface is through xbt_log_control_set())
*/
XBT_PUBLIC void xbt_log_layout_set(xbt_log_category_t cat, xbt_log_layout_t lay);
/**
- * \ingroup XBT_log_implem
- * \param cat the category (not only its name, but the variable)
- * \param additivity whether logging actions must be passed to parent.
+ * @ingroup XBT_log_implem
+ * @param cat the category (not only its name, but the variable)
+ * @param additivity whether logging actions must be passed to parent.
*
- * Programatically sets whether the logging actions must be passed to the parent category.
+ * Programmatically sets whether the logging actions must be passed to the parent category.
* (the preferred interface is through xbt_log_control_set())
*/
XBT_PUBLIC void xbt_log_additivity_set(xbt_log_category_t cat, int additivity);
*
* This layout is not as flexible as the pattern one
*/
-XBT_PUBLIC xbt_log_layout_t xbt_log_layout_simple_new(char* arg);
-XBT_PUBLIC xbt_log_layout_t xbt_log_layout_format_new(char* arg);
-XBT_PUBLIC xbt_log_appender_t xbt_log_appender_file_new(char* arg);
-XBT_PUBLIC xbt_log_appender_t xbt_log_appender2_file_new(char* arg, int roll);
+XBT_PUBLIC xbt_log_layout_t xbt_log_layout_simple_new(const char* arg);
+XBT_PUBLIC xbt_log_layout_t xbt_log_layout_format_new(const char* arg);
+XBT_PUBLIC xbt_log_appender_t xbt_log_appender_stream(FILE* f);
+XBT_PUBLIC xbt_log_appender_t xbt_log_appender_file_new(const char* arg);
+XBT_PUBLIC xbt_log_appender_t xbt_log_appender2_file_new(const char* arg, int roll);
/* ********************************** */
/* Functions that you shouldn't call */
/* ********************************** */
+
+/** Retrieve and parse all log settings from the command line (don't call it directly) */
XBT_PUBLIC void xbt_log_init(int* argc, char** argv);
XBT_PUBLIC void _xbt_log_event_log(xbt_log_event_t ev, const char* fmt, ...) XBT_ATTRIB_PRINTF(2, 3);
XBT_PUBLIC int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority);
/* ********************** */
/**
- * \ingroup XBT_log
- * \param catName name of the category
- * \param priority minimal priority to be enabled to return true (must be #e_xbt_log_priority_t)
- * \hideinitializer
+ * @ingroup XBT_log
+ * @param catName name of the category
+ * @param priority minimal priority to be enabled to return true (must be #e_xbt_log_priority_t)
+ * @hideinitializer
*
* Returns true if the given priority is enabled for the category.
* If you have expensive expressions that are computed outside of the log command and used only within it, you should
* make its evaluation conditional using this macro.
*/
-#define XBT_LOG_ISENABLED(catName, priority) \
- _XBT_LOG_ISENABLEDV(_XBT_LOGV(catName), priority)
+#define XBT_LOG_ISENABLED(catName, priority) _XBT_LOG_ISENABLEDV(_XBT_LOGV(catName), (priority))
/*
* Helper function that implements XBT_LOG_ISENABLED.
* First part is a compile-time constant.
* Call to xbt_log_cat_init only happens once.
*/
-#define _XBT_LOG_ISENABLEDV(catv, priority) \
- (priority >= XBT_LOG_STATIC_THRESHOLD \
- && ((catv).initialized || _xbt_log_cat_init(&(catv), priority)) \
- && priority >= (catv).threshold)
+#define _XBT_LOG_ISENABLEDV(catv, priority) \
+ ((priority) >= XBT_LOG_STATIC_THRESHOLD && ((catv).initialized || _xbt_log_cat_init(&(catv), (priority))) && \
+ (priority) >= (catv).threshold)
/*
* Internal Macros
# define XBT_LOG(...) XBT_CLOG(0, __VA_ARGS__)
#else
-// 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
-
-# define XBT_LOG(prio,...) \
- do { \
- if (_XBT_LOG_ISENABLEDV((*_simgrid_log_category__default), prio)) { \
- s_xbt_log_event_t _log_ev; \
- _log_ev.cat = _simgrid_log_category__default; \
- _log_ev.priority = (prio); \
- _log_ev.fileName = __FILE__; \
- _log_ev.functionName = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#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 = __func__; \
+ _log_ev.lineNum = __LINE__; \
+ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
+ } \
+ } while (0)
+
+#define XBT_LOG(prio, ...) XBT_CLOG(*_simgrid_log_category__default, (prio), __VA_ARGS__)
+
#endif
/** @ingroup XBT_log
* @hideinitializer
- * \param categ the category on which to log
- * \param ... the format string and its arguments
+ * @param categ the category on which to 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(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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_CDEBUG(categ, ...) XBT_CLOG(_XBT_LOGV(categ), xbt_log_priority_debug, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the VERB priority on the specified category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_CVERB(categ, ...) XBT_CLOG(_XBT_LOGV(categ), xbt_log_priority_verbose, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the INFO priority on the specified category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
-
+#define XBT_CINFO(categ, ...) XBT_CLOG(_XBT_LOGV(categ), xbt_log_priority_info, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the WARN priority on the specified category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
-
+#define XBT_CWARN(categ, ...) XBT_CLOG(_XBT_LOGV(categ), xbt_log_priority_warning, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the ERROR priority on the specified category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_CERROR(categ, ...) XBT_CLOG(_XBT_LOGV(categ), xbt_log_priority_error, __VA_ARGS__)
/** @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(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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+ * @brief Log an event at the CRITICAL priority on the specified category with these args.
+ */
+#define XBT_CCRITICAL(categ, ...) XBT_CLOG(_XBT_LOGV(categ), xbt_log_priority_critical, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
- * \param ... the format string and its arguments
+ * @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(...) \
- 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_DEBUG(...) XBT_LOG(xbt_log_priority_debug, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the VERB priority on the default category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_VERB(...) XBT_LOG(xbt_log_priority_verbose, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the INFO priority on the default category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_INFO(...) XBT_LOG(xbt_log_priority_info, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the WARN priority on the default category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_WARN(...) XBT_LOG(xbt_log_priority_warning, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the ERROR priority on the default category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_ERROR(...) XBT_LOG(xbt_log_priority_error, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log an event at the CRITICAL priority on the default category with these 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 = __func__; \
- _log_ev.lineNum = __LINE__; \
- _xbt_log_event_log(&_log_ev, __VA_ARGS__); \
- } \
- } while (0)
+#define XBT_CRITICAL(...) XBT_LOG(xbt_log_priority_critical, __VA_ARGS__)
#define _XBT_IN_OUT(...) \
_XBT_IF_ONE_ARG(_XBT_IN_OUT_ARG1, _XBT_IN_OUT_ARGN, __VA_ARGS__)(__VA_ARGS__)
-#define _XBT_IN_OUT_ARG1(fmt) \
- XBT_LOG(xbt_log_priority_trace, fmt, __func__)
-#define _XBT_IN_OUT_ARGN(fmt, ...) \
- XBT_LOG(xbt_log_priority_trace, fmt, __func__, __VA_ARGS__)
+#define _XBT_IN_OUT_ARG1(fmt) XBT_LOG(xbt_log_priority_trace, (fmt), __func__)
+#define _XBT_IN_OUT_ARGN(fmt, ...) XBT_LOG(xbt_log_priority_trace, (fmt), __func__, __VA_ARGS__)
/** @ingroup XBT_log
* @hideinitializer
*/
#define XBT_HERE(...) XBT_LOG(xbt_log_priority_trace, "-- was here" __VA_ARGS__)
-SG_END_DECL()
-#endif /* ! _XBT_LOG_H_ */
+/** @ingroup XBT_log
+ * @hideinitializer
+ * @brief Log help messages through category xbt.xbt_help.
+ */
+#define XBT_HELP(...) XBT_CINFO(xbt_help, __VA_ARGS__)
+
+SG_END_DECL
+#endif /* XBT_LOG_H */