First pass at profiler hooks in sgen.
[mono.git] / mono / metadata / sgen-los.c
index 85af63ac09e285923ba8139421cac758f89bbacf..698c57dd5a312be8cf3483961ef5bc47cf892852 100644 (file)
@@ -349,9 +349,11 @@ alloc_large_inner (MonoVTable *vtable, size_t size)
 #else
        if (need_major_collection ()) {
                DEBUG (4, fprintf (gc_debug_file, "Should trigger major collection: req size %zd (los already: %lu, limit: %lu)\n", size, (unsigned long)los_memory_usage, (unsigned long)next_los_collection));
-               stop_world ();
+               mono_profiler_gc_event (MONO_GC_EVENT_START, 1);
+               stop_world (1);
                major_collection ("LOS overflow");
-               restart_world ();
+               restart_world (1);
+               mono_profiler_gc_event (MONO_GC_EVENT_END, 1);
        }
 
 #ifdef USE_MALLOC
@@ -472,67 +474,7 @@ los_scan_card_table (GrayQueue *queue)
        LOSObject *obj;
 
        for (obj = los_object_list; obj; obj = obj->next) {
-               MonoVTable *vt = (MonoVTable*)LOAD_VTABLE (obj->data);
-               MonoClass *klass = vt->klass;
-
-               if (!klass->has_references)
-                       continue;
-
-               if (vt->rank) {
-                       MonoArray *arr = obj->data;
-                       mword desc = (mword)klass->element_class->gc_descr;
-                       char *start = sgen_card_table_align_pointer (obj->data);
-                       char *end = obj->data + obj->size;
-                       int size = mono_array_element_size (klass);
-
-                       g_assert (desc);
-
-                       for (; start <= end; start += CARD_SIZE_IN_BYTES) {
-                               char *elem, *card_end;
-                               guint8 *card_addr;
-                               uintptr_t index;
-                               card_addr = sgen_card_table_get_card_address ((mword)start);
-
-                               if (!*card_addr) {
-                                       //++card_ignored;
-                                       continue;
-                               }
-
-                               *card_addr = 0;
-                               card_end = start + CARD_SIZE_IN_BYTES;
-                               if (end < card_end)
-                                       card_end = end;
-
-                               if (start <= arr->vector)
-                                       index = 0;
-                               else
-                                       index = ARRAY_OBJ_INDEX (start, obj->data, size);
-
-                               elem = (char*)mono_array_addr_with_size ((MonoArray*)obj->data, size, index);
-                               if (klass->element_class->valuetype) {
-                                       while (elem < card_end) {
-                                               major.minor_scan_vtype (elem, desc, nursery_start, nursery_next, queue);
-                                               elem += size;
-                                       }
-                               } else {
-                                       while (elem < card_end) {
-                                               gpointer new, old = *(gpointer*)elem;
-                                               if (old) {
-                                                       major.copy_object ((void**)elem, queue);
-                                                       new = *(gpointer*)elem;
-                                                       if (G_UNLIKELY (ptr_in_nursery (new)))
-                                                               mono_sgen_add_to_global_remset (elem);
-                                               }
-                                               elem += size;
-                                       }
-                               }
-                       }
-               } else {
-                       if (sgen_card_table_is_region_marked ((mword)obj->data, (mword)obj->data + obj->size)) {
-                               sgen_card_table_reset_region ((mword)obj->data, (mword)obj->data + obj->size);
-                               major.minor_scan_object (obj->data, queue);
-                       }
-               }
+               sgen_cardtable_scan_object (obj->data, obj->size, NULL, queue);
        }
 }