Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
doc fix.
[simgrid.git] / src / xbt / log.c
index 753448d..83ee7ff 100644 (file)
@@ -7,7 +7,9 @@
 /* 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. */
 
 /* 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. */
 
+
 #include <stdarg.h>
 #include <stdarg.h>
+#include "gras_config.h" /* to get a workgin stdarg.h */
 #include <ctype.h>
 
 #include "xbt_modinter.h"
 #include <ctype.h>
 
 #include "xbt_modinter.h"
 #include "xbt/error.h"
 #include "xbt/dynar.h"
 
 #include "xbt/error.h"
 #include "xbt/dynar.h"
 
-
-/** \defgroup XBT_log Logging support.
- *  \brief A generic logging facility in the spirit of log4j
+/** \addtogroup XBT_log
  *
  *  This section describes the API to the log functions used 
  *  everywhere in this project.
      
  *
  *  This section describes the API to the log functions used 
  *  everywhere in this project.
      
-<h3>Overview</h3>
+\section log_overview Overview
      
 This is an adaptation of the log4c project, which is dead upstream, and
 which I was given the permission to fork under the LGPL licence by the
      
 This is an adaptation of the log4c project, which is dead upstream, and
 which I was given the permission to fork under the LGPL licence by the
@@ -37,7 +37,7 @@ concepts work together to enable developers to log messages according to
 message type and priority, and to control at runtime how these messages are
 formatted and where they are reported.
 
 message type and priority, and to control at runtime how these messages are
 formatted and where they are reported.
 
-<h3>Category hierarchy</h3>
+\section log_cat Category hierarchy
 
 The first and foremost advantage of any logging API over plain printf()
 resides in its ability to disable certain log statements while allowing
 
 The first and foremost advantage of any logging API over plain printf()
 resides in its ability to disable certain log statements while allowing
@@ -71,7 +71,9 @@ definition.
 Typically, there will be a Category for each module and sub-module, so you
 can independently control logging for each module.
 
 Typically, there will be a Category for each module and sub-module, so you
 can independently control logging for each module.
 
-<h3>Priority</h3>
+For a list of all existing categories, please refer to the \ref XBT_log_cats section.
+
+\section log_pri Priority
 
 A category may be assigned a threshold priorty. The set of priorites are
 defined by the \ref e_xbt_log_priority_t enum. All logging request under
 
 A category may be assigned a threshold priorty. The set of priorites are
 defined by the \ref e_xbt_log_priority_t enum. All logging request under
@@ -110,7 +112,7 @@ equivalent to the shorter:
 
 <code>CWARN4(MyCat, "Values are: %d and '%s'", 5, "oops");</code>
 
 
 <code>CWARN4(MyCat, "Values are: %d and '%s'", 5, "oops");</code>
 
-<h3>Default category</h3>
+\subsection log_subcat Using a default category
   
 If \ref XBT_LOG_NEW_DEFAULT_SUBCATEGORY(MyCat, Parent) or
 \ref XBT_LOG_NEW_DEFAULT_CATEGORY(MyCat) is used to create the
   
 If \ref XBT_LOG_NEW_DEFAULT_SUBCATEGORY(MyCat, Parent) or
 \ref XBT_LOG_NEW_DEFAULT_CATEGORY(MyCat) is used to create the
@@ -121,7 +123,7 @@ category, then the even shorter form can be used:
 Only one default category can be created per file, though multiple
 non-defaults can be created and used.
 
 Only one default category can be created per file, though multiple
 non-defaults can be created and used.
 
-<h3>Example</h3>
+\section log_example Example
 
 Here is a more complete example:
 
 
 Here is a more complete example:
 
@@ -151,7 +153,7 @@ int main() {
 }
 \endverbatim
 
 }
 \endverbatim
 
-<h3>Configuration</h3>
+\section log_conf Configuration
 Configuration is typically done during program initialization by invoking
 the xbt_log_control_set() method. The control string passed to it typically
 comes from the command line. Look at the documentation for that function for
 Configuration is typically done during program initialization by invoking
 the xbt_log_control_set() method. The control string passed to it typically
 comes from the command line. Look at the documentation for that function for
@@ -162,7 +164,7 @@ Any SimGrid program can furthermore be configured at run time by passing a
 --surf-log are synonyms). You can provide several of those arguments to
 change the setting of several categories.
 
 --surf-log are synonyms). You can provide several of those arguments to
 change the setting of several categories.
 
-<h3>Performance</h3>
+\section log_perf Performance
 
 Clever design insures efficiency. Except for the first invocation, a
 disabled logging request requires an a single comparison of a static
 
 Clever design insures efficiency. Except for the first invocation, a
 disabled logging request requires an a single comparison of a static
@@ -179,7 +181,7 @@ Compiling with the \verbatim-DNLOG\endverbatim option disables all logging
 requests at compilation time while the \verbatim-DNDEBUG\endverbatim disables 
 the requests of priority below INFO.
  
 requests at compilation time while the \verbatim-DNDEBUG\endverbatim disables 
 the requests of priority below INFO.
  
-<h3>Appenders</h3>
+\section log_app Appenders
 
 Each category has an optional appender. An appender is a pointer to a
 structure which starts with a pointer to a doAppend() function. DoAppend()
 
 Each category has an optional appender. An appender is a pointer to a
 structure which starts with a pointer to a doAppend() function. DoAppend()
@@ -203,7 +205,7 @@ remote dedicated server, or other ones offering different output formats.
 This is on our TODO list for quite a while now, but your help would be
 welcome here.
 
 This is on our TODO list for quite a while now, but your help would be
 welcome here.
 
-<h3>Misc and Caveats</h3>
+\section log_misc Misc and Caveats
 
   - Do not use any of the macros that start with '_'.
   - Log4J has a 'rolling file appender' which you can select with a run-time
 
   - Do not use any of the macros that start with '_'.
   - Log4J has a 'rolling file appender' which you can select with a run-time
@@ -216,93 +218,6 @@ welcome here.
 /*
 FAIRE DES ZOLIS LOGS
 --------------------
 /*
 FAIRE DES ZOLIS LOGS
 --------------------
-Dans gras, tu ne te contente pas d'écrire des choses à l'écran, mais tu
-écris sur un sujet particulier (notion de canal) des choses d'une gravité
-particulière. Il y a 7 niveaux de gravité.
- trace: tracer les entrées dans une fonction, retour de fonction
-        (famille de macros XBT_IN/XBT_OUT)
- debug: pour t'aider à mettre au point le module, potentiellement tres bavard
- verbose: quelques infos succintes sur les internals du module
- info: niveau normal, ton de la conversation
- warning: problème potentiel, mais auquel on a su faire face
- error: problème qui t'as empêché de faire ton job
- critical: juste avant de mourir
-
-Quand on compile avec -DNDEBUG (par défaut dans le paquet Debian), tout ce
-qui est '>= verbose' est supprimé au moment de la compilation. Retiré du
-binaire, killé.
-
-Ensuite, tu écris dans un canal particulier. Tous les canaux sont rangés en
-arbre. Il faudrait faire un ptit script qui fouille les sources à la
-recherche des macros XBT_LOG_NEW_* utilisées pour créer des canaux. Le
-dernier argument de ces macros est ignoré dans le source. Il est destiné à
-être la documentation de la chose en une ligne. En gros, ca fait:
-root
- +--xbt
- |   +--config
- |   +--dict
- |   |   +--dict_cursor
- |   |   +--dict_elm
- |   |   ...
- |   +--dynar
- |   +--set
- |   +--log
- |   +--module
- +--gras
-     +--datadesc
-     |   +--ddt_cbps
-     |   +--ddt_convert
-     |   +--ddt_exchange
-     |   +--ddt_parse
-     |       +--lexer
-     +--msg
-     +--transport
-         +--raw_trp (Je devrais tuer ce module, un jour)
-         +--trp_buf
-         +--trp_sg
-         +--trp_file
-         +--trp_tcp
-         
-Et ensuite les utilisateurs peuvent choisir le niveau de gravité qui les
-interresse sur tel ou tel sujet.
-
-Toute la mécanique de logging repose sur des variables statiques dont le nom
-dépend du nom du canal.
- => attention aux conflits de nom de canal
- => il faut une macro XBT_LOG dans chaque fichier où tu fais des logs.
-XBT_LOG_NEW_CATEGORY: nouveau canal sous "root". Rare, donc.
-XBT_LOG_NEW_SUBCATEGORY: nouveau canal dont on précise le père.
-XBT_LOG_DEFAULT_CATEGORY: indique quel est le canal par défaut dans ce fichier
-XBT_LOG_NEW_DEFAULT_CATEGORY: Crèe un canal et l'utilise par défaut
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY: devine
-XBT_LOG_EXTERNAL_CATEGORY: quand tu veux utiliser par défaut un canal créé
-                           dans un autre fichier.
-
-Une fois que ton canal est créé, tu l'utilise avec les macros LOG, DEBUG,
-VERB, WARN, ERROR et CRITICAL. Il faut que tu donne le nombre d'arguments
-après le nom de macro. Exemple: LOG2("My name is %s %s","Martin","Quinson")
-Si tu veux préciser explicitement le canal où écrire, ajoute un C devant le
-nom de la macro. Exemple: CCRITICAL0(module, "Cannot initialize GRAS")
-
-Toutes ces macros (enfin, ce en quoi elles se réécrivent) vérifient leurs
-arguments comme printf le fait lorsqu'on compile avec gcc. 
-LOG1("name: %d","toto"); donne un warning, et donc une erreur en mode
-mainteneur.
-
-Enfin, tu peux tester si un canal est ouvert à une priorité donnée (pour
-préparer plus de débug, par exemple. Dans le parseur, je fais du pretty
-printing sur ce qu'il faut parser dans ce cas).
-XBT_LOG_ISENABLED(catName, priority) Le second argument doit être une valeur
-de e_xbt_log_priority_t (log.h). Par exemple: xbt_log_priority_verbose
-
-Voila sur comment mettre des logs dans ton code. N'hesite pas à faire pleins
-de canaux différents pour des aspects différents de ton code. En
-particulier, dans les dict, j'ai un canal pour l'ajout, le retrait, le
-netoyage du code après suppression et ainsi de suite. De cette façon, je
-peux choisir qui m'interresse.
-
-
 Pour utiliser les logs, tu déjà faire, non ? Tu colle sur la ligne de
 commande un ou plusieurs arguments de la forme
   --gras-log="<réglage> [<reglage>+]" (ou sans " si t'as pas d'espace)
 Pour utiliser les logs, tu déjà faire, non ? Tu colle sur la ligne de
 commande un ou plusieurs arguments de la forme
   --gras-log="<réglage> [<reglage>+]" (ou sans " si t'as pas d'espace)
@@ -322,8 +237,8 @@ static xbt_dynar_t xbt_log_settings=NULL;
 static void _free_setting(void *s) {
   xbt_log_setting_t set=(xbt_log_setting_t)s;
   if (set) {
 static void _free_setting(void *s) {
   xbt_log_setting_t set=(xbt_log_setting_t)s;
   if (set) {
-    xbt_free(set->catname);
-/*    xbt_free(set); FIXME: uncommenting this leads to segfault when more than one chunk is passed as gras-log */
+    free(set->catname);
+/*    free(set); FIXME: uncommenting this leads to segfault when more than one chunk is passed as gras-log */
   }
 }
 
   }
 }
 
