Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix example in the documentation
[simgrid.git] / src / xbt / log.c
index 973a86f..31b809f 100644 (file)
@@ -1,8 +1,7 @@
-/* $Id$ */
-
 /* log - a generic logging facility in the spirit of log4j                  */
 
-/* Copyright (c) 2003-2007 Martin Quinson. All rights reserved.             */
+/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. 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. */
@@ -25,6 +24,7 @@
 #include "xbt/dynar.h"
 
 XBT_PUBLIC_DATA(int) (*xbt_pid) ();
+int xbt_log_no_loc = 0; /* if set to true (with --log=no_loc), file localization will be omitted (for tesh tests) */
 
 /** \addtogroup XBT_log
  *
@@ -269,17 +269,17 @@ int main() {
        xbt_log_control_set("SA.thresh:3");
 
        / * This request is enabled, because WARNING >= INFO. * /
-       CWARN2(VSS, "Low fuel level.");
+       CWARN0(VSS, "Low fuel level.");
 
        / * This request is disabled, because DEBUG < INFO. * /
-       CDEBUG2(VSS, "Starting search for nearest gas station.");
+       CDEBUG0(VSS, "Starting search for nearest gas station.");
 
        / * The default category SA inherits its priority from VSS. Thus,
           the following request is enabled because INFO >= INFO.  * /
-       INFO1("Located nearest gas station.");
+       INFO0("Located nearest gas station.");
 
        / * This request is disabled, because DEBUG < INFO. * /
-       DEBUG1("Exiting gas station search");
+       DEBUG0("Exiting gas station search");
 }
 \endverbatim
 
@@ -463,12 +463,11 @@ This is on our TODO list for quite a while now, but your help would be
 welcome here, too.
 
 
-          *//*' */
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              *//*' */
 
 
 xbt_log_appender_t xbt_log_default_appender = NULL;     /* set in log_init */
 xbt_log_layout_t xbt_log_default_layout = NULL; /* set in log_init */
-int _log_usable = 0;
 
 typedef struct {
   char *catname;
@@ -517,27 +516,29 @@ XBT_LOG_NEW_CATEGORY(xbt, "All XBT categories (simgrid toolbox)");
 XBT_LOG_NEW_CATEGORY(surf, "All SURF categories");
 XBT_LOG_NEW_CATEGORY(msg, "All MSG categories");
 XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories");
+XBT_LOG_NEW_CATEGORY(mc, "All MC categories");
+XBT_LOG_NEW_CATEGORY(bindings, "All bindings categories");
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(log, xbt,
                                 "Loggings from the logging mechanism itself");
 
+/* create the default appender and install it in the root category,
+   which were already created (damnit. Too slow little beetle) */
+void xbt_log_preinit(void) {
+  xbt_log_default_appender = xbt_log_appender_file_new(NULL);
+  xbt_log_default_layout = xbt_log_layout_simple_new(NULL);
+  _XBT_LOGV(XBT_LOG_ROOT_CAT).appender = xbt_log_default_appender;
+  _XBT_LOGV(XBT_LOG_ROOT_CAT).layout = xbt_log_default_layout;
+}
+
 /** @brief Get all logging settings from the command line
  *
  * xbt_log_control_set() is called on each string we got from cmd line
  */
-void xbt_log_init(int *argc, char **argv)
-{
+void xbt_log_init(int *argc, char **argv) {
   int i, j;
   char *opt;
 
-  /* create the default appender and install it in the root category,
-     which were already created (damnit. Too slow little beetle) */
-  xbt_log_default_appender = xbt_log_appender_file_new(NULL);
-  xbt_log_default_layout = xbt_log_layout_simple_new(NULL);
-  _XBT_LOGV(XBT_LOG_ROOT_CAT).appender = xbt_log_default_appender;
-  _XBT_LOGV(XBT_LOG_ROOT_CAT).layout = xbt_log_default_layout;
-  _log_usable = 1;
-
   //    _XBT_LOGV(log).threshold = xbt_log_priority_debug; /* uncomment to set the LOG category to debug directly */
 
   /* Set logs and init log submodule */
@@ -590,26 +591,17 @@ static void log_cat_exit(xbt_log_category_t cat)
     log_cat_exit(child);
 }
 
-void xbt_log_exit(void)
+void xbt_log_postexit(void)
 {
   VERB0("Exiting log");
   xbt_dynar_free(&xbt_log_settings);
   log_cat_exit(&_XBT_LOGV(XBT_LOG_ROOT_CAT));
-  _log_usable = 0;
 }
 
 void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...)
 {
 
   xbt_log_category_t cat = ev->cat;
-  if (!_log_usable) {
-    /* Make sure that the layouts have been malloced */
-    xbt_log_default_appender = xbt_log_appender_file_new(NULL);
-    xbt_log_default_layout = xbt_log_layout_simple_new(NULL);
-    _XBT_LOGV(XBT_LOG_ROOT_CAT).appender = xbt_log_default_appender;
-    _XBT_LOGV(XBT_LOG_ROOT_CAT).layout = xbt_log_default_layout;
-    _log_usable = 1;
-  }
 
   va_start(ev->ap, fmt);
   va_start(ev->ap_copy, fmt);
@@ -629,85 +621,59 @@ void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...)
   va_end(ev->ap);
   va_end(ev->ap_copy);
 
-#ifdef WIN32
+#ifdef _XBT_WIN32
   free(ev->buffer);
 #endif
 }
 
