diff --git a/src/coreclr/dlls/mscoree/mscorwks_ntdef.src b/src/coreclr/dlls/mscoree/mscorwks_ntdef.src index 6fb3baae8327f5..f2136cb572e901 100644 --- a/src/coreclr/dlls/mscoree/mscorwks_ntdef.src +++ b/src/coreclr/dlls/mscoree/mscorwks_ntdef.src @@ -32,6 +32,7 @@ EXPORTS ; mono coreclr_image_get_custom_attribute_data coreclr_unity_profiler_register + coreclr_unity_profiler_get_managed_assembly_load_context coreclr_unity_gc_concurrent_mode mono_array_element_size mono_assembly_get_assemblyref diff --git a/src/coreclr/dlls/mscoree/mscorwks_unixexports.src b/src/coreclr/dlls/mscoree/mscorwks_unixexports.src index 703e9b5622d2ea..3611f1af60592e 100644 --- a/src/coreclr/dlls/mscoree/mscorwks_unixexports.src +++ b/src/coreclr/dlls/mscoree/mscorwks_unixexports.src @@ -18,6 +18,7 @@ MetaDataGetDispenser ; mono coreclr_image_get_custom_attribute_data coreclr_unity_profiler_register +coreclr_unity_profiler_get_managed_assembly_load_context coreclr_unity_gc_concurrent_mode mono_array_element_size mono_assembly_get_assemblyref diff --git a/src/coreclr/gc/gc.cpp b/src/coreclr/gc/gc.cpp index 86022c70550a50..0ea98cb922f820 100644 --- a/src/coreclr/gc/gc.cpp +++ b/src/coreclr/gc/gc.cpp @@ -51918,7 +51918,7 @@ void CFinalize::CheckFinalizerObjects() void gc_heap::walk_heap_per_heap (walk_fn fn, void* context, int gen_number, BOOL walk_large_object_heap_p) { generation* gen = gc_heap::generation_of (gen_number); - heap_segment* seg = generation_start_segment (gen); + heap_segment* seg = heap_segment_in_range (generation_start_segment (gen)); uint8_t* x = ((gen_number == max_generation) ? heap_segment_mem (seg) : get_soh_start_object (seg, gen)); uint8_t* end = heap_segment_allocated (seg); int align_const = get_alignment_constant (TRUE); @@ -51928,7 +51928,7 @@ void gc_heap::walk_heap_per_heap (walk_fn fn, void* context, int gen_number, BOO { if (x >= end) { - if ((seg = heap_segment_next (seg)) != 0) + if ((seg = heap_segment_next_in_range (seg)) != 0) { x = heap_segment_mem (seg); end = heap_segment_allocated (seg); @@ -51940,7 +51940,7 @@ void gc_heap::walk_heap_per_heap (walk_fn fn, void* context, int gen_number, BOO // advance to next lower generation gen_number--; gen = gc_heap::generation_of (gen_number); - seg = generation_start_segment (gen); + seg = heap_segment_in_range (generation_start_segment (gen)); x = heap_segment_mem (seg); end = heap_segment_allocated (seg); @@ -51952,12 +51952,12 @@ void gc_heap::walk_heap_per_heap (walk_fn fn, void* context, int gen_number, BOO if (walk_large_object_heap_p) { walk_large_object_heap_p = FALSE; - seg = generation_start_segment (large_object_generation); + seg = heap_segment_in_range (generation_start_segment (large_object_generation)); } else if (walk_pinned_object_heap) { walk_pinned_object_heap = FALSE; - seg = generation_start_segment (pinned_object_generation); + seg = heap_segment_in_range (generation_start_segment (pinned_object_generation)); } else { diff --git a/src/coreclr/vm/mono/mono_coreclr.cpp b/src/coreclr/vm/mono/mono_coreclr.cpp index b5a5e40591afb8..d104de33a87fad 100644 --- a/src/coreclr/vm/mono/mono_coreclr.cpp +++ b/src/coreclr/vm/mono/mono_coreclr.cpp @@ -912,6 +912,22 @@ extern "C" EXPORT_API void EXPORT_CC coreclr_unity_profiler_register(const CLSID g_profControlBlock.storedProfilers.InsertHead(profilerData); } +extern "C" EXPORT_API ObjectHandleID EXPORT_CC coreclr_unity_profiler_get_managed_assembly_load_context(AssemblyID assemblyID) +{ + STATIC_CONTRACT_NOTHROW; + + Assembly *pAssembly = (Assembly*)assemblyID; + if (pAssembly == NULL) + return NULL; + + AssemblyBinder* pAssemblyBinder = pAssembly->GetPEAssembly()->GetAssemblyBinder(); + if (pAssemblyBinder->IsDefault()) + return NULL; + + // ManagedAssemblyLoadContext is a handle to the managed AssemblyLoadContext object + return (ObjectHandleID)pAssemblyBinder->GetManagedAssemblyLoadContext(); +} + extern "C" EXPORT_API gboolean EXPORT_CC coreclr_unity_gc_concurrent_mode(gboolean state) { CONTRACTL diff --git a/src/coreclr/vm/threadstatics.cpp b/src/coreclr/vm/threadstatics.cpp index e3430acf8e4ff2..10f4483564821d 100644 --- a/src/coreclr/vm/threadstatics.cpp +++ b/src/coreclr/vm/threadstatics.cpp @@ -51,14 +51,17 @@ void ThreadLocalBlock::FreeTLM(SIZE_T i, BOOL isThreadShuttingdown) { ThreadLocalModule::CollectibleDynamicEntry *entry = (ThreadLocalModule::CollectibleDynamicEntry*)pThreadLocalModule->m_pDynamicClassTable[k].m_pDynamicEntry; PTR_LoaderAllocator pLoaderAllocator = entry->m_pLoaderAllocator; - - if (entry->m_hGCStatics != NULL) - { - pLoaderAllocator->FreeHandle(entry->m_hGCStatics); - } - if (entry->m_hNonGCStatics != NULL) + // Skip assemblies that are already unloaded + if (!pLoaderAllocator->IsUnloaded()) { - pLoaderAllocator->FreeHandle(entry->m_hNonGCStatics); + if (entry->m_hGCStatics != NULL) + { + pLoaderAllocator->FreeHandle(entry->m_hGCStatics); + } + if (entry->m_hNonGCStatics != NULL) + { + pLoaderAllocator->FreeHandle(entry->m_hNonGCStatics); + } } } delete pThreadLocalModule->m_pDynamicClassTable[k].m_pDynamicEntry;