Skip to content

Commit 839ec21

Browse files
authored
Merge pull request #959 from Unity-Technologies/memory-snapshot-unity-master
Unity Memory Snapshot Support for .NET 4.x
2 parents bed4625 + b7c8a54 commit 839ec21

File tree

10 files changed

+829
-2
lines changed

10 files changed

+829
-2
lines changed

mono/metadata/appdomain.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ typedef struct _MonoAppDomain MonoAppDomain;
2626
typedef struct _MonoJitInfo MonoJitInfo;
2727

2828
typedef void (*MonoDomainFunc) (MonoDomain *domain, void* user_data);
29+
typedef void (*MonoDomainAssemblyFunc) (MonoAssembly *assembly, void* user_data);
2930

3031
MONO_API MonoDomain*
3132
mono_init (const char *filename);
@@ -108,6 +109,9 @@ mono_domain_from_appdomain (MonoAppDomain *appdomain);
108109
MONO_API void
109110
mono_domain_foreach (MonoDomainFunc func, void* user_data);
110111

112+
MONO_API void
113+
mono_domain_assembly_foreach (MonoDomain* domain, MonoDomainAssemblyFunc func, void* user_data);
114+
111115
MONO_API MonoAssembly *
112116
mono_domain_assembly_open (MonoDomain *domain, const char *name);
113117