+/* NOTE:
+ *
+ * The standard logging macros use _XBT_LOG_ISENABLED, which calls
+ * _xbt_log_cat_init().  Thus, if we want to avoid an infinite
+ * recursion, we can not use the standard logging macros in
+ * _xbt_log_cat_init(), and in all functions called from it.
+ *
+ * To circumvent the problem, we define the macro_xbt_log_init() as
+ * (0) for the length of the affected functions, and we do not forget
+ * to undefine it at the end!
+ */
+
 static void _xbt_log_cat_apply_set(xbt_log_category_t category,
                                    xbt_log_setting_t setting)
 {
-
-  s_xbt_log_event_t _log_ev;
+#define _xbt_log_cat_init(a, b) (0)
 
   if (setting->thresh != xbt_log_priority_uninitialized) {
     xbt_log_threshold_set(category, setting->thresh);
 
-    if (category->threshold <= xbt_log_priority_debug) {
-      _log_ev.cat = category;
-      _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,
-                         "Apply settings for category '%s': set threshold to %s (=%d)",
-                         category->name,
-                         xbt_log_priority_names[category->threshold],
-                         category->threshold);
-    }
+    DEBUG3("Apply settings for category '%s': set threshold to %s (=%d)",
+           category->name, xbt_log_priority_names[category->threshold],
+           category->threshold);
   }
 
   if (setting->fmt) {
     xbt_log_layout_set(category, xbt_log_layout_format_new(setting->fmt));
 
-    if (category->threshold <= xbt_log_priority_debug) {
-      _log_ev.cat = category;
-      _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,
-                         "Apply settings for category '%s': set format to %s",
-                         category->name, setting->fmt);
-    }
+    DEBUG2("Apply settings for category '%s': set format to %s",
+           category->name, setting->fmt);
   }
 
   if (setting->additivity != -1) {
     xbt_log_additivity_set(category, setting->additivity);
 
-    if (category->threshold <= xbt_log_priority_debug) {
-      _log_ev.cat = category;
-      _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,
-                         "Apply settings for category '%s': set additivity to %s",
-                         category->name,
-                         (setting->additivity ? "on" : "off"));
-    }
+    DEBUG2("Apply settings for category '%s': set additivity to %s",
+           category->name, (setting->additivity ? "on" : "off"));
   }
   if (setting->appender) {
     xbt_log_appender_set(category, setting->appender);
     if (!category->layout)
       xbt_log_layout_set(category, xbt_log_layout_simple_new(NULL));
     category->additivity = 0;
-    if (category->threshold <= xbt_log_priority_debug) {
-      _log_ev.cat = category;
-      _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,
-                         "Set %p as appender of category '%s'",
-                         setting->appender, category->name);
-    }
+    DEBUG2("Set %p as appender of category '%s'",
+           setting->appender, category->name);
   }
 
