#include "metadata/sgen-gc.h"
#include "metadata/sgen-cardtable.h"
+#include "metadata/sgen-memory-governor.h"
#include "utils/mono-counters.h"
#include "utils/mono-time.h"
#include "utils/mono-memory-model.h"
//#define CARDTABLE_STATS
+#ifdef HAVE_UNISTD_H
#include <unistd.h>
+#endif
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#endif
static void
sgen_card_table_wbarrier_object_copy (MonoObject* obj, MonoObject *src)
{
- int size;
- TLAB_ACCESS_INIT;
-
- size = mono_object_class (obj)->instance_size;
+ int size = mono_object_class (obj)->instance_size;
#ifdef DISABLE_CRITICAL_REGION
LOCK_GC;
#else
+ TLAB_ACCESS_INIT;
ENTER_CRITICAL_REGION;
#endif
mono_gc_memmove ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject),
{
MonoVTable *vt = (MonoVTable*)SGEN_LOAD_VTABLE (obj);
MonoClass *klass = vt->klass;
- CopyOrMarkObjectFunc copy_func = sgen_get_copy_object ();
- ScanObjectFunc scan_object_func = sgen_get_minor_scan_object ();
- ScanVTypeFunc scan_vtype_func = sgen_get_minor_scan_vtype ();
HEAVY_STAT (++large_objects);
elem = (char*)mono_array_addr_with_size ((MonoArray*)obj, elem_size, index);
if (klass->element_class->valuetype) {
+ ScanVTypeFunc scan_vtype_func = sgen_get_current_object_ops ()->scan_vtype;
+
for (; elem < card_end; elem += elem_size)
scan_vtype_func (elem, desc, queue);
} else {
+ CopyOrMarkObjectFunc copy_func = sgen_get_current_object_ops ()->copy_or_mark_object;
+
HEAVY_STAT (++los_array_cards);
for (; elem < card_end; elem += SIZEOF_VOID_P) {
gpointer new, old = *(gpointer*)elem;
HEAVY_STAT (++bloby_objects);
if (cards) {
if (sgen_card_table_is_range_marked (cards, (mword)obj, block_obj_size))
- scan_object_func (obj, queue);
+ sgen_get_current_object_ops ()->scan_object (obj, queue);
} else if (sgen_card_table_region_begin_scanning ((mword)obj, block_obj_size)) {
- scan_object_func (obj, queue);
+ sgen_get_current_object_ops ()->scan_object (obj, queue);
}
}
}
void
sgen_card_table_init (SgenRemeberedSet *remset)
{
- sgen_cardtable = sgen_alloc_os_memory (CARD_COUNT_IN_BYTES, TRUE);
+ sgen_cardtable = sgen_alloc_os_memory (CARD_COUNT_IN_BYTES, SGEN_ALLOC_INTERNAL | SGEN_ALLOC_ACTIVATE, "card table");
#ifdef SGEN_HAVE_OVERLAPPING_CARDS
- sgen_shadow_cardtable = sgen_alloc_os_memory (CARD_COUNT_IN_BYTES, TRUE);
+ sgen_shadow_cardtable = sgen_alloc_os_memory (CARD_COUNT_IN_BYTES, SGEN_ALLOC_INTERNAL | SGEN_ALLOC_ACTIVATE, "shadow card table");
#endif
#ifdef HEAVY_STATISTICS
#endif
-#endif /*HAVE_SGEN_GC*/
\ No newline at end of file
+#endif /*HAVE_SGEN_GC*/