#include <mono/utils/atomic.h>
#include <mono/utils/mono-lazy-init.h>
#include <mono/utils/mono-threads.h>
+#ifdef HAVE_BACKTRACE_SYMBOLS
+#include <execinfo.h>
+#endif
+
/* TODO (missing pieces)
Add counters for:
* points to a valid value.
*/
-#ifdef HAVE_BOEHM_GC
+#if defined(HAVE_BOEHM_GC) || defined(HAVE_NULL_GC)
static HandleStack*
-new_handle_stack ()
+new_handle_stack (void)
{
return (HandleStack *)mono_gc_alloc_fixed (sizeof (HandleStack), MONO_GC_DESCRIPTOR_NULL, MONO_ROOT_SOURCE_HANDLE, "Thread Handle Stack");
}
}
static HandleChunk*
-new_handle_chunk ()
+new_handle_chunk (void)
{
+#if defined(HAVE_BOEHM_GC)
return (HandleChunk *)GC_MALLOC (sizeof (HandleChunk));
+#elif defined(HAVE_NULL_GC)
+ return (HandleChunk *)g_malloc (sizeof (HandleChunk));
+#endif
}
static void
free_handle_chunk (HandleChunk *chunk)
{
+#if defined(HAVE_NULL_GC)
+ g_free (chunk);
+#endif
}
#else
static HandleStack*
-new_handle_stack ()
+new_handle_stack (void)
{
return g_new (HandleStack, 1);
}
}
static HandleChunk*
-new_handle_chunk ()
+new_handle_chunk (void)
{
return g_new (HandleChunk, 1);
}
}
#ifdef MONO_HANDLE_TRACK_OWNER
-#define SET_OWNER(chunk,idx) do { (chunk)->elems[(idx)].owner = owner; } while (0)
+#ifdef HAVE_BACKTRACE_SYMBOLS
+#define SET_BACKTRACE(btaddrs) do { \
+ backtrace(btaddrs, 7); \
+ } while (0)
+#else
+#define SET_BACKTRACE(btaddrs) 0
+#endif
+#define SET_OWNER(chunk,idx) do { (chunk)->elems[(idx)].owner = owner; SET_BACKTRACE (&((chunk)->elems[(idx)].backtrace_ips[0])); } while (0)
#else
#define SET_OWNER(chunk,idx) do { } while (0)
#endif