+#undef _xbt_log_cat_init
 }
 
 /*
@@ -718,26 +684,16 @@ static void _xbt_log_cat_apply_set(xbt_log_category_t category,
 int _xbt_log_cat_init(xbt_log_category_t category,
                       e_xbt_log_priority_t priority)
 {
+#define _xbt_log_cat_init(a, b) (0)
+
   unsigned int cursor;
   xbt_log_setting_t setting = NULL;
   int found = 0;
-  s_xbt_log_event_t _log_ev;
-
-  if (_XBT_LOGV(log).threshold <= xbt_log_priority_debug
-      && _XBT_LOGV(log).threshold != xbt_log_priority_uninitialized) {
-    _log_ev.cat = &_XBT_LOGV(log);
-    _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,
-                       "Initializing category '%s' (firstChild=%s, nextSibling=%s)",
-                       category->name,
-                       (category->firstChild ? category->
-                        firstChild->name : "none"),
-                       (category->nextSibling ? category->
-                        nextSibling->name : "none"));
-  }
+
+  DEBUG3("Initializing category '%s' (firstChild=%s, nextSibling=%s)",
+         category->name,
+         (category->firstChild ? category->firstChild->name : "none"),
+         (category->nextSibling ? category->nextSibling->name : "none"));
 
   if (category == &_XBT_LOGV(XBT_LOG_ROOT_CAT)) {
     category->threshold = xbt_log_priority_info;
@@ -749,21 +705,14 @@ int _xbt_log_cat_init(xbt_log_category_t category,
     if (!category->parent)
       category->parent = &_XBT_LOGV(XBT_LOG_ROOT_CAT);
 
-    if (_XBT_LOGV(log).threshold <= xbt_log_priority_debug
-        && _XBT_LOGV(log).threshold != xbt_log_priority_uninitialized) {
-      _log_ev.lineNum = __LINE__;
-      _xbt_log_event_log(&_log_ev, "Set %s (%s) as father of %s ",
-                         category->parent->name,
-                         (category->parent->threshold ==
-                          xbt_log_priority_uninitialized ? "uninited" :
-                          xbt_log_priority_names[category->
-                                                 parent->threshold]),
-                         category->name);
-    }
+    DEBUG3("Set %s (%s) as father of %s ",
+           category->parent->name,
+           (category->parent->threshold == xbt_log_priority_uninitialized ?
+            "uninited" : xbt_log_priority_names[category->parent->threshold]),
+           category->name);
     xbt_log_parent_set(category, category->parent);
 
-    if (_XBT_LOGV(log).threshold < xbt_log_priority_info
-        && _XBT_LOGV(log).threshold != xbt_log_priority_uninitialized) {
+    if (XBT_LOG_ISENABLED(log, xbt_log_priority_debug)) {
       char *buf, *res = NULL;
       xbt_log_category_t cpp = category->parent->firstChild;
       while (cpp) {
@@ -777,12 +726,10 @@ int _xbt_log_cat_init(xbt_log_category_t category,
         cpp = cpp->nextSibling;
       }
 
-      _log_ev.lineNum = __LINE__;
-      _xbt_log_event_log(&_log_ev,
-                         "Childs of %s: %s; nextSibling: %s",
-                         category->parent->name, res,
-                         (category->parent->nextSibling ? category->
-                          parent->nextSibling->name : "none"));
+      DEBUG3("Childs of %s: %s; nextSibling: %s",
+             category->parent->name, res,
+             (category->parent->nextSibling ?
+              category->parent->nextSibling->name : "none"));
 
       free(res);
     }
@@ -811,22 +758,14 @@ int _xbt_log_cat_init(xbt_log_category_t category,
     }
   }
 
-  if (!found && category->threshold <= xbt_log_priority_verbose) {
-
-    _log_ev.cat = &_XBT_LOGV(log);
-    _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,
-                       "Category '%s': inherited threshold = %s (=%d)",
-                       category->name,
-                       xbt_log_priority_names[category->threshold],
-                       category->threshold);
-  }
+  if (!found)
+    DEBUG3("Category '%s': inherited threshold = %s (=%d)",
+           category->name, xbt_log_priority_names[category->threshold],
+           category->threshold);
 
   return priority >= category->threshold;
+
+#undef _xbt_log_cat_init
 }
 
 void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent)
@@ -1050,6 +989,11 @@ void xbt_log_control_set(const char *control_string)
     return;
   DEBUG1("Parse log settings '%s'", control_string);
 
+  /* Special handling of no_loc request, which asks for any file localization to be omitted (for tesh runs) */
+  if (!strcmp(control_string,"no_loc")) {
+    xbt_log_no_loc=1;
+    return;
+  }
   /* some initialization if this is the first time that this get called */
   if (xbt_log_settings == NULL)
     xbt_log_settings = xbt_dynar_new(sizeof(xbt_log_setting_t),