-/* $Id$ */
-
/* log - a generic logging facility in the spirit of log4j */
-/* Copyright (c) 2003, 2004 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. */
*
*
*/
-
+
/** \defgroup XBT_log_cats Existing log categories
* \ingroup XBT_log
* \brief (automatically extracted)
/* XBT_LOG_MAYDAY: define this to replace the logging facilities with basic
printf function. Useful to debug the logging facilities themselves */
#undef XBT_LOG_MAYDAY
-/*#define XBT_LOG_MAYDAY*/
+//#define XBT_LOG_MAYDAY
#ifndef _XBT_LOG_H_
#define _XBT_LOG_H_
#include "xbt/misc.h"
-
#include <stdarg.h>
SG_BEGIN_DECL()
/**\brief Log priorities
* The different existing priorities.
*/
typedef enum {
- xbt_log_priority_none = 0, /* used internally (don't poke with) */
- xbt_log_priority_trace = 1, /**< enter and return of some functions */
- xbt_log_priority_debug = 2, /**< crufty output */
- xbt_log_priority_verbose = 3, /**< verbose output for the user wanting more */
- xbt_log_priority_info = 4, /**< output about the regular functionning */
- xbt_log_priority_warning = 5, /**< minor issue encountered */
- xbt_log_priority_error = 6, /**< issue encountered */
- xbt_log_priority_critical = 7, /**< major issue encountered */
-
- xbt_log_priority_infinite = 8, /**< value for XBT_LOG_STATIC_THRESHOLD to not log */
-
- xbt_log_priority_uninitialized = -1 /* used internally (don't poke with) */
+ xbt_log_priority_none = 0, /* used internally (don't poke with) */
+ xbt_log_priority_trace = 1, /**< enter and return of some functions */
+ xbt_log_priority_debug = 2, /**< crufty output */
+ xbt_log_priority_verbose = 3, /**< verbose output for the user wanting more */
+ xbt_log_priority_info = 4, /**< output about the regular functionning */
+ xbt_log_priority_warning = 5, /**< minor issue encountered */
+ xbt_log_priority_error = 6, /**< issue encountered */
+ xbt_log_priority_critical = 7, /**< major issue encountered */
+
+ xbt_log_priority_infinite = 8, /**< value for XBT_LOG_STATIC_THRESHOLD to not log */
+
+ xbt_log_priority_uninitialized = -1 /* used internally (don't poke with) */
} e_xbt_log_priority_t;
-
+
/*
* define NLOG to disable at compilation time any logging request
# ifdef NDEBUG
# define XBT_LOG_STATIC_THRESHOLD xbt_log_priority_verbose
-# else /* !NLOG && !NDEBUG */
+# else /* !NLOG && !NDEBUG */
# ifndef XBT_LOG_STATIC_THRESHOLD
# define XBT_LOG_STATIC_THRESHOLD xbt_log_priority_none
-# endif /* !XBT_LOG_STATIC_THRESHOLD */
-# endif /* NDEBUG */
-#endif /* !defined(NLOG) */
+# endif /* !XBT_LOG_STATIC_THRESHOLD */
+# endif /* NDEBUG */
+#endif /* !defined(NLOG) */
/* Transforms a category name to a global variable name. */
#define _XBT_LOGV(cat) _XBT_LOG_CONCAT(_simgrid_log_category__, cat)
/* The root of the category hierarchy. */
#define XBT_LOG_ROOT_CAT root
-/* In stric ansi C, we are not allowed to initialize a variable with
- * a non-constant value. But the whole tree of categories is
- * connected by setting the address of the parent category as a field
- * of the child one.
+/* The whole tree of categories is connected by setting the address of
+ * the parent category as a field of the child one.
+ *
+ * In strict ansi C, we are allowed to initialize a variable with "a
+ * pointer to an lvalue designating an object of static storage
+ * duration" [ISO/IEC 9899:1999, Section 6.6].
*
* Unfortunately, Visual C builder does not target any standard
* compliance, and C99 is not an exception to this unfortunate rule.
* you don't want to see your child category become a child of root
* directly.
*/
-#if defined(__STRICT_ANSI__) || defined(_MSC_VER)
+#if defined(_MSC_VER)
# define _XBT_LOG_PARENT_INITIALIZER(parent) NULL
# define XBT_LOG_CONNECT(parent_cat,child) _XBT_LOGV(child).parent = &_XBT_LOGV(parent_cat)
-#else
+#else
# define _XBT_LOG_PARENT_INITIALIZER(parent) &_XBT_LOGV(parent)
-# define XBT_LOG_CONNECT(parent_cat,child) /* xbt_assert(_XBT_LOGV(child).parent == &_XBT_LOGV(parent_cat))*/
+# define XBT_LOG_CONNECT(parent_cat,child) /* xbt_assert(_XBT_LOGV(child).parent == &_XBT_LOGV(parent_cat)) */
#endif
/* XBT_LOG_NEW_SUBCATEGORY_helper:
* Creates a new subcategory of the root category.
*/
# define XBT_LOG_NEW_CATEGORY(catName,desc) \
- XBT_LOG_NEW_SUBCATEGORY_helper(catName, XBT_LOG_ROOT_CAT, desc)
+ XBT_LOG_NEW_SUBCATEGORY_helper(catName, XBT_LOG_ROOT_CAT, desc)
/**
* Indicates which category is the default one.
*/
-#if defined(XBT_LOG_MAYDAY) /*|| defined (NLOG) * turning logging off */
+#if defined(XBT_LOG_MAYDAY) || defined(SUPERNOVAE_MODE) /*|| defined (NLOG) * turning logging off */
# define XBT_LOG_DEFAULT_CATEGORY(cname)
#else
# define XBT_LOG_DEFAULT_CATEGORY(cname) \
- static xbt_log_category_t _XBT_LOGV(default) _XBT_GNUC_UNUSED = &_XBT_LOGV(cname)
+ static xbt_log_category_t _XBT_LOGV(default) _XBT_GNUC_UNUSED = &_XBT_LOGV(cname)
#endif
/**
/* Functions you may call */
-XBT_PUBLIC(void) xbt_log_control_set(const char* cs);
+XBT_PUBLIC(void) xbt_log_control_set(const char *cs);
/* Forward declarations */
-typedef struct xbt_log_appender_s s_xbt_log_appender_t,*xbt_log_appender_t;
-typedef struct xbt_log_layout_s s_xbt_log_layout_t, *xbt_log_layout_t;
-typedef struct xbt_log_event_s s_xbt_log_event_t, *xbt_log_event_t;
-typedef struct xbt_log_category_s s_xbt_log_category_t,*xbt_log_category_t;
+typedef struct xbt_log_appender_s s_xbt_log_appender_t,
+ *xbt_log_appender_t;
+typedef struct xbt_log_layout_s s_xbt_log_layout_t, *xbt_log_layout_t;
+typedef struct xbt_log_event_s s_xbt_log_event_t, *xbt_log_event_t;
+typedef struct xbt_log_category_s s_xbt_log_category_t,
+ *xbt_log_category_t;
/*
* Do NOT access any members of this structure directly. FIXME: move to private?
*/
-#ifdef WIN32
-#define XBT_LOG_BUFF_SIZE 16384/* Size of the static string in which we build the log string */
+#ifdef _XBT_WIN32
+#define XBT_LOG_BUFF_SIZE 16384 /* Size of the static string in which we build the log string */
#else
-#define XBT_LOG_BUFF_SIZE 2048 /* Size of the static string in which we build the log string */
+#define XBT_LOG_BUFF_SIZE 2048 /* Size of the static string in which we build the log string */
#endif
struct xbt_log_category_s {
xbt_log_category_t parent;
- xbt_log_category_t firstChild;
+ xbt_log_category_t firstChild;
xbt_log_category_t nextSibling;
const char *name;
int threshold;
struct xbt_log_event_s {
xbt_log_category_t cat;
e_xbt_log_priority_t priority;
- const char* fileName;
- const char* functionName;
- int lineNum;
+ const char *fileName;
+ const char *functionName;
+ int lineNum;
va_list ap;
- va_list ap_copy; /* need a copy to launch dynamic layouts when the static ones overflowed */
- #ifdef WIN32
- char* buffer;
- #else
+ va_list ap_copy; /* need a copy to launch dynamic layouts when the static ones overflowed */
+#ifdef _XBT_WIN32
+ char *buffer;
+#else
char buffer[XBT_LOG_BUFF_SIZE];
- #endif
+#endif
};
/**
* Programatically alters a category's threshold priority (don't use).
*/
XBT_PUBLIC(void) xbt_log_threshold_set(xbt_log_category_t cat,
- e_xbt_log_priority_t thresholdPriority);
+ e_xbt_log_priority_t
+ thresholdPriority);
/**
* \ingroup XBT_log_implem
*
*/
XBT_PUBLIC(void) xbt_log_appender_set(xbt_log_category_t cat,
- xbt_log_appender_t app);
+ xbt_log_appender_t app);
/**
* \ingroup XBT_log_implem
* \param cat the category (not only its name, but the variable)
* (the prefered interface is throught xbt_log_control_set())
*
*/
-XBT_PUBLIC(void) xbt_log_layout_set(xbt_log_category_t cat,
- xbt_log_layout_t lay);
+XBT_PUBLIC(void) xbt_log_layout_set(xbt_log_category_t cat,
+ xbt_log_layout_t lay);
/**
* \ingroup XBT_log_implem
*
*/
XBT_PUBLIC(void) xbt_log_additivity_set(xbt_log_category_t cat,
- int additivity);
+ int additivity);
/** @brief create a new simple layout
*
* This layout is not as flexible as the pattern one
*/
-XBT_PUBLIC(xbt_log_layout_t) xbt_log_layout_simple_new(char*arg);
-XBT_PUBLIC(xbt_log_layout_t) xbt_log_layout_format_new(char*arg);
-XBT_PUBLIC(xbt_log_appender_t) xbt_log_appender_file_new(char*arg);
+XBT_PUBLIC(xbt_log_layout_t) xbt_log_layout_simple_new(char *arg);
+XBT_PUBLIC(xbt_log_layout_t) xbt_log_layout_format_new(char *arg);
+XBT_PUBLIC(xbt_log_appender_t) xbt_log_appender_file_new(char *arg);
/* ********************************** */
/* Functions that you shouldn't call */
/* ********************************** */
XBT_PUBLIC(void) _xbt_log_event_log(xbt_log_event_t ev,
- const char *fmt,
- ...) _XBT_GNUC_PRINTF(2,3);
+ const char *fmt,
+ ...) _XBT_GNUC_PRINTF(2, 3);
-XBT_PUBLIC(int) _xbt_log_cat_init(xbt_log_category_t category,
- e_xbt_log_priority_t priority);
+XBT_PUBLIC(int) _xbt_log_cat_init(xbt_log_category_t category,
+ e_xbt_log_priority_t priority);
XBT_PUBLIC_DATA(s_xbt_log_category_t) _XBT_LOGV(XBT_LOG_ROOT_CAT);
* code.
* Setting the LogEvent's valist member is done inside _log_logEvent.
*/
-#ifdef WIN32
-#define _XBT_LOG_PRE(catv, priority) do { \
- if (_XBT_LOG_ISENABLEDV(catv, priority)) { \
- s_xbt_log_event_t _log_ev = \
- {NULL,priority,__FILE__,_XBT_FUNCTION,__LINE__}; \
- _log_ev.cat = &(catv); \
- _log_ev.buffer = (char*) calloc(XBT_LOG_BUFF_SIZE + 1, sizeof(char)); \
- _xbt_log_event_log(&_log_ev
+#ifdef _XBT_WIN32
+#include <stdlib.h> /* calloc */
+#define _XBT_LOG_PRE(catv, prio) do { \
+ if (_XBT_LOG_ISENABLEDV(catv, prio)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(catv); \
+ _log_ev.priority = (prio); \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ _log_ev.buffer = (char*) calloc(XBT_LOG_BUFF_SIZE + 1, sizeof(char)); \
+ _xbt_log_event_log(&_log_ev
#else
-#define _XBT_LOG_PRE(catv, priority) do { \
- if (_XBT_LOG_ISENABLEDV(catv, priority)) { \
- s_xbt_log_event_t _log_ev = \
- {NULL,priority,__FILE__,_XBT_FUNCTION,__LINE__}; \
- _log_ev.cat = &(catv); \
- _xbt_log_event_log(&_log_ev \
-
+#include <string.h> /* memset */
+#define _XBT_LOG_PRE(catv, prio) do { \
+ if (_XBT_LOG_ISENABLEDV(catv, prio)) { \
+ s_xbt_log_event_t _log_ev; \
+ _log_ev.cat = &(catv); \
+ _log_ev.priority = (prio); \
+ _log_ev.fileName = __FILE__; \
+ _log_ev.functionName = _XBT_FUNCTION; \
+ _log_ev.lineNum = __LINE__; \
+ memset(_log_ev.buffer, 0, XBT_LOG_BUFF_SIZE); \
+ _xbt_log_event_log(&_log_ev
+
#endif
#define _XBT_LOG_POST \
#ifdef XBT_LOG_MAYDAY
# define CLOG0(c, p, f) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__)
-# define CLOG1(c, p, f,a1) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1)
-# define CLOG2(c, p, f,a1,a2) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2)
-# define CLOG3(c, p, f,a1,a2,a3) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3)
-# define CLOG4(c, p, f,a1,a2,a3,a4) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4)
-# define CLOG5(c, p, f,a1,a2,a3,a4,a5) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5)
+# define CLOG1(c, p, f,a1) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1)
+# define CLOG2(c, p, f,a1,a2) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2)
+# define CLOG3(c, p, f,a1,a2,a3) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3)
+# define CLOG4(c, p, f,a1,a2,a3,a4) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4)
+# define CLOG5(c, p, f,a1,a2,a3,a4,a5) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5)
# define CLOG6(c, p, f,a1,a2,a3,a4,a5,a6) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5,a6)
# define CLOG7(c, p, f,a1,a2,a3,a4,a5,a6,a7) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5,a6,a7)
# define CLOG8(c, p, f,a1,a2,a3,a4,a5,a6,a7,a8) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5,a6,a7,a8)
# define CLOG9(c, p, f,a1,a2,a3,a4,a5,a6,a7,a8,a9) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5,a6,a7,a8,a9)
# define CLOG10(c, p, f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
#else
-# define CLOG0(c, p, f) _XBT_LOG_PRE(_XBT_LOGV(c),p) ,f _XBT_LOG_POST
-# define CLOG1(c, p, f,a1) _XBT_LOG_PRE(_XBT_LOGV(c),p) ,f,a1 _XBT_LOG_POST
+# define CLOG0(c, p, f) _XBT_LOG_PRE(_XBT_LOGV(c),p) ,f _XBT_LOG_POST
+# define CLOG1(c, p, f,a1) _XBT_LOG_PRE(_XBT_LOGV(c),p) ,f,a1 _XBT_LOG_POST
# define CLOG2(c, p, f,a1,a2) _XBT_LOG_PRE(_XBT_LOGV(c),p) ,f,a1,a2 _XBT_LOG_POST
# define CLOG3(c, p, f,a1,a2,a3) _XBT_LOG_PRE(_XBT_LOGV(c),p) ,f,a1,a2,a3 _XBT_LOG_POST
# define CLOG4(c, p, f,a1,a2,a3,a4) _XBT_LOG_PRE(_XBT_LOGV(c),p) ,f,a1,a2,a3,a4 _XBT_LOG_POST
#ifdef XBT_LOG_MAYDAY
# define LOG0(p, f) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__)
-# define LOG1(p, f,a1) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1)
-# define LOG2(p, f,a1,a2) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2)
-# define LOG3(p, f,a1,a2,a3) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3)
-# define LOG4(p, f,a1,a2,a3,a4) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4)
-# define LOG5(p, f,a1,a2,a3,a4,a5) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5)
+# define LOG1(p, f,a1) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1)
+# define LOG2(p, f,a1,a2) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2)
+# define LOG3(p, f,a1,a2,a3) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3)
+# define LOG4(p, f,a1,a2,a3,a4) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4)
+# define LOG5(p, f,a1,a2,a3,a4,a5) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5)
# define LOG6(p, f,a1,a2,a3,a4,a5,a6) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5,a6)
# define LOG7(p, f,a1,a2,a3,a4,a5,a6,a7) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5,a6,a7)
# define LOG8(p, f,a1,a2,a3,a4,a5,a6,a7,a8) fprintf(stderr,"%s:%d:" f "\n",__FILE__,__LINE__,a1,a2,a3,a4,a5,a6,a7,a8)
* @brief Log at TRACE priority that we entered in current function, appending a user specified format taking 5 args (XBT_INn exists for all n in [1,6])
*/
#define XBT_IN5(fmt,a,b,c,d,e) LOG6(xbt_log_priority_trace, ">> begin of %s" fmt, _XBT_FUNCTION, a,b,c,d,e)
+#define XBT_IN6(fmt,a,b,c,d,e,f) LOG7(xbt_log_priority_trace, ">> begin of %s" fmt, _XBT_FUNCTION, a,b,c,d,e,f)
/** @ingroup XBT_log
* @hideinitializer
* @brief Log at TRACE priority that we exited the current function.
SG_END_DECL()
-
-#endif /* ! _XBT_LOG_H_ */
+#endif /* ! _XBT_LOG_H_ */