diff --git a/vm/gcv4/src/gc_for_vm.cpp b/vm/gcv4/src/gc_for_vm.cpp index b9f60d1..66c8166 100644 --- a/vm/gcv4/src/gc_for_vm.cpp +++ b/vm/gcv4/src/gc_for_vm.cpp @@ -75,6 +75,7 @@ void gc_add_weak_root_set_entry(Managed_ void gc_add_compressed_root_set_entry(uint32 *ref, Boolean is_pinned); Managed_Object_Handle gc_alloc(unsigned size, Allocation_Handle ah, void *tp); Managed_Object_Handle gc_pinned_malloc_noclass(unsigned size) ; +Managed_Object_Handle gc_alloc_pinned(unsigned size, Allocation_Handle type, void *thread_pointer); void gc_thread_init(void *gc_information) ; void gc_thread_kill(void *gc_information) ; void gc_force_gc() ; @@ -1076,6 +1077,12 @@ Managed_Object_Handle gc_pinned_malloc_n return p_return; } +Managed_Object_Handle gc_alloc_pinned(unsigned size, Allocation_Handle type, void *thread_pointer) +{ + Partial_Reveal_Object *p_return = gc_pinned_malloc(size, type, false, false); + gc_trace((void *)p_return, "Allocated as a pinned object."); + return p_return; +} /**** * diff --git a/vm/include/open/gc.h b/vm/include/open/gc.h index 38d07d7..4660451 100644 --- a/vm/include/open/gc.h +++ b/vm/include/open/gc.h @@ -323,7 +323,7 @@ GCExport Managed_Object_Handle gc_pinned /** * Allocate pinned forever object * - * @note Not implemented. + * @note. */ GCExport Managed_Object_Handle gc_alloc_pinned(unsigned size, Allocation_Handle type, void *thread_pointer); @@ -573,6 +573,9 @@ extern Managed_Object_Handle (*gc_alloc_ void *thread_pointer); extern void (*gc_vm_initialized)(); //extern Managed_Object_Handle (*gc_pinned_malloc_noclass)(unsigned size); +extern Managed_Object_Handle (*gc_alloc_pinned)(unsigned size, + Allocation_Handle type, + void *thread_pointer); extern void (*gc_thread_init)(void *gc_information); extern void (*gc_thread_kill)(void *gc_information); VMEXPORT extern int64 (*gc_total_memory)(); diff --git a/vm/vmcore/src/class_support/Class.cpp b/vm/vmcore/src/class_support/Class.cpp index 04a0dcd..deb33d5 100644 --- a/vm/vmcore/src/class_support/Class.cpp +++ b/vm/vmcore/src/class_support/Class.cpp @@ -636,7 +636,7 @@ void* create_vtable_sequence(Class *p_cl assert (vtVTableHandle); // create VTable for VT // VTable for VT class is equial to env->VTableVTable_Class as having the same size - vtVTableHandle->object = (ManagedObject*)gc_alloc(env->VTableVTable_Class->instance_data_size, + vtVTableHandle->object = (ManagedObject*)gc_alloc_pinned(env->VTableVTable_Class->instance_data_size, env->VTableVTable_Class->allocation_handle, vm_get_gc_thread_local()); tmn_suspend_enable(); @@ -648,7 +648,7 @@ void* create_vtable_sequence(Class *p_cl "Failed to create vtable_sequence for class " << env->VTableVTable_Class->name->bytes); return NULL; } - gc_pin_object((Managed_Object_Handle*)vtVTableHandle); + //gc_pin_object((Managed_Object_Handle*)vtVTableHandle); memset(vtVTableHandle->object->get_data_ptr(), 0, VTABLE_OVERHEAD); // Create VT for class @@ -676,7 +676,7 @@ void* create_vtable_sequence(Class *p_cl tmn_suspend_disable(); ObjectHandle vtVTHandle = oh_allocate_local_handle(); assert (vtVTHandle); - vtVTHandle->object = (ManagedObject*)gc_alloc(VT_clss->instance_data_size, + vtVTHandle->object = (ManagedObject*)gc_alloc_pinned(VT_clss->instance_data_size, VT_clss->allocation_handle, vm_get_gc_thread_local()); tmn_suspend_enable(); @@ -688,7 +688,7 @@ void* create_vtable_sequence(Class *p_cl "Failed to create vtable_sequence for class " << VT_clss->name->bytes); return NULL; } - gc_pin_object((Managed_Object_Handle*)vtVTHandle); + //gc_pin_object((Managed_Object_Handle*)vtVTHandle); memset(vtVTHandle->object->get_data_ptr(), 0, vt_size); p_class->vtObj = vtVTHandle->object; // TEMPORARY - use allocation_handle instead!!! will be set later into allocation_handle diff --git a/vm/vmcore/src/gc/dll_gc.cpp b/vm/vmcore/src/gc/dll_gc.cpp index 0e2c47f..6906f42 100644 --- a/vm/vmcore/src/gc/dll_gc.cpp +++ b/vm/vmcore/src/gc/dll_gc.cpp @@ -98,6 +98,9 @@ Managed_Object_Handle (*gc_alloc)(unsign Managed_Object_Handle (*gc_alloc_fast)(unsigned size, Allocation_Handle p_vtable, void *thread_pointer) = 0; +Managed_Object_Handle (*gc_alloc_pinned)(unsigned size, + Allocation_Handle p_vtable, + void *thread_pointer) = 0; void (*gc_vm_initialized)() = 0; Boolean (*gc_requires_barriers)() = default_gc_requires_barriers; @@ -223,6 +226,10 @@ void vm_add_gc(const char *dllName) Allocation_Handle type, void *thread_pointer)) getFunctionOptional(handle, "gc_alloc", dllName, NULL); + gc_alloc_pinned = (Managed_Object_Handle (*)(unsigned size, + Allocation_Handle type, + void *thread_pointer)) + getFunctionOptional(handle, "gc_alloc_pinned", dllName, NULL); gc_alloc_fast = (Managed_Object_Handle (*)(unsigned size, Allocation_Handle type, diff --git a/vm/vmcore/src/init/vm_init.cpp b/vm/vmcore/src/init/vm_init.cpp index 3c7e0fb..50eb5e0 100644 --- a/vm/vmcore/src/init/vm_init.cpp +++ b/vm/vmcore/src/init/vm_init.cpp 161c161 < VTableVTableHandle->object = (ManagedObject*)gc_alloc(env->VTableVTable_Class->instance_data_size, --- > VTableVTableHandle->object = (ManagedObject*)gc_alloc_pinned(env->VTableVTable_Class->instance_data_size, 164c164 < gc_pin_object((Managed_Object_Handle*)&VTableVTableHandle->object); --- > // gc_pin_object((Managed_Object_Handle*)&VTableVTableHandle->object);