@@ -347,12 +262,11 @@ s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT) = {
 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(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_DEFAULT_SUBCATEGORY(log,xbt,"Loggings from the logging mecanism itself");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(log,xbt,"Loggings from the logging mechanism itself");
 
 
-void xbt_log_init(int *argc,char **argv, const char *defaultlog) {
+void xbt_log_init(int *argc,char **argv) {
   int i,j;
   char *opt;
   int i,j;
   char *opt;
-  int found=0;
 
   /* Set logs and init log submodule */
   for (i=1; i<*argc; i++) {
 
   /* Set logs and init log submodule */
   for (i=1; i<*argc; i++) {
@@ -360,7 +274,6 @@ void xbt_log_init(int *argc,char **argv, const char *defaultlog) {
        !strncmp(argv[i],"--surf-log=",strlen("--surf-log=")) ||
        !strncmp(argv[i],"--msg-log=",strlen("--msg-log=")) ||
        !strncmp(argv[i],"--xbt-log=",strlen("--xbt-log="))) {
        !strncmp(argv[i],"--surf-log=",strlen("--surf-log=")) ||
        !strncmp(argv[i],"--msg-log=",strlen("--msg-log=")) ||
        !strncmp(argv[i],"--xbt-log=",strlen("--xbt-log="))) {
-      found = 1;
       opt=strchr(argv[i],'=');
       opt++;
       xbt_log_control_set(opt);
       opt=strchr(argv[i],'=');
       opt++;
       xbt_log_control_set(opt);
@@ -374,9 +287,6 @@ void xbt_log_init(int *argc,char **argv, const char *defaultlog) {
       i--; /* compensate effect of next loop incrementation */
     }
   }
       i--; /* compensate effect of next loop incrementation */
     }
   }
-  if (!found && defaultlog) {
-     xbt_log_control_set(defaultlog);
-  }
 }
 
 void xbt_log_exit(void) {
 }
 
 void xbt_log_exit(void) {
@@ -406,9 +316,9 @@ static void _apply_control(xbt_log_category_t cat) {
       xbt_log_threshold_set(cat, setting->thresh);
       xbt_dynar_cursor_rm(xbt_log_settings,&cursor);
 
       xbt_log_threshold_set(cat, setting->thresh);
       xbt_dynar_cursor_rm(xbt_log_settings,&cursor);
 
-      if (cat->threshold <= xbt_log_priority_verbose) {
+      if (cat->threshold <= xbt_log_priority_debug) {
        s_xbt_log_event_t _log_ev = 
        s_xbt_log_event_t _log_ev = 
-         {cat,xbt_log_priority_verbose,__FILE__,_XBT_GNUC_FUNCTION,__LINE__};
+         {cat,xbt_log_priority_debug,__FILE__,_XBT_FUNCTION,__LINE__};
        _xbt_log_event_log(&_log_ev,
                 "Apply settings for category '%s': set threshold to %s (=%d)",
                 cat->name, 
        _xbt_log_event_log(&_log_ev,
                 "Apply settings for category '%s': set threshold to %s (=%d)",
                 cat->name, 
@@ -418,7 +328,7 @@ static void _apply_control(xbt_log_category_t cat) {
   }
   if (!found && cat->threshold <= xbt_log_priority_verbose) {
     s_xbt_log_event_t _log_ev = 
   }
   if (!found && cat->threshold <= xbt_log_priority_verbose) {
     s_xbt_log_event_t _log_ev = 
-      {cat,xbt_log_priority_verbose,__FILE__,_XBT_GNUC_FUNCTION,__LINE__};
+      {cat,xbt_log_priority_verbose,__FILE__,_XBT_FUNCTION,__LINE__};
     _xbt_log_event_log(&_log_ev,
                        "Category '%s': inherited threshold = %s (=%d)",
                        cat->name,
     _xbt_log_event_log(&_log_ev,
                        "Category '%s': inherited threshold = %s (=%d)",
                        cat->name,
@@ -560,7 +470,7 @@ static void _xbt_log_parse_setting(const char*        control_string,
     } else {
       xbt_assert1(FALSE,"Unknown priority name: %s",eq+1);
     }
     } else {
       xbt_assert1(FALSE,"Unknown priority name: %s",eq+1);
     }
-    xbt_free(neweq);
+    free(neweq);
   } else {
     char buff[512];
     snprintf(buff,min(512,eq - dot - 1),"%s",dot+1);
   } else {
     char buff[512];
     snprintf(buff,min(512,eq - dot - 1),"%s",dot+1);
@@ -633,7 +543,7 @@ static void _cleanup_double_spaces(char *s) {
  * where [category] is one the category names and keyword is one of the
  * following:
  *
  * where [category] is one the category names and keyword is one of the
  * following:
  *
- *      thresh         value is an integer priority level. Sets the category's
+ *      thres                  value is an integer priority level. Sets the category's
  *                        threshold priority.
  *
  * \warning
  *                        threshold priority.
  *
  * \warning
@@ -681,12 +591,12 @@ void xbt_log_control_set(const char* control_string) {
       set = xbt_new(s_xbt_log_setting_t,1);
     } else {
       DEBUG0("Apply directly");
       set = xbt_new(s_xbt_log_setting_t,1);
     } else {
       DEBUG0("Apply directly");
-      xbt_free(set->catname);
+      free(set->catname);
       xbt_log_threshold_set(cat,set->thresh);
     }
   }
       xbt_log_threshold_set(cat,set->thresh);
     }
   }
-  xbt_free(set);
-  xbt_free(cs);
+  free(set);
+  free(cs);
 } 
 
 void xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app) {
 } 
 
 void xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app) {