From: Jonathan Chambers Date: Wed, 14 Jun 2017 00:32:06 +0000 (-0400) Subject: Use GC memory for handle stack under Boehm so it's scanned. Cleanup handle stack... X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=466c00b8f07f66689427764f78cc10795b30c9c0;p=mono.git Use GC memory for handle stack under Boehm so it's scanned. Cleanup handle stack on thread unregister. --- diff --git a/mono/metadata/boehm-gc.c b/mono/metadata/boehm-gc.c index edc12105878..42f4d16597d 100644 --- a/mono/metadata/boehm-gc.c +++ b/mono/metadata/boehm-gc.c @@ -408,6 +408,8 @@ boehm_thread_unregister (MonoThreadInfo *p) if (p->runtime_thread) mono_threads_add_joinable_thread ((gpointer)tid); + + mono_handle_stack_free (p->handle_stack); } static void diff --git a/mono/metadata/handle.c b/mono/metadata/handle.c index 59bde7fbe77..3d7bcc0a173 100644 --- a/mono/metadata/handle.c +++ b/mono/metadata/handle.c @@ -69,6 +69,55 @@ Combine: MonoDefaults, GENERATE_GET_CLASS_WITH_CACHE, TYPED_HANDLE_DECL and frie * points to a valid value. */ +#ifdef HAVE_BOEHM_GC +static HandleStack* +new_handle_stack () +{ + return (HandleStack *)mono_gc_alloc_fixed (sizeof (HandleStack), MONO_GC_DESCRIPTOR_NULL, MONO_ROOT_SOURCE_HANDLE, "Thread Handle Stack"); +} + +static void +free_handle_stack (HandleStack *stack) +{ + mono_gc_free_fixed (stack); +} + +static HandleChunk* +new_handle_chunk () +{ + return (HandleChunk *)GC_MALLOC (sizeof (HandleChunk)); +} + +static void +free_handle_chunk (HandleChunk *chunk) +{ +} +#else +static HandleStack* +new_handle_stack () +{ + return g_new (HandleStack, 1); +} + +static void +free_handle_stack (HandleStack *stack) +{ + g_free (stack); +} + +static HandleChunk* +new_handle_chunk () +{ + return g_new (HandleChunk, 1); +} + +static void +free_handle_chunk (HandleChunk *chunk) +{ + g_free (chunk); +} +#endif + const MonoObjectHandle mono_null_value_handle = NULL; #define THIS_IS_AN_OK_NUMBER_OF_HANDLES 100 @@ -197,7 +246,7 @@ retry: handles->top = top; goto retry; } - HandleChunk *new_chunk = g_new (HandleChunk, 1); + HandleChunk *new_chunk = new_handle_chunk (); new_chunk->size = 0; new_chunk->prev = top; new_chunk->next = NULL; @@ -245,9 +294,9 @@ mono_handle_new_interior (gpointer rawptr, const char *owner) HandleStack* mono_handle_stack_alloc (void) { - HandleStack *stack = g_new0 (HandleStack, 1); - HandleChunk *chunk = g_new0 (HandleChunk, 1); - HandleChunk *interior = g_new0 (HandleChunk, 1); + HandleStack *stack = new_handle_stack (); + HandleChunk *chunk = new_handle_chunk (); + HandleChunk *interior = new_handle_chunk (); mono_memory_write_barrier (); stack->top = stack->bottom = chunk; @@ -268,12 +317,12 @@ mono_handle_stack_free (HandleStack *stack) mono_memory_write_barrier (); while (c) { HandleChunk *next = c->next; - g_free (c); + free_handle_chunk (c); c = next; } - g_free (c); - g_free (stack->interior); - g_free (stack); + free_handle_chunk (c); + free_handle_chunk (stack->interior); + free_handle_stack (stack); } void