/* log - a generic logging facility in the spirit of log4j */
-/* Copyright (c) 2004-2018. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2004-2019. 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. */
*
*/
-/** \defgroup XBT_log_cats Existing log categories
- * \ingroup XBT_log
- * \brief (automatically extracted)
+/** @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.
+ * 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
#ifndef XBT_LOG_H
#define XBT_LOG_H
-#include "xbt/misc.h"
#include <stdarg.h>
-#include <stddef.h> /* NULL */
+#include <stddef.h> /* NULL */
+#include <stdio.h> /* FILE */
+#include <xbt/misc.h>
SG_BEGIN_DECL()
-/**\brief Log priorities
- * \ingroup XBT_log
+/**@brief Log priorities
+ * @ingroup XBT_log
*
* The different existing priorities.
-*/
+ */
typedef enum {
//! @cond
xbt_log_priority_none = 0, /** used internally (don't poke with)*/
* This is normally done at the first use of the category.
*
* It is however necessary to make this connections as early as possible, if we want the category to be listed by
- * --help-log-categories.
- *
- * When possible, the initializations takes place automatically before the start of main(). It's the case when
- * compiling with gcc.
- *
- * For the other cases, you can use the XBT_LOG_CONNECT(cat) macro to force early initialization. See, for example,
- * in xbt/log.c, the function xbt_log_connect_categories().
+ * --help-log-categories. We use constructor attributes for these initializations to take place automatically before the
+ * start of main().
*/
-#define XBT_LOG_CONNECT(cat) \
- if (1) { \
- extern void _XBT_LOGV_CTOR(cat)(void); \
- _XBT_LOGV_CTOR(cat)(); \
- } else ((void)0)
-
/* XBT_LOG_NEW_SUBCATEGORY_helper:
* 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 */
} \
} \
SG_END_DECL() \
- XBT_EXPORT_NO_IMPORT(s_xbt_log_category_t) \
- _XBT_LOGV(catName) = { \
+ XBT_EXPORT_NO_IMPORT s_xbt_log_category_t _XBT_LOGV(catName) = { \
&_XBT_LOGV(parent), \
NULL /* firstChild */, \
NULL /* nextSibling */, \
}
/**
- * \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) \
+ 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.
*/
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).
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).
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 */
-XBT_PUBLIC(void) xbt_log_control_set(const char *cs);
+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).
*/
-XBT_PUBLIC(void) xbt_log_threshold_set(xbt_log_category_t cat, e_xbt_log_priority_t thresholdPriority);
+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())
*/
-XBT_PUBLIC(void) xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app);
+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())
*/
-XBT_PUBLIC(void) xbt_log_layout_set(xbt_log_category_t cat, xbt_log_layout_t lay);
+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.
* (the preferred interface is through xbt_log_control_set())
*/
-XBT_PUBLIC(void) xbt_log_additivity_set(xbt_log_category_t cat, int additivity);
+XBT_PUBLIC void xbt_log_additivity_set(xbt_log_category_t cat, int additivity);
/** @brief create a new simple layout
*
* 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 */
/* ********************************** */
-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);
+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);
#ifdef DLL_EXPORT
-XBT_PUBLIC_DATA(s_xbt_log_category_t) _XBT_LOGV(XBT_LOG_ROOT_CAT);
+XBT_PUBLIC_DATA s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT);
#else
// If we `dllexport` the root log category, MinGW does not want us to take its address with the error:
// > initializer element is not constant
/* ********************** */
/**
- * \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
/** @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, ...) \
/** @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(...) \
*/
#define XBT_HERE(...) XBT_LOG(xbt_log_priority_trace, "-- was here" __VA_ARGS__)
+/** @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_ */