X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a76358453a876eb6ed6965bb63735a855df9f737..769797e55b42efb93e64c27d32d3e7ad6da0cd0e:/src/xbt/log.c diff --git a/src/xbt/log.c b/src/xbt/log.c index 6e02d5354b..bb60ee3f1a 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -20,7 +20,7 @@ #include "xbt/misc.h" #include "xbt/ex.h" #include "xbt/sysdep.h" -#include "xbt/log.h" +#include #include "xbt/dynar.h" /** \addtogroup XBT_log @@ -346,6 +346,7 @@ typedef struct { } s_xbt_log_setting_t,*xbt_log_setting_t; 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) { @@ -365,7 +366,7 @@ const char *xbt_log_priority_names[8] = { "CRITICAL" }; -s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT) = { +s_xbt_log_category_t XBT_PUBLIC_DATA _XBT_LOGV(XBT_LOG_ROOT_CAT) = { 0, 0, 0, "root", xbt_log_priority_uninitialized, 0, NULL, 0 @@ -374,31 +375,36 @@ 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(simix,"All SIMIX categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(log,xbt,"Loggings from the logging mechanism itself"); void xbt_log_init(int *argc,char **argv) { - int i,j; - char *opt; - - /* Set logs and init log submodule */ - for (i=1; i<*argc; i++) { - if (!strncmp(argv[i],"--gras-log=",strlen("--gras-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="))) { - opt=strchr(argv[i],'='); - opt++; - xbt_log_control_set(opt); - DEBUG1("Did apply '%s' as log setting",opt); - /*remove this from argv*/ - for (j=i+1; j<*argc; j++) { - argv[j-1] = argv[j]; - } - argv[j-1] = NULL; - (*argc)--; - i--; /* compensate effect of next loop incrementation */ - } - } + int i,j; + char *opt; + + /* Set logs and init log submodule */ + for (i=1; i<*argc; i++){ + if (!strncmp(argv[i],"--gras-log=",strlen("--gras-log=")) || + !strncmp(argv[i],"--surf-log=",strlen("--surf-log=")) || + !strncmp(argv[i],"--msg-log=",strlen("--msg-log=")) || + !strncmp(argv[i],"--simix-log=",strlen("--simix-log=")) || + !strncmp(argv[i],"--xbt-log=",strlen("--xbt-log="))){ + + opt=strchr(argv[i],'='); + opt++; + xbt_log_control_set(opt); + DEBUG1("Did apply '%s' as log setting",opt); + /*remove this from argv*/ + + for (j=i+1; j<*argc; j++){ + argv[j-1] = argv[j]; + } + + argv[j-1] = NULL; + (*argc)--; + i--; /* compensate effect of next loop incrementation */ + } + } } void xbt_log_exit(void) { @@ -407,130 +413,145 @@ void xbt_log_exit(void) { VERB0("Exited log"); } -static void _apply_control(xbt_log_category_t cat) { +void _xbt_log_event_log( xbt_log_event_t ev, const char *fmt, ...) { + + xbt_log_category_t cat = ev->cat; + + va_start(ev->ap, fmt); + while(1) { + xbt_log_appender_t appender = cat->appender; + if (appender != NULL) { + + appender->do_append(appender, ev, fmt); + } + if (!cat->willLogToParent) + break; + + cat = cat->parent; + } + va_end(ev->ap); +} + +/* + * This gets called the first time a category is referenced and performs the + * initialization. + * Also resets threshold to inherited! + */ +int _xbt_log_cat_init(e_xbt_log_priority_t priority,xbt_log_category_t category) { int cursor; xbt_log_setting_t setting=NULL; int found = 0; s_xbt_log_event_t _log_ev; + + if(category == &_XBT_LOGV(XBT_LOG_ROOT_CAT)){ + category->threshold = xbt_log_priority_info;/* xbt_log_priority_debug*/; + category->appender = xbt_log_default_appender; + } else { - if (!xbt_log_settings) - return; - - xbt_assert0(cat,"NULL category"); - xbt_assert(cat->name); +#if (defined(_WIN32) && !defined(DLL_STATIC)) + if(!category->parent){ + category->parent = &_XBT_LOGV(XBT_LOG_ROOT_CAT); + } +#endif + + xbt_log_parent_set(category, category->parent); + } + /* Apply the control */ + if (!xbt_log_settings) + return priority >= category->threshold; + + xbt_assert0(category,"NULL category"); + xbt_assert(category->name); + xbt_dynar_foreach(xbt_log_settings,cursor,setting) { xbt_assert0(setting,"Damnit, NULL cat in the list"); xbt_assert1(setting->catname,"NULL setting(=%p)->catname",(void*)setting); - - if (!strcmp(setting->catname,cat->name)) { + + if (!strcmp(setting->catname,category->name)) { + found = 1; - - xbt_log_threshold_set(cat, setting->thresh); + + xbt_log_threshold_set(category, setting->thresh); xbt_dynar_cursor_rm(xbt_log_settings,&cursor); - if (cat->threshold <= xbt_log_priority_debug) { - _log_ev.cat = cat; + 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)", - cat->name, - xbt_log_priority_names[cat->threshold], cat->threshold); + "Apply settings for category '%s': set threshold to %s (=%d)", + category->name, + xbt_log_priority_names[category->threshold], category->threshold); } } } - if (!found && cat->threshold <= xbt_log_priority_verbose) { - _log_ev.cat = cat; + + if (!found && category->threshold <= xbt_log_priority_verbose) { + + _log_ev.cat = category; _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)", - cat->name, - xbt_log_priority_names[cat->threshold], cat->threshold); + "Category '%s': inherited threshold = %s (=%d)", + category->name, + xbt_log_priority_names[category->threshold], category->threshold); } - -} - -void _xbt_log_event_log( xbt_log_event_t ev, const char *fmt, ...) { - xbt_log_category_t cat = ev->cat; - va_start(ev->ap, fmt); - while(1) { - xbt_log_appender_t appender = cat->appender; - if (appender != NULL) { - appender->do_append(appender, ev, fmt); - } - if (!cat->willLogToParent) - break; - - cat = cat->parent; - } - va_end(ev->ap); -} - -static void _cat_init(xbt_log_category_t category) { - if (category == &_XBT_LOGV(XBT_LOG_ROOT_CAT)) { - category->threshold = xbt_log_priority_info; - category->appender = xbt_log_default_appender; - } else { - xbt_log_parent_set(category, category->parent); - } - _apply_control(category); -} - -/* - * This gets called the first time a category is referenced and performs the - * initialization. - * Also resets threshold to inherited! - */ -int _xbt_log_cat_init(e_xbt_log_priority_t priority, - xbt_log_category_t category) { - _cat_init(category); - return priority >= category->threshold; } -void xbt_log_parent_set(xbt_log_category_t cat, - xbt_log_category_t parent) { - - xbt_assert0(cat,"NULL category to be given a parent"); - xbt_assert1(parent,"The parent category of %s is NULL",cat->name); - - /* unlink from current parent */ - if (cat->threshold != xbt_log_priority_uninitialized) { - xbt_log_category_t* cpp = &parent->firstChild; - while(*cpp != cat && *cpp != NULL) { - cpp = &(*cpp)->nextSibling; - } - xbt_assert(*cpp == cat); - *cpp = cat->nextSibling; - } - - /* Set new parent */ - cat->parent = parent; - cat->nextSibling = parent->firstChild; - parent->firstChild = cat; +void xbt_log_parent_set(xbt_log_category_t cat,xbt_log_category_t parent) +{ + + xbt_assert0(cat,"NULL category to be given a parent"); + xbt_assert1(parent,"The parent category of %s is NULL",cat->name); + + /* + * if the threshold is initialized + * unlink from current parent + */ + if(cat->threshold != xbt_log_priority_uninitialized){ - /* Make sure parent is initialized */ - if (parent->threshold == xbt_log_priority_uninitialized) { - _cat_init(parent); - } - - /* Reset priority */ - cat->threshold = parent->threshold; - cat->isThreshInherited = 1; -} /* log_setParent */ + xbt_log_category_t* cpp = &parent->firstChild; + + while(*cpp != cat && *cpp != NULL) { + cpp = &(*cpp)->nextSibling; + } + + xbt_assert(*cpp == cat); + *cpp = cat->nextSibling; + } + + cat->parent = parent; + cat->nextSibling = parent->firstChild; + + parent->firstChild = cat; + + if (parent->threshold == xbt_log_priority_uninitialized){ + + _xbt_log_cat_init(xbt_log_priority_uninitialized/* ignored*/, + parent); + } + + cat->threshold = parent->threshold; + + cat->isThreshInherited = 1; + +} static void _set_inherited_thresholds(xbt_log_category_t cat) { + + xbt_log_category_t child = cat->firstChild; + for( ; child != NULL; child = child->nextSibling) { if (child->isThreshInherited) { if (cat != &_XBT_LOGV(log)) @@ -540,19 +561,25 @@ static void _set_inherited_thresholds(xbt_log_category_t cat) { _set_inherited_thresholds(child); } } + + } void xbt_log_threshold_set(xbt_log_category_t cat, e_xbt_log_priority_t threshold) { cat->threshold = threshold; cat->isThreshInherited = 0; + _set_inherited_thresholds(cat); + } static void _xbt_log_parse_setting(const char* control_string, xbt_log_setting_t set) { const char *name, *dot, *eq; + + set->catname=NULL; if (!*control_string) return; @@ -603,50 +630,21 @@ static void _xbt_log_parse_setting(const char* control_string, strncpy(set->catname,name,dot-name); set->catname[dot-name]='\0'; /* Just in case */ DEBUG1("This is for cat '%s'", set->catname); + } static xbt_log_category_t _xbt_log_cat_searchsub(xbt_log_category_t cat,char *name) { xbt_log_category_t child; + if (!strcmp(cat->name,name)) { return cat; } for(child=cat->firstChild ; child != NULL; child = child->nextSibling) { return _xbt_log_cat_searchsub(child,name); } - THROW0(not_found_error,0,"No such category"); -} - -static void _cleanup_double_spaces(char *s) { - char *p = s; - int e = 0; - - while (1) { - if (!*p) - goto end; - - if (!isspace(*p)) - break; - - p++; - } - - e = 1; - do { - if (e) - *s++ = *p; - - if (!*++p) - goto end; - - if (e ^ !isspace(*p)) - if ((e = !e)) - *s++ = ' '; - } while (1); - - end: - *s = '\0'; + THROW0(not_found_error,0,"No such category"); } /** @@ -675,6 +673,8 @@ void xbt_log_control_set(const char* control_string) { char *p; int done = 0; + + DEBUG1("Parse log settings '%s'",control_string); if (control_string == NULL) return; @@ -685,7 +685,7 @@ void xbt_log_control_set(const char* control_string) { set = xbt_new(s_xbt_log_setting_t,1); cs=xbt_strdup(control_string); - _cleanup_double_spaces(cs); + xbt_str_strip_spaces(cs); while (!done) { xbt_log_category_t cat=NULL; @@ -726,9 +726,13 @@ void xbt_log_control_set(const char* control_string) { } free(set); free(cs); + + } void xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app) { + cat->appender = app; + }