Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
properly protect our definitions of MIN/MAX (w/o using undef to please sonar)
[simgrid.git] / src / xbt / log.c
index 04772a3..7853627 100644 (file)
@@ -1,6 +1,6 @@
 /* log - a generic logging facility in the spirit of log4j                  */
 
-/* Copyright (c) 2004-2017. The SimGrid Team.
+/* Copyright (c) 2004-2018. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 #include "xbt/sysdep.h"
 #include "xbt/xbt_os_thread.h"
 
+#ifndef MIN
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+
 int xbt_log_no_loc = 0; /* if set to true (with --log=no_loc), file localization will be omitted (for tesh tests) */
 static xbt_os_mutex_t log_cat_init_mutex = NULL;
 
@@ -92,182 +99,6 @@ void xbt_log_preinit(void)
   log_cat_init_mutex = xbt_os_mutex_init();
 }
 
-static void xbt_log_connect_categories(void)
-{
-  /* Connect our log channels: that must be done manually under windows */
-  /* Also permit that they are correctly listed by xbt_log_help_categories() */
-
-  /* xbt */
-  XBT_LOG_CONNECT(xbt);
-  XBT_LOG_CONNECT(log);
-  XBT_LOG_CONNECT(module);
-  XBT_LOG_CONNECT(replay);
-  XBT_LOG_CONNECT(xbt_cfg);
-  XBT_LOG_CONNECT(xbt_dict);
-  XBT_LOG_CONNECT(xbt_dict_cursor);
-  XBT_LOG_CONNECT(xbt_dict_elm);
-  XBT_LOG_CONNECT(xbt_dyn);
-  XBT_LOG_CONNECT(xbt_ex);
-  XBT_LOG_CONNECT(xbt_backtrace);
-  XBT_LOG_CONNECT(xbt_exception);
-  XBT_LOG_CONNECT(xbt_graph);
-  XBT_LOG_CONNECT(xbt_heap);
-  XBT_LOG_CONNECT(xbt_mallocator);
-  XBT_LOG_CONNECT(xbt_memory_map);
-  XBT_LOG_CONNECT(xbt_parmap);
-  XBT_LOG_CONNECT(xbt_sync);
-  XBT_LOG_CONNECT(xbt_sync_os);
-
-#ifdef simgrid_EXPORTS
-  /* The following categories are only defined in libsimgrid */
-
-  /* bindings */
-#if SIMGRID_HAVE_LUA
-  XBT_LOG_CONNECT(lua);
-  XBT_LOG_CONNECT(lua_host);
-  XBT_LOG_CONNECT(lua_platf);
-  XBT_LOG_CONNECT(lua_debug);
-#endif
-
-  /* instr */
-  XBT_LOG_CONNECT(instr);
-  XBT_LOG_CONNECT(instr_api);
-  XBT_LOG_CONNECT(instr_config);
-  XBT_LOG_CONNECT(instr_msg);
-  XBT_LOG_CONNECT(instr_msg_process);
-  XBT_LOG_CONNECT(instr_paje_containers);
-  XBT_LOG_CONNECT(instr_paje_header);
-  XBT_LOG_CONNECT(instr_paje_trace);
-  XBT_LOG_CONNECT(instr_paje_types);
-  XBT_LOG_CONNECT(instr_paje_values);
-  XBT_LOG_CONNECT(instr_resource);
-  XBT_LOG_CONNECT(instr_routing);
-  XBT_LOG_CONNECT(instr_surf);
-
-  /* jedule */
-#if SIMGRID_HAVE_JEDULE
-  XBT_LOG_CONNECT(jedule);
-  XBT_LOG_CONNECT(jed_sd);
-#endif
-
-  /* mc */
-#if SIMGRID_HAVE_MC
-  XBT_LOG_CONNECT(mc);
-  XBT_LOG_CONNECT(mc_checkpoint);
-  XBT_LOG_CONNECT(mc_comm_determinism);
-  XBT_LOG_CONNECT(mc_compare);
-  XBT_LOG_CONNECT(mc_dwarf);
-  XBT_LOG_CONNECT(mc_hash);
-  XBT_LOG_CONNECT(mc_liveness);
-  XBT_LOG_CONNECT(mc_memory);
-  XBT_LOG_CONNECT(mc_page_snapshot);
-  XBT_LOG_CONNECT(mc_request);
-  XBT_LOG_CONNECT(mc_safety);
-  XBT_LOG_CONNECT(mc_VisitedState);
-  XBT_LOG_CONNECT(mc_client);
-  XBT_LOG_CONNECT(mc_client_api);
-  XBT_LOG_CONNECT(mc_comm_pattern);
-  XBT_LOG_CONNECT(mc_process);
-  XBT_LOG_CONNECT(mc_protocol);
-  XBT_LOG_CONNECT(mc_Channel);
-  XBT_LOG_CONNECT(mc_ModelChecker);
-  XBT_LOG_CONNECT(mc_RegionSnaphot);
-  XBT_LOG_CONNECT(mc_Session);
-  XBT_LOG_CONNECT(mc_state);
-#endif
-  XBT_LOG_CONNECT(mc_global);
-  XBT_LOG_CONNECT(mc_config);
-  XBT_LOG_CONNECT(mc_record);
-
-  /* msg */
-  XBT_LOG_CONNECT(msg);
-  XBT_LOG_CONNECT(msg_action);
-  XBT_LOG_CONNECT(msg_gos);
-  XBT_LOG_CONNECT(msg_io);
-  XBT_LOG_CONNECT(msg_kernel);
-  XBT_LOG_CONNECT(msg_mailbox);
-  XBT_LOG_CONNECT(msg_process);
-  XBT_LOG_CONNECT(msg_synchro);
-  XBT_LOG_CONNECT(msg_task);
-  XBT_LOG_CONNECT(msg_vm);
-
-  /* s4u */
-  XBT_LOG_CONNECT(s4u);
-  XBT_LOG_CONNECT(s4u_activity);
-  XBT_LOG_CONNECT(s4u_actor);
-  XBT_LOG_CONNECT(s4u_netzone);
-  XBT_LOG_CONNECT(s4u_channel);
-  XBT_LOG_CONNECT(s4u_comm);
-  XBT_LOG_CONNECT(s4u_file);
-  XBT_LOG_CONNECT(s4u_link);
-  XBT_LOG_CONNECT(s4u_vm);
-
-  /* sg */
-  XBT_LOG_CONNECT(sg_host);
-
-  /* simdag */
-  XBT_LOG_CONNECT(sd);
-  XBT_LOG_CONNECT(sd_daxparse);
-#if HAVE_GRAPHVIZ
-  XBT_LOG_CONNECT(sd_dotparse);
-#endif
-  XBT_LOG_CONNECT(sd_kernel);
-  XBT_LOG_CONNECT(sd_task);
-
-  /* simix */
-  XBT_LOG_CONNECT(simix);
-  XBT_LOG_CONNECT(simix_context);
-  XBT_LOG_CONNECT(simix_deployment);
-  XBT_LOG_CONNECT(simix_environment);
-  XBT_LOG_CONNECT(simix_host);
-  XBT_LOG_CONNECT(simix_io);
-  XBT_LOG_CONNECT(simix_kernel);
-  XBT_LOG_CONNECT(simix_mailbox);
-  XBT_LOG_CONNECT(simix_network);
-  XBT_LOG_CONNECT(simix_process);
-  XBT_LOG_CONNECT(simix_popping);
-  XBT_LOG_CONNECT(simix_synchro);
-
-  /* smpi */
-  /* SMPI categories are connected in smpi_global.c */
-
-  /* surf */
-  XBT_LOG_CONNECT(surf);
-  XBT_LOG_CONNECT(surf_config);
-  XBT_LOG_CONNECT(surf_cpu);
-  XBT_LOG_CONNECT(surf_cpu_cas);
-  XBT_LOG_CONNECT(surf_cpu_ti);
-  XBT_LOG_CONNECT(surf_energy);
-  XBT_LOG_CONNECT(surf_file);
-  XBT_LOG_CONNECT(surf_kernel);
-  XBT_LOG_CONNECT(surf_lagrange);
-  XBT_LOG_CONNECT(surf_lagrange_dichotomy);
-  XBT_LOG_CONNECT(surf_maxmin);
-  XBT_LOG_CONNECT(surf_network);
-#if SIMGRID_HAVE_NS3
-  XBT_LOG_CONNECT(ns3);
-#endif
-  XBT_LOG_CONNECT(surf_parse);
-  XBT_LOG_CONNECT(surf_plugin_load);
-  XBT_LOG_CONNECT(surf_route);
-  XBT_LOG_CONNECT(surf_routing_generic);
-  XBT_LOG_CONNECT(surf_route_cluster);
-  XBT_LOG_CONNECT(surf_route_cluster_torus);
-  XBT_LOG_CONNECT(surf_route_cluster_dragonfly);
-  XBT_LOG_CONNECT(surf_route_dijkstra);
-  XBT_LOG_CONNECT(surf_route_fat_tree);
-  XBT_LOG_CONNECT(surf_route_floyd);
-  XBT_LOG_CONNECT(surf_route_full);
-  XBT_LOG_CONNECT(surf_route_none);
-  XBT_LOG_CONNECT(surf_route_vivaldi);
-  XBT_LOG_CONNECT(surf_storage);
-  XBT_LOG_CONNECT(surf_trace);
-  XBT_LOG_CONNECT(surf_vm);
-  XBT_LOG_CONNECT(surf_host);
-
-#endif /* simgrid_EXPORTS */
-}
-
 static void xbt_log_help(void);
 static void xbt_log_help_categories(void);
 
