If set, the log mask is changed to the set value. Possible values are
"asm" (assembly loader), "type", "dll" (native library loader), "gc"
(garbage collector), "cfg" (config file loader), "aot" (precompiler),
-"security" (e.g. Moonlight CoreCLR support) and "all".
+"security" (e.g. Moonlight CoreCLR support), "threadpool" (thread pool generic),
+"io-threadpool" (thread pool I/O), "io-layer" (I/O layer - sockets, handles, shared memory etc)
+and "all".
The default value is "all". Changing the mask value allows you to display only
messages for a certain component. You can use multiple masks by comma
separating them. For example to see config file messages and assembly loader
MONO_TRACE_SECURITY = (1<<6),
MONO_TRACE_THREADPOOL = (1<<7),
MONO_TRACE_IO_THREADPOOL = (1<<8),
+ MONO_TRACE_IO_LAYER = (1<<9),
MONO_TRACE_ALL = MONO_TRACE_ASSEMBLY |
MONO_TRACE_TYPE |
MONO_TRACE_DLLIMPORT |
MONO_TRACE_AOT |
MONO_TRACE_SECURITY |
MONO_TRACE_THREADPOOL |
- MONO_TRACE_IO_THREADPOOL
+ MONO_TRACE_IO_THREADPOOL |
+ MONO_TRACE_IO_LAYER
} MonoTraceMask;
+extern GLogLevelFlags mono_internal_current_level;
+extern MonoTraceMask mono_internal_current_mask;
+
void
-mono_trace_cleanup (void);
+mono_trace_init (void);
void
-mono_trace (GLogLevelFlags level, MonoTraceMask mask, const char *format, ...);
+mono_trace_cleanup (void);
void
-mono_tracev (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args);
+mono_tracev_inner (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args);
void
mono_trace_set_level (GLogLevelFlags level);
gboolean
mono_trace_is_traced (GLogLevelFlags level, MonoTraceMask mask);
+G_GNUC_UNUSED static void
+mono_tracev (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args)
+{
+ if(G_UNLIKELY (level <= mono_internal_current_level && mask & mono_internal_current_mask))
+ mono_tracev_inner (level, mask, format, args);
+}
+
+/**
+ * mono_trace:
+ *
+ * @level: Verbose level of the specified message
+ * @mask: Type of the specified message
+ *
+ * Traces a new message, depending on the current logging level
+ * and trace mask.
+ */
+G_GNUC_UNUSED static void
+mono_trace (GLogLevelFlags level, MonoTraceMask mask, const char *format, ...)
+{
+ if(G_UNLIKELY (level <= mono_internal_current_level && mask & mono_internal_current_mask)) {
+ va_list args;
+ va_start (args, format);
+ mono_tracev_inner (level, mask, format, args);
+ va_end (args);
+ }
+}
+
#ifdef G_HAVE_ISO_VARARGS
#define mono_trace_error(...) mono_trace(G_LOG_LEVEL_ERROR, \
__VA_ARGS__)
MonoTraceMask mask;
} MonoLogLevelEntry;
-static GLogLevelFlags current_level = G_LOG_LEVEL_ERROR;
-static MonoTraceMask current_mask = MONO_TRACE_ALL;
+GLogLevelFlags mono_internal_current_level = INT_MAX;
+MonoTraceMask mono_internal_current_mask = MONO_TRACE_ALL;
-static const char *mono_log_domain = "Mono";
static GQueue *level_stack = NULL;
+static const char *mono_log_domain = "Mono";
static MonoPrintCallback print_callback, printerr_callback;
/**
*
* Initializes the mono tracer.
*/
-static void
+void
mono_trace_init (void)
{
if(level_stack == NULL) {
+ mono_internal_current_level = G_LOG_LEVEL_ERROR;
level_stack = g_queue_new();
mono_trace_set_mask_string(g_getenv("MONO_LOG_MASK"));
}
}
-/**
- * mono_trace:
- *
- * @level: Verbose level of the specified message
- * @mask: Type of the specified message
- *
- * Traces a new message, depending on the current logging level
- * and trace mask.
- */
-void
-mono_trace(GLogLevelFlags level, MonoTraceMask mask, const char *format, ...)
-{
- if(level_stack == NULL)
- mono_trace_init();
-
- if(level <= current_level && mask & current_mask) {
- va_list args;
- va_start (args, format);
- g_logv (mono_log_domain, level, format, args);
- va_end (args);
- }
-}
-
/**
* mono_tracev:
*
* and trace mask.
*/
void
-mono_tracev (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args)
+mono_tracev_inner (GLogLevelFlags level, MonoTraceMask mask, const char *format, va_list args)
{
- if (level_stack == NULL)
+ if (level_stack == NULL) {
mono_trace_init ();
+ if(level > mono_internal_current_level || !(mask & mono_internal_current_mask))
+ return;
+ }
- if(level <= current_level && mask & current_mask)
- g_logv (mono_log_domain, level, format, args);
+ g_logv (mono_log_domain, level, format, args);
}
/**
if(level_stack == NULL)
mono_trace_init();
- current_level = level;
+ mono_internal_current_level = level;
}
/**
if(level_stack == NULL)
mono_trace_init();
- current_mask = mask;
+ mono_internal_current_mask = mask;
}
/**
g_error("%s: cannot use mono_trace_push without calling mono_trace_init first.", __func__);
else {
MonoLogLevelEntry *entry = (MonoLogLevelEntry *) g_malloc(sizeof(MonoLogLevelEntry));
- entry->level = current_level;
- entry->mask = current_mask;
+ entry->level = mono_internal_current_level;
+ entry->mask = mono_internal_current_mask;
g_queue_push_head (level_stack, (gpointer)entry);
/* Set the new level and mask
*/
- current_level = level;
- current_mask = mask;
+ mono_internal_current_level = level;
+ mono_internal_current_mask = mask;
}
}
/* Restore previous level and mask
*/
- current_level = entry->level;
- current_mask = entry->mask;
+ mono_internal_current_level = entry->level;
+ mono_internal_current_mask = entry->mask;
g_free (entry);
}
const char *tok;
guint32 flags = 0;
- const char *valid_flags[] = {"asm", "type", "dll", "gc", "cfg", "aot", "security", "threadpool", "io-threadpool", "all", NULL};
+ const char *valid_flags[] = {"asm", "type", "dll", "gc", "cfg", "aot", "security", "threadpool", "io-threadpool", "io-layer", "all", NULL};
const MonoTraceMask valid_masks[] = {MONO_TRACE_ASSEMBLY, MONO_TRACE_TYPE, MONO_TRACE_DLLIMPORT,
MONO_TRACE_GC, MONO_TRACE_CONFIG, MONO_TRACE_AOT, MONO_TRACE_SECURITY,
- MONO_TRACE_THREADPOOL, MONO_TRACE_IO_THREADPOOL, MONO_TRACE_ALL };
+ MONO_TRACE_THREADPOOL, MONO_TRACE_IO_THREADPOOL, MONO_TRACE_IO_LAYER, MONO_TRACE_ALL };
if(!value)
return;
gboolean
mono_trace_is_traced (GLogLevelFlags level, MonoTraceMask mask)
{
- return (level <= current_level && mask & current_mask);
+ return (level <= mono_internal_current_level && mask & mono_internal_current_mask);
}
static MonoLogCallback log_callback;