void mono_gc_wbarrier_object_copy (MonoObject* obj, MonoObject *src) { /* do not copy the sync state */ mono_gc_memmove ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject), mono_object_class (obj)->instance_size - sizeof (MonoObject)); }
static void mono_sgen_ssb_wbarrier_object_copy (MonoObject* obj, MonoObject *src) { int size; RememberedSet *rs; TLAB_ACCESS_INIT; size = mono_object_class (obj)->instance_size; rs = REMEMBERED_SET; DEBUG (6, fprintf (gc_debug_file, "Adding object remset for %p\n", obj)); LOCK_GC; /* do not copy the sync state */ mono_gc_memmove ((char*)obj + sizeof (MonoObject), (char*)src + sizeof (MonoObject), size - sizeof (MonoObject)); if (rs->store_next < rs->end_set) { *(rs->store_next++) = (mword)obj | REMSET_OBJECT; UNLOCK_GC; return; } rs = mono_sgen_alloc_remset (rs->end_set - rs->data, (void*)1, FALSE); rs->next = REMEMBERED_SET; REMEMBERED_SET = rs; #ifdef HAVE_KW_THREAD mono_thread_info_current ()->remset = rs; #endif *(rs->store_next++) = (mword)obj | REMSET_OBJECT; UNLOCK_GC; }
static void mono_sgen_ssb_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *klass) { RememberedSet *rs; size_t element_size = mono_class_value_size (klass, NULL); size_t size = count * element_size; TLAB_ACCESS_INIT; g_assert (klass->gc_descr_inited); LOCK_GC; mono_gc_memmove (dest, src, size); rs = REMEMBERED_SET; if (rs->store_next + 4 < rs->end_set) { *(rs->store_next++) = (mword)dest | REMSET_VTYPE; *(rs->store_next++) = (mword)klass->gc_descr; *(rs->store_next++) = (mword)count; *(rs->store_next++) = (mword)element_size; UNLOCK_GC; return; } rs = mono_sgen_alloc_remset (rs->end_set - rs->data, (void*)1, FALSE); rs->next = REMEMBERED_SET; REMEMBERED_SET = rs; #ifdef HAVE_KW_THREAD mono_thread_info_current ()->remset = rs; #endif *(rs->store_next++) = (mword)dest | REMSET_VTYPE; *(rs->store_next++) = (mword)klass->gc_descr; *(rs->store_next++) = (mword)count; *(rs->store_next++) = (mword)element_size; UNLOCK_GC; }
static void mono_sgen_ssb_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int count) { RememberedSet *rs; TLAB_ACCESS_INIT; LOCK_GC; mono_gc_memmove (dest_ptr, src_ptr, count * sizeof (gpointer)); rs = REMEMBERED_SET; DEBUG (8, fprintf (gc_debug_file, "Adding remset at %p, %d\n", dest_ptr, count)); if (rs->store_next + 1 < rs->end_set) { *(rs->store_next++) = (mword)dest_ptr | REMSET_RANGE; *(rs->store_next++) = count; UNLOCK_GC; return; } rs = mono_sgen_alloc_remset (rs->end_set - rs->data, (void*)1, FALSE); rs->next = REMEMBERED_SET; REMEMBERED_SET = rs; #ifdef HAVE_KW_THREAD mono_thread_info_current ()->remset = rs; #endif *(rs->store_next++) = (mword)dest_ptr | REMSET_RANGE; *(rs->store_next++) = count; UNLOCK_GC; }
void mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass *klass) { mono_gc_memmove (dest, src, count * mono_class_value_size (klass, NULL)); }
void mono_gc_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int count) { mono_gc_memmove (dest_ptr, src_ptr, count * sizeof (gpointer)); }