Skip to content

Commit 0ca4405

Browse files
committed
* fixed incorrect offsetting in mono_mempool_foreach_block
* removed start/stop loop when capturing heap sections in order to prevent data inconsistencies * moved stop/start world calls to the start/end of the capture function, we should always be stopped when collecting meta information * added waiting for currently running GC op
1 parent 7ddade2 commit 0ca4405

File tree

2 files changed

+15
-26
lines changed

2 files changed

+15
-26
lines changed

mono/metadata/mempool.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ mono_mempool_foreach_block(MonoMemPool* pool, mono_mempool_block_proc callback,
443443
while (current)
444444
{
445445
gpointer start = (guint8*)current + SIZEOF_MEM_POOL;
446-
gpointer end = (guint8*)start + current->size;
446+
gpointer end = (guint8*)current + current->size;
447447

448448
callback(start, end, user_data);
449449
current = current->next;

mono/metadata/unity-memory-info.c

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,7 @@ static void AllocateMemoryForMemPool(MonoMemPool* pool, void *user_data)
305305

306306
static void AllocateMemoryForImageMemPool(MonoImage *image, gpointer value, void *user_data)
307307
{
308-
mono_image_lock(image);
309308
AllocateMemoryForMemPool(image->mempool, user_data);
310-
mono_image_unlock(image);
311309
}
312310

313311
static void CopyMemPool(MonoMemPool *pool, SectionIterationContext *context)
@@ -317,26 +315,17 @@ static void CopyMemPool(MonoMemPool *pool, SectionIterationContext *context)
317315

318316
static void CopyImageMemPool(MonoImage *image, gpointer value, SectionIterationContext *context)
319317
{
320-
mono_image_lock(image);
321318
CopyMemPool(image->mempool, context);
322-
mono_image_unlock(image);
323319
}
324320

325321
static void AllocateMemoryForImageClassCache(MonoImage *image, gpointer *value, void *user_data)
326322
{
327-
mono_image_lock(image);
328-
329323
AllocateMemoryForSection(user_data, image->class_cache.table, ((uint8_t*)image->class_cache.table) + image->class_cache.size);
330-
mono_image_unlock(image);
331324
}
332325

333326
static void CopyImageClassCache(MonoImage *image, gpointer value, SectionIterationContext *context)
334327
{
335-
mono_image_lock(image);
336-
337328
CopyHeapSection(context, image->class_cache.table, ((uint8_t*)image->class_cache.table) + image->class_cache.size);
338-
339-
mono_image_unlock(image);
340329
}
341330

342331
static void IncrementCountForImageSetMemPoolNumChunks(MonoImageSet *imageSet, void *user_data)
@@ -491,18 +480,7 @@ static void CaptureManagedHeap(MonoManagedHeap* heap, GHashTable* monoImages)
491480
data.heap = heap;
492481
data.monoImages = monoImages;
493482

494-
while (TRUE)
495-
{
496-
GC_call_with_alloc_lock(CaptureHeapInfo, &data);
497-
GC_stop_world_external();
498-
499-
if (MonoManagedHeapStillValid(heap, monoImages))
500-
break;
501-
502-
GC_start_world_external();
503-
504-
FreeMonoManagedHeap(heap);
505-
}
483+
CaptureHeapInfo(&data);
506484

507485
iterationContext.currentSection = heap->sections;
508486

@@ -512,8 +490,6 @@ static void CaptureManagedHeap(MonoManagedHeap* heap, GHashTable* monoImages)
512490
g_hash_table_foreach(monoImages, (GHFunc)CopyImageMemPool, &iterationContext);
513491
g_hash_table_foreach(monoImages, (GHFunc)CopyImageClassCache, &iterationContext);
514492
mono_metadata_image_set_foreach(CopyImageSetMemPool, &iterationContext);
515-
516-
GC_start_world_external();
517493
}
518494

519495
static void GCHandleIterationCallback(MonoObject* managedObject, GList** managedObjects)
@@ -638,6 +614,15 @@ static void CollectMonoImageFromAssembly(MonoAssembly *assembly, void *user_data
638614

639615
MonoManagedMemorySnapshot* mono_unity_capture_memory_snapshot()
640616
{
617+
int wasDisabled = GC_is_disabled();
618+
if (!wasDisabled)
619+
GC_disable();
620+
621+
if (GC_collection_in_progress() == TRUE)
622+
GC_wait_for_gc_completion();
623+
624+
GC_stop_world_external();
625+
641626
MonoManagedMemorySnapshot* snapshot;
642627
snapshot = g_new0(MonoManagedMemorySnapshot, 1);
643628

@@ -656,6 +641,10 @@ MonoManagedMemorySnapshot* mono_unity_capture_memory_snapshot()
656641

657642
g_hash_table_destroy(monoImages);
658643

644+
if (!wasDisabled)
645+
GC_enable();
646+
647+
GC_start_world_external();
659648
return snapshot;
660649
}
661650

0 commit comments

Comments
 (0)