X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmempool.c;h=7a871f034bfd58b28de0092507c84d2cc6c41b37;hb=c866c3eefb79ea86be468e4f95c7012fa3d2db4f;hp=abbdbdbace3b167545217577638bccda303b010a;hpb=12b712c8917ac1411c3f85436845ec53d8c33a18;p=mono.git diff --git a/mono/metadata/mempool.c b/mono/metadata/mempool.c index abbdbdbace3..7a871f034bf 100644 --- a/mono/metadata/mempool.c +++ b/mono/metadata/mempool.c @@ -10,6 +10,7 @@ * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com) * Copyright 2004-2009 Novell, Inc (http://www.novell.com) * Copyright 2011 Xamarin Inc. (http://www.xamarin.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include @@ -171,7 +172,7 @@ mono_mempool_stats (MonoMemPool *pool) { MonoMemPool *p; int count = 0; - guint32 still_free = pool->end - pool->pos; + guint32 still_free; p = pool; while (p) { @@ -179,6 +180,7 @@ mono_mempool_stats (MonoMemPool *pool) count++; } if (pool) { + still_free = pool->end - pool->pos; g_print ("Mempool %p stats:\n", pool); g_print ("Total mem allocated: %d\n", pool->d.allocated); g_print ("Num chunks: %d\n", count); @@ -196,25 +198,27 @@ static mono_mutex_t mempool_tracing_lock; static void mono_backtrace (int size) { - void *array[BACKTRACE_DEPTH]; - char **names; - int i, symbols; - static gboolean inited; - - if (!inited) { - mono_os_mutex_init_recursive (&mempool_tracing_lock); - inited = TRUE; - } - - mono_os_mutex_lock (&mempool_tracing_lock); - g_print ("Allocating %d bytes\n", size); - symbols = backtrace (array, BACKTRACE_DEPTH); - names = backtrace_symbols (array, symbols); - for (i = 1; i < symbols; ++i) { - g_print ("\t%s\n", names [i]); - } - free (names); - mono_os_mutex_unlock (&mempool_tracing_lock); + void *array[BACKTRACE_DEPTH]; + char **names; + int i, symbols; + static gboolean inited; + + if (!inited) { + mono_os_mutex_init_recursive (&mempool_tracing_lock); + inited = TRUE; + } + + mono_os_mutex_lock (&mempool_tracing_lock); + g_print ("Allocating %d bytes\n", size); + MONO_ENTER_GC_SAFE; + symbols = backtrace (array, BACKTRACE_DEPTH); + names = backtrace_symbols (array, symbols); + MONO_EXIT_GC_SAFE; + for (i = 1; i < symbols; ++i) { + g_print ("\t%s\n", names [i]); + } + g_free (names); + mono_os_mutex_unlock (&mempool_tracing_lock); } #endif @@ -379,6 +383,35 @@ mono_mempool_strdup (MonoMemPool *pool, return res; } +char* +mono_mempool_strdup_vprintf (MonoMemPool *pool, const char *format, va_list args) +{ + size_t buflen; + char *buf; + va_list args2; + va_copy (args2, args); + int len = vsnprintf (NULL, 0, format, args2); + va_end (args2); + + if (len >= 0 && (buf = (char*)mono_mempool_alloc (pool, (buflen = (size_t) (len + 1)))) != NULL) { + vsnprintf (buf, buflen, format, args); + } else { + buf = NULL; + } + return buf; +} + +char* +mono_mempool_strdup_printf (MonoMemPool *pool, const char *format, ...) +{ + char *buf; + va_list args; + va_start (args, format); + buf = mono_mempool_strdup_vprintf (pool, format, args); + va_end (args); + return buf; +} + /** * mono_mempool_get_allocated: *