@@ -280,11 +111,6 @@ void xbt_log_init(int *argc, char **argv)
   unsigned help_requested = 0;  /* 1: logs; 2: categories */
   int j                   = 1;
 
-  /* uncomment to set the LOG category to debug directly */
-  //    _XBT_LOGV(log).threshold = xbt_log_priority_debug;
-
-  xbt_log_connect_categories();
-
   /* Set logs and init log submodule */
   for (int i = 1; i < *argc; i++) {
     if (!strncmp(argv[i], "--log=", strlen("--log="))) {
@@ -341,7 +167,7 @@ void xbt_log_postexit(void)
   log_cat_exit(&_XBT_LOGV(XBT_LOG_ROOT_CAT));
 }
 
- /* Size of the static string in which we  build the log string */
+/* Size of the static string in which we build the log string */
 #define XBT_LOG_STATIC_BUFFER_SIZE 2048
 /* Minimum size of the dynamic string in which we build the log string
    (should be greater than XBT_LOG_STATIC_BUFFER_SIZE) */
@@ -363,18 +189,16 @@ void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...)
 
       /* First, try with a static buffer */
       int done = 0;
-      if (XBT_LOG_STATIC_BUFFER_SIZE) {
-        char buff[XBT_LOG_STATIC_BUFFER_SIZE];
-        ev->buffer      = buff;
-        ev->buffer_size = sizeof buff;
-        va_start(ev->ap, fmt);
-        done = cat->layout->do_layout(cat->layout, ev, fmt);
-        va_end(ev->ap);
-        if (done)
-          appender->do_append(appender, buff);
-      }
+      char buff[XBT_LOG_STATIC_BUFFER_SIZE];
+      ev->buffer      = buff;
+      ev->buffer_size = sizeof buff;
+      va_start(ev->ap, fmt);
+      done = cat->layout->do_layout(cat->layout, ev, fmt);
+      va_end(ev->ap);
+      if (done) {
+        appender->do_append(appender, buff);
+      } else {
 
-      if (!done) {
         /* The static buffer was too small, use a dynamically expanded one */
         ev->buffer_size = XBT_LOG_DYNAMIC_BUFFER_SIZE;
         ev->buffer      = xbt_malloc(ev->buffer_size);
@@ -398,23 +222,26 @@ void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...)
   }
 }
 
