-/* $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. */
/* 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 */
+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_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;
+ xbt_log_priority_uninitialized = -1 /* used internally (don't poke with) */
+} e_xbt_log_priority_t;
/*
# 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
* 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) \
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
+#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 */
#endif
- struct xbt_log_category_s {
- xbt_log_category_t parent;
- xbt_log_category_t firstChild;
- xbt_log_category_t nextSibling;
- const char *name;
- int threshold;
- int isThreshInherited;
- xbt_log_appender_t appender;
- xbt_log_layout_t layout;
- int additivity;
- };
-
- struct xbt_log_event_s {
- xbt_log_category_t cat;
- e_xbt_log_priority_t priority;
- 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;
+struct xbt_log_category_s {
+ xbt_log_category_t parent;
+ xbt_log_category_t firstChild;
+ xbt_log_category_t nextSibling;
+ const char *name;
+ int threshold;
+ int isThreshInherited;
+ xbt_log_appender_t appender;
+ xbt_log_layout_t layout;
+ int additivity;
+};
+
+struct xbt_log_event_s {
+ xbt_log_category_t cat;
+ e_xbt_log_priority_t priority;
+ 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 _XBT_WIN32
+ char *buffer;
#else
- char buffer[XBT_LOG_BUFF_SIZE];
+ char buffer[XBT_LOG_BUFF_SIZE];
#endif
- };
+};
/**
* \ingroup XBT_log_implem
XBT_PUBLIC_DATA(s_xbt_log_category_t) _XBT_LOGV(XBT_LOG_ROOT_CAT);
- extern xbt_log_appender_t xbt_log_default_appender;
- extern xbt_log_layout_t xbt_log_default_layout;
+extern xbt_log_appender_t xbt_log_default_appender;
+extern xbt_log_layout_t xbt_log_default_layout;
/* ********************** */
/* Public functions again */
* 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
* @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_ */