mono/metadata/boehm-gc.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2027,7 +2027,7 @@ mono_gchandle_free_domain (MonoDomain *domain)
20272027
{
20282028
guint type;
20292029

2030-
for (type = HANDLE_TYPE_MIN; type < HANDLE_PINNED; ++type) {
2030+
for (type = HANDLE_TYPE_MIN; type <= HANDLE_PINNED; ++type) {
20312031
guint slot;
20322032
HandleData *handles = &gc_handles [type];
20332033
lock_handles (handles);
@@ -2058,6 +2058,30 @@ mono_gc_register_obj_with_weak_fields (void *obj)
20582058
g_error ("Weak fields not supported by boehm gc");
20592059
}
20602060

2061+
void
2062+
mono_gc_strong_handle_foreach(GFunc func, gpointer user_data)
2063+
{
2064+
int gcHandleTypeIndex;
2065+
uint32_t i;
2066+
2067+
lock_handles(handles);
2068+
2069+
for (gcHandleTypeIndex = HANDLE_NORMAL; gcHandleTypeIndex <= HANDLE_PINNED; gcHandleTypeIndex++)
2070+
{
2071+
HandleData* handles = &gc_handles[gcHandleTypeIndex];
2072+
2073+
for (i = 0; i < handles->size; i++)
2074+
{
2075+
if (!slot_occupied(handles, i))
2076+
continue;
2077+
if (handles->entries[i] != NULL)
2078+
func(handles->entries[i], user_data);
2079+
}
2080+
}
2081+
2082+
unlock_handles(handles);
2083+
}
2084+
20612085
#else
20622086

20632087
MONO_EMPTY_SOURCE_FILE (boehm_gc);

mono/metadata/domain.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,27 @@ mono_domain_foreach (MonoDomainFunc func, gpointer user_data)
982982
gc_free_fixed_non_heap_list (copy);
983983
}
984984

985+
MONO_API void
986+
mono_domain_assembly_foreach (MonoDomain* domain, MonoDomainAssemblyFunc func, void* user_data)
987+
{
988+
MonoAssembly* assembly;
989+
GSList *iter;
990+
991+
/* Skipping internal assembly builders created by remoting,
992+
as it is done in ves_icall_System_AppDomain_GetAssemblies
993+
*/
994+
mono_domain_assemblies_lock(domain);
995+
for (iter = domain->domain_assemblies; iter; iter = iter->next)
996+
{
997+
assembly = (MonoAssembly *)iter->data;
998+
if (assembly->corlib_internal)
999+
continue;
1000+
1001+
func(assembly, user_data);
1002+
}
1003+
mono_domain_assemblies_unlock(domain);
1004+
}
1005+
9851006
/* FIXME: maybe we should integrate this with mono_assembly_open? */
9861007
/**
9871008
* mono_domain_assembly_open:

mono/metadata/gc-internals.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ MonoGCDescriptor mono_gc_make_descr_for_string (gsize *bitmap, int numbits);
140140

141141
void mono_gc_register_obj_with_weak_fields (void *obj);
142142

143+
void mono_gc_strong_handle_foreach(GFunc func, gpointer user_data);
144+
143145
void mono_gc_register_for_finalization (MonoObject *obj, void *user_data);
144146
void mono_gc_add_memory_pressure (gint64 value);
145147
MONO_API int mono_gc_register_root (char *start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg);

mono/metadata/mempool.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,3 +434,21 @@ mono_mempool_get_bytes_allocated (void)
434434
{
435435
return UnlockedRead64 (&total_bytes_allocated);
436436
}
437+
438+
void
439+
mono_mempool_foreach_block(MonoMemPool* pool, mono_mempool_block_proc callback, void* user_data)
440+
{
441+
MonoMemPool *current = pool;
442+
443+
while (current)
444+
{
445+
gpointer start = (guint8*)current + SIZEOF_MEM_POOL;
446+
gpointer end = (guint8*)start + current->size;
447+
448+
callback(start, end, user_data);
449+
current = current->next;
450+
}
451+
}
452+
453+
454+

mono/metadata/mempool.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ mono_mempool_strdup (MonoMemPool *pool, const char *s);
4141
MONO_API uint32_t
4242
mono_mempool_get_allocated (MonoMemPool *pool);
4343

44+
typedef void(*mono_mempool_block_proc)(void* start, void* end, void* user_data);
45+
46+
MONO_API void
47+
mono_mempool_foreach_block(MonoMemPool* pool, mono_mempool_block_proc callback, void* user_data);
48+
4449
MONO_END_DECLS
4550

4651
#endif

mono/metadata/metadata-internals.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,8 @@ typedef struct {
621621
char *aot_options;
622622
} MonoAotCacheConfig;
623623

624+
typedef void(*MonoImageSetFunc) (MonoImageSet *imageSet, void* user_data);
625+
624626
#define MONO_SIZEOF_METHOD_SIGNATURE (sizeof (struct _MonoMethodSignature) - MONO_ZERO_LEN_ARRAY * SIZEOF_VOID_P)
625627

626628
static inline gboolean
@@ -722,6 +724,8 @@ mono_image_set_unlock (MonoImageSet *set);
722724
char*
723725
mono_image_set_strdup (MonoImageSet *set, const char *s);
724726

727+
void mono_metadata_image_set_foreach(MonoImageSetFunc func, gpointer user_data);
728+
725729
#define mono_image_set_new0(image,type,size) ((type *) mono_image_set_alloc0 (image, sizeof (type)* (size)))
726730

727731
gboolean

mono/metadata/metadata.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5080,6 +5080,66 @@ mono_metadata_generic_class_is_valuetype (MonoGenericClass *gclass)
50805080
return gclass->container_class->valuetype;
50815081
}
50825082

5083+
typedef struct
5084+
{
5085+
MonoGenericClassFunc func;
5086+
gpointer user_data;
5087+
} GenericClassForeachData;
5088+
5089+
5090+
static void
5091+
generic_class_foreach_callback(gpointer key, gpointer value, gpointer user_data)
5092+
{
5093+
GenericClassForeachData* data = (GenericClassForeachData*)user_data;
5094+
data->func(key, data->user_data);
5095+
}
5096+
5097+
void
5098+
mono_metadata_generic_class_foreach(MonoGenericClassFunc func, void* user_data)
5099+
{
5100+
GenericClassForeachData data;
5101+
guint i;
5102+
5103+
data.func = func;
5104+
data.user_data = user_data;
5105+
5106+
for(i = 0; i < HASH_TABLE_SIZE; ++i)
5107+
{
5108+
MonoImageSet* imageSet = img_set_cache[i];
5109+
5110+
if (imageSet == NULL || imageSet->gclass_cache == NULL)
5111+
continue;
5112+
5113+
mono_image_set_lock(imageSet);
5114+
5115+
mono_conc_hashtable_foreach(imageSet->gclass_cache, generic_class_foreach_callback, &data);
5116+
5117+
mono_image_set_unlock(imageSet);
5118+
}
5119+
}
5120+
5121+
void
5122+
mono_metadata_image_set_foreach(MonoImageSetFunc func, gpointer user_data)
5123+
{
5124+
GenericClassForeachData data;
5125+
guint i;
5126+
5127+
data.func = func;
5128+
data.user_data = user_data;
5129+
5130+
for (i = 0; i < HASH_TABLE_SIZE; ++i)
5131+
{
5132+
MonoImageSet* imageSet = img_set_cache[i];
5133+
5134+
if (imageSet == NULL)
5135+
continue;
5136+
5137+
mono_image_set_lock(imageSet);
5138+
func(imageSet, user_data);
5139+
mono_image_set_unlock(imageSet);
5140+
}
5141+
}
5142+
50835143
static gboolean
50845144
_mono_metadata_generic_class_equal (const MonoGenericClass *g1, const MonoGenericClass *g2, gboolean signature_only)
50855145
{

mono/metadata/metadata.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ typedef enum {
332332
MONO_PARSE_FIELD
333333
} MonoParseTypeMode;
334334

335+
typedef void(*MonoGenericClassFunc) (MonoGenericClass *genericClass, void* user_data);
336+
335337
MONO_API mono_bool
336338
mono_type_is_byref (MonoType *type);
337339

@@ -426,6 +428,7 @@ MONO_API int mono_type_stack_size (MonoType *type,
426428

427429
MONO_API mono_bool mono_type_generic_inst_is_valuetype (MonoType *type);
428430
MONO_API mono_bool mono_metadata_generic_class_is_valuetype (MonoGenericClass *gclass);
431+
MONO_API void mono_metadata_generic_class_foreach(MonoGenericClassFunc func, void* user_data);
429432

430433
MONO_API unsigned int mono_metadata_type_hash (MonoType *t1);
431434
MONO_API mono_bool mono_metadata_type_equal (MonoType *t1, MonoType *t2);

0 commit comments

Comments
 (0)