/* 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;
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);
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="))) {
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) */
xbt_assert(ev->priority < sizeof(xbt_log_priority_names), "Priority %d is greater than the biggest allowed value",
ev->priority);
- do {
+ while (1) {
xbt_log_appender_t appender = cat->appender;
- if (!appender)
- continue; /* No appender, try next */
-
- xbt_assert(cat->layout, "No valid layout for the appender of category %s", cat->name);
+ if (appender != NULL) {
+ xbt_assert(cat->layout, "No valid layout for the appender of category %s", cat->name);
- /* First, try with a static buffer */
- if (XBT_LOG_STATIC_BUFFER_SIZE) {
+ /* First, try with a static buffer */
+ int done = 0;
char buff[XBT_LOG_STATIC_BUFFER_SIZE];
- ev->buffer = buff;
+ ev->buffer = buff;
ev->buffer_size = sizeof buff;
va_start(ev->ap, fmt);
- int done = cat->layout->do_layout(cat->layout, ev, fmt);
+ done = cat->layout->do_layout(cat->layout, ev, fmt);
va_end(ev->ap);
if (done) {
appender->do_append(appender, buff);
- continue; /* Ok, that worked: go next */
+ } else {
+
+ /* 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);
+ while (1) {
+ va_start(ev->ap, fmt);
+ done = cat->layout->do_layout(cat->layout, ev, fmt);
+ va_end(ev->ap);
+ if (done)
+ break; /* Got it */
+ ev->buffer_size *= 2;
+ ev->buffer = xbt_realloc(ev->buffer, ev->buffer_size);
+ }
+ appender->do_append(appender, ev->buffer);
+ xbt_free(ev->buffer);
}
}
- /* 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);
- while (1) {
- va_start(ev->ap, fmt);
- int done = cat->layout->do_layout(cat->layout, ev, fmt);
- va_end(ev->ap);
- if (done)
- break; /* Got it */
- ev->buffer_size *= 2;
- ev->buffer = xbt_realloc(ev->buffer, ev->buffer_size);
- }
- appender->do_append(appender, ev->buffer);
- xbt_free(ev->buffer);
-
- } while (cat->additivity && (cat = cat->parent, 1));
+ if (!cat->additivity)
+ break;
+ cat = cat->parent;
+ }
}
-#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);
category->additivity = 0;
XBT_DEBUG("Set %p as appender of category '%s'", setting->appender, category->name);
}
-#undef _xbt_log_cat_init
}
/*
*/
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);
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)
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));
}
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)
" -> warning: minor issue encountered\n"
" -> error: issue encountered\n"
" -> critical: major issue encountered\n"
+ " The default priority level is 'info'.\n"
"\n"
- " Format configuration: --log=CATEGORY_NAME.fmt:OPTIONS\n"
- " OPTIONS may be:\n"
+ " Format configuration: --log=CATEGORY_NAME.fmt:FORMAT\n"
+ " FORMAT string may contain:\n"
" -> %%%%: the %% char\n"
" -> %%n: platform-dependent line separator (LOG4J compatible)\n"
" -> %%e: plain old space (SimGrid extension)\n"
"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"