Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot//simgrid/simgrid
[simgrid.git] / include / xbt / log.h
index 56e9159..1dcdfde 100644 (file)
@@ -90,40 +90,30 @@ typedef enum {
 #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)
+/* Apparently, constructor priorities are not supported by gcc on Macs */
+#if __GNUC__ && __APPLE__
+#  define _XBT_LOGV_CTOR_ATTRIBUTE
+#else
+#  define _XBT_LOGV_CTOR_ATTRIBUTE _XBT_GNUC_CONSTRUCTOR(600)
+#endif
 
 /* The root of the category hierarchy. */
 #define XBT_LOG_ROOT_CAT   root
 
-/* The whole tree of categories is connected by setting the address of
- * the parent category as a field of the child one.
+/* The whole tree of categories is connected by setting the address of the
+ * parent category as a field of the child one.  This is normally done at the
+ * first use of the category.
  *
- * In strict ansi C, we are allowed to initialize a variable with "a
- * pointer to an lvalue designating an object of static storage
- * duration" [ISO/IEC 9899:1999, Section 6.6].
- * 
- * Unfortunately, Visual C builder does not target any standard
- * compliance, and C99 is not an exception to this unfortunate rule.
- * 
- * So, we work this around by adding a XBT_LOG_CONNECT_PARENT() macro,
- * allowing to connect a child to its parent. It should be used
- * during the initialization of the code, before the child category
- * gets used.
- * 
- * When compiling with gcc, this is not necessary (XBT_LOG_CONNECT_PARENT
- * defines to nothing). When compiling with MSVC, this is needed if
- * you don't want to see your child category become a child of root
- * directly.
- */
-#if defined(_MSC_VER)
-# define _XBT_LOG_PARENT_INITIALIZER(parent) NULL
-# define XBT_LOG_CONNECT_PARENT(child, parent_cat)                      \
-  _XBT_LOGV(child).parent = &_XBT_LOGV(parent_cat)
-#else
-# define _XBT_LOG_PARENT_INITIALIZER(parent) &_XBT_LOGV(parent)
-# define XBT_LOG_CONNECT_PARENT(child, parent_cat)                      \
-  /* xbt_assert(_XBT_LOGV(child).parent == &_XBT_LOGV(parent_cat)); */  \
-  ((void)0)
-#endif
+ * 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().
+ */
 
 #define XBT_LOG_CONNECT(cat)                    \
   if (1) {                                      \
@@ -136,16 +126,16 @@ typedef enum {
  * 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)           \
-  XBT_PUBLIC(void) _XBT_LOGV_CTOR(catName)(void);                       \
+  XBT_PUBLIC(void) _XBT_LOGV_CTOR(catName)(void) _XBT_LOGV_CTOR_ATTRIBUTE; \
   void _XBT_LOGV_CTOR(catName)(void)                                    \
   {                                                                     \
     XBT_LOG_EXTERNAL_CATEGORY(catName);                                 \
-    /* Note: _XBT_LOGV(parent) should be already declared here. */      \
-    XBT_LOG_CONNECT_PARENT(catName, parent);                            \
-    _xbt_log_cat_init(&_XBT_LOGV(catName), xbt_log_priority_uninitialized); \
+    if (!_XBT_LOGV(catName).initialized) {                              \
+      _xbt_log_cat_init(&_XBT_LOGV(catName), xbt_log_priority_uninitialized); \
+    }                                                                   \
   }                                                                     \
   XBT_EXPORT_NO_IMPORT(s_xbt_log_category_t) _XBT_LOGV(catName) = {     \
-    _XBT_LOG_PARENT_INITIALIZER(parent),                                \
+    &_XBT_LOGV(parent),                                                 \
     NULL /* firstChild */,                                              \
     NULL /* nextSibling */,                                             \
     #catName,                                                           \
@@ -508,28 +498,30 @@ extern xbt_log_layout_t xbt_log_default_layout;
  */
 #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, _XBT_FUNCTION)
+#define _XBT_IN_OUT_ARGN(fmt, ...) \
+  XBT_LOG(xbt_log_priority_trace, fmt, _XBT_FUNCTION, __VA_ARGS__)
+
 /** @ingroup XBT_log
  *  @hideinitializer
  *  @brief Log at TRACE priority that we entered in current function, appending a user specified format.
  */
-#define XBT_IN(...) \
-  _XBT_IF_ONE_ARG(_XBT_IN_ARG1, _XBT_IN_ARGN, __VA_ARGS__)(__VA_ARGS__)
-#define _XBT_IN_ARG1(fmt) \
-  XBT_LOG(xbt_log_priority_trace, ">> begin of %s" fmt, _XBT_FUNCTION)
-#define _XBT_IN_ARGN(fmt, ...) \
-  XBT_LOG(xbt_log_priority_trace, ">> begin of %s" fmt, _XBT_FUNCTION, __VA_ARGS__)
+#define XBT_IN(...) _XBT_IN_OUT(">> begin of %s" __VA_ARGS__)
 
 /** @ingroup XBT_log
  *  @hideinitializer
- *  @brief Log at TRACE priority that we exited the current function.
+ *  @brief Log at TRACE priority that we exited the current function, appending a user specified format.
  */
-#define XBT_OUT() XBT_LOG(xbt_log_priority_trace, "<< end of %s", _XBT_FUNCTION)
+#define XBT_OUT(...) _XBT_IN_OUT("<< end of %s" __VA_ARGS__)
 
 /** @ingroup XBT_log
  *  @hideinitializer
- *  @brief Log at TRACE priority a message indicating that we reached that point.
+ *  @brief Log at TRACE priority a message indicating that we reached that point, appending a user specified format.
  */
-#define XBT_HERE() XBT_LOG(xbt_log_priority_trace, "-- was here")
+#define XBT_HERE(...) XBT_LOG(xbt_log_priority_trace, "-- was here" __VA_ARGS__)
 
 #ifdef XBT_USE_DEPRECATED