-#undef XBT_LOG_DYNAMIC_BUFFER_SIZE
-#undef XBT_LOG_STATIC_BUFFER_SIZE
-
 /* 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!
+ * To circumvent the problem, we define the macro DISABLE_XBT_LOG_CAT_INIT() to hide the real _xbt_log_cat_init(). The
+ * macro has to be called at the beginning of the affected functions.
  */
+static int fake_xbt_log_cat_init(xbt_log_category_t XBT_ATTRIB_UNUSED category,
+                                 e_xbt_log_priority_t XBT_ATTRIB_UNUSED priority)
+{
+  return 0;
+}
+#define DISABLE_XBT_LOG_CAT_INIT()                                                                                     \
+  int (*_xbt_log_cat_init)(xbt_log_category_t, e_xbt_log_priority_t) XBT_ATTRIB_UNUSED = fake_xbt_log_cat_init;
 
 static void _xbt_log_cat_apply_set(xbt_log_category_t category, xbt_log_setting_t setting)
 {
-#define _xbt_log_cat_init(a, b) (0)
-
+  DISABLE_XBT_LOG_CAT_INIT();
   if (setting->thresh != xbt_log_priority_uninitialized) {
     xbt_log_threshold_set(category, setting->thresh);
 
@@ -441,7 +268,6 @@ static void _xbt_log_cat_apply_set(xbt_log_category_t category, xbt_log_setting_
     category->additivity = 0;
     XBT_DEBUG("Set %p as appender of category '%s'", setting->appender, category->name);
   }
-#undef _xbt_log_cat_init
 }
 
 /*
@@ -450,8 +276,7 @@ static void _xbt_log_cat_apply_set(xbt_log_category_t category, xbt_log_setting_
  */
 int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority)
 {
-#define _xbt_log_cat_init(a, b) (0)
-
+  DISABLE_XBT_LOG_CAT_INIT();
   if (log_cat_init_mutex != NULL)
     xbt_os_mutex_acquire(log_cat_init_mutex);
 
@@ -529,8 +354,6 @@ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority
   if (log_cat_init_mutex != NULL)
     xbt_os_mutex_release(log_cat_init_mutex);
   return priority >= category->threshold;
-
-#undef _xbt_log_cat_init
 }
 
 void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent)
