Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define a constructor function for each log category.
[simgrid.git] / include / xbt / log.h
index 19f0ca7..64323f7 100644 (file)
@@ -1,6 +1,6 @@
 /* log - a generic logging facility in the spirit of log4j                  */
 
-/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2004-2011. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -18,7 +18,7 @@
  *     
  *  This is the list of all existing log categories in SimGrid.
  *  This list was automatically extracted from the source code by
- *  the src/xbt_log_extract_hierarchy utility.
+ *  the tools/doxygen/xbt_log_extract_hierarchy.pl utility.
  *     
  *  You can thus be certain that it is uptodate, but it may somehow
  *  lack a final manual touch.
@@ -35,6 +35,7 @@
 
 #include "xbt/misc.h"
 #include <stdarg.h>
+#include <stddef.h>             /* NULL */
 SG_BEGIN_DECL()
 /**\brief Log priorities
  * \ingroup XBT_log
@@ -85,8 +86,10 @@ typedef enum {
 #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_LOG_CONCAT(x,y) x ## y
+#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)
 
 /* The root of the category hierarchy. */
 #define XBT_LOG_ROOT_CAT   root
@@ -101,40 +104,60 @@ typedef enum {
  * 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() macro,
+ * 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
+ * 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_cat,child)       _XBT_LOGV(child).parent = &_XBT_LOGV(parent_cat)
+# 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_cat,child)      /*  xbt_assert(_XBT_LOGV(child).parent == &_XBT_LOGV(parent_cat)) */
+# define XBT_LOG_CONNECT_PARENT(child, parent_cat)                      \
+  /* xbt_assert(_XBT_LOGV(child).parent == &_XBT_LOGV(parent_cat)); */  \
+  ((void)0)
 #endif
 
+#define XBT_LOG_CONNECT(child, parent_cat)      \
+  if (1) {                                      \
+    extern void _XBT_LOGV_CTOR(child)(void);    \
+    _XBT_LOGV_CTOR(child)();                    \
+  } 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 */
-#define XBT_LOG_NEW_SUBCATEGORY_helper(catName, parent, desc) \
-    XBT_EXPORT_NO_IMPORT(s_xbt_log_category_t) _XBT_LOGV(catName) = {       \
-        _XBT_LOG_PARENT_INITIALIZER(parent),            \
-        NULL /* firstChild */,                          \
-       NULL /* nextSibling */,                         \
-        #catName,                                       \
-        xbt_log_priority_uninitialized /* threshold */, \
-        1 /* isThreshInherited */,                      \
-        NULL /* appender */,                            \
-       NULL /* layout */,                              \
-       1 /* additivity */                              \
-    }
+#define XBT_LOG_NEW_SUBCATEGORY_helper(catName, parent, desc)           \
+  XBT_PUBLIC(void) _XBT_LOGV_CTOR(catName)(void);                       \
+  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); \
+  }                                                                     \
+  XBT_EXPORT_NO_IMPORT(s_xbt_log_category_t) _XBT_LOGV(catName) = {     \
+    _XBT_LOG_PARENT_INITIALIZER(parent),                                \
+    NULL /* firstChild */,                                              \
+    NULL /* nextSibling */,                                             \
+    #catName,                                                           \
+    desc,                                                               \
+    0 /*initialized */,                                                 \
+    xbt_log_priority_uninitialized /* threshold */,                     \
+    1 /* isThreshInherited */,                                          \
+    NULL /* appender */,                                                \
+    NULL /* layout */,                                                  \
+    1 /* additivity */                                                  \
+  }
+
 /**
  * \ingroup XBT_log
  * \param catName name of new category
@@ -145,8 +168,8 @@ typedef enum {
  * Defines a new subcategory of the parent. 
  */
 #define XBT_LOG_NEW_SUBCATEGORY(catName, parent, desc)    \
-    extern s_xbt_log_category_t _XBT_LOGV(parent); \
-    XBT_LOG_NEW_SUBCATEGORY_helper(catName, parent, desc) \
+  XBT_LOG_EXTERNAL_CATEGORY(parent);                      \
+  XBT_LOG_NEW_SUBCATEGORY_helper(catName, parent, desc)   \
 
 /**
  * \ingroup XBT_log  
@@ -242,13 +265,13 @@ typedef struct xbt_log_category_s s_xbt_log_category_t,
  * Do NOT access any members of this structure directly. FIXME: move to private?
  */
 
-#define XBT_LOG_BUFF_SIZE 2048  /* Size of the static string in which we build the log string */
-
 struct xbt_log_category_s {
   xbt_log_category_t parent;
   xbt_log_category_t firstChild;
   xbt_log_category_t nextSibling;
   const char *name;
+  const char *description;
+  int initialized;
   int threshold;
   int isThreshInherited;
   xbt_log_appender_t appender;
@@ -263,8 +286,8 @@ struct xbt_log_event_s {
   const char *functionName;
   int lineNum;
   va_list ap;
-  va_list ap_copy;              /* need a copy to launch dynamic layouts when the static ones overflowed */
-  char buffer[XBT_LOG_BUFF_SIZE];
+  char *buffer;
+  int buffer_size;
 };
 
 /**
@@ -363,13 +386,12 @@ extern xbt_log_layout_t xbt_log_default_layout;
  *
  * NOTES
  * First part is a compile-time constant.
- * Call to _log_initCat only happens once.
+ * Call to xbt_log_cat_init only happens once.
  */
 #define _XBT_LOG_ISENABLEDV(catv, priority)                  \
        (priority >= XBT_LOG_STATIC_THRESHOLD                 \
-        && priority >= catv.threshold                         \
-        && (catv.threshold != xbt_log_priority_uninitialized \
-            || _xbt_log_cat_init(&catv, priority)) )
+        && (catv.initialized || _xbt_log_cat_init(&catv, priority)) \
+        && priority >= catv.threshold)
 
 /*
  * Internal Macros
@@ -395,7 +417,6 @@ extern xbt_log_layout_t xbt_log_default_layout;
   fprintf(stderr,"%s:%d:\n" f, __FILE__, __LINE__, __VA_ARGS__)
 # define XBT_LOG(...) XBT_CLOG(0, __VA_ARGS__)
 #else
-# include <string.h>            /* memset */
 # define XBT_CLOG_(catv, prio, ...)                                     \
   do {                                                                  \
     if (_XBT_LOG_ISENABLEDV(catv, prio)) {                              \
@@ -405,7 +426,6 @@ extern xbt_log_layout_t xbt_log_default_layout;
       _log_ev.fileName = __FILE__;                                      \
       _log_ev.functionName = _XBT_FUNCTION;                             \
       _log_ev.lineNum = __LINE__;                                       \
-      memset(_log_ev.buffer, 0, XBT_LOG_BUFF_SIZE);                     \
       _xbt_log_event_log(&_log_ev, __VA_ARGS__);                        \
     }                                                                   \
   }  while (0)