@@ -789,7 +612,7 @@ void xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app)
 
 void xbt_log_layout_set(xbt_log_category_t cat, xbt_log_layout_t lay)
 {
-#define _xbt_log_cat_init(a, b) (0)
+  DISABLE_XBT_LOG_CAT_INIT();
   if (!cat->appender) {
     XBT_VERB ("No appender to category %s. Setting the file appender as default", cat->name);
     xbt_log_appender_set(cat, xbt_log_appender_file_new(NULL));
@@ -802,7 +625,6 @@ void xbt_log_layout_set(xbt_log_category_t cat, xbt_log_layout_t lay)
   }
   cat->layout = lay;
   xbt_log_additivity_set(cat, 0);
-#undef _xbt_log_cat_init
 }
 
 void xbt_log_additivity_set(xbt_log_category_t cat, int additivity)
@@ -847,7 +669,7 @@ static void xbt_log_help(void)
          "in 'l'etter)\n"
          "         -> %%L: line number where the log event was raised (LOG4J compatible)\n"
          "         -> %%M: function name (LOG4J compatible -- called method name here of course).\n"
-         "                 Defined only when using gcc because there is no __FUNCTION__ elsewhere.\n"
+         "                 Defined only when using gcc because there is no __func__ elsewhere.\n"
          "\n"
          "         -> %%b: full backtrace (Called %%throwable in LOG4J). Defined only under windows or when using the "
          "GNU libc because\n"