rom nobody Mon Sep 17 00:00:00 2001 From: Vera Volynets Date: Thu, 6 Jul 2006 15:41:22 +0400 Subject: [PATCH] Add function to gc interface. It's needed for separate enumeration of finalizable roots in gc_debug mode. Because some finalizable objects can be unreachable after GC gc_debug won't work properly. So it counts number of strongly live objects and finalizable ones separatly. --- 773b7cb7e8be42f04afcfdcbad63c0311e428368 vm/gc/src/gc_for_vm.cpp | 13 +++++++++++++ vm/include/jit_import_rt.h | 3 +++ vm/include/open/gc.h | 5 +++++ vm/vmcore/src/gc/dll_gc.cpp | 2 ++ vm/vmcore/src/gc/root_set_enum_common.cpp | 21 +++++++++++++++++++++ vm/vmcore/src/init/finalize.cpp | 2 +- 6 files changed, 45 insertions(+), 1 deletions(-) mode change 100644 => 100755 vm/gc/src/gc_for_vm.cpp 773b7cb7e8be42f04afcfdcbad63c0311e428368 diff --git a/vm/gc/src/gc_for_vm.cpp b/vm/gc/src/gc_for_vm.cpp old mode 100644 new mode 100755 index d70244f..0cb07bf --- a/vm/gc/src/gc_for_vm.cpp +++ b/vm/gc/src/gc_for_vm.cpp @@ -71,6 +71,7 @@ void gc_heap_write_global_slot_compresse void gc_add_root_set_entry_interior_pointer (void **slot, int offset, Boolean is_pinned); void gc_add_root_set_entry(Managed_Object_Handle *ref1, Boolean is_pinned); +void gc_add_finalizable_root_set_entry(Managed_Object_Handle *ref1, Boolean is_pinned); void gc_add_weak_root_set_entry(Managed_Object_Handle *ref1, Boolean is_pinned,Boolean is_short_weak); void gc_add_compressed_root_set_entry(uint32 *ref, Boolean is_pinned); Managed_Object_Handle gc_alloc(unsigned size, Allocation_Handle ah, void *tp); @@ -846,6 +847,18 @@ void gc_add_root_set_entry(Managed_Objec } } +void gc_add_finalizable_root_set_entry(Managed_Object_Handle *ref1, Boolean is_pinned) +{ + TRACE2("gc.roots", "gc_add_finalizable_root_set_entry " << ref1 << " -> " << *ref1); + Partial_Reveal_Object **ref = (Partial_Reveal_Object **) ref1; + p_global_gc->gc_internal_add_root_set_entry(ref); + + if (is_pinned) { + // Add the current block as one that can't be compacted since it has a pinned root + // pointing into it. + p_global_gc->gc_internal_block_contains_pinned_root(GC_BLOCK_INFO(*ref)); + } +} void gc_add_weak_root_set_entry(Managed_Object_Handle *ref1, Boolean is_pinned,Boolean is_short_weak) { diff --git a/vm/include/jit_import_rt.h b/vm/include/jit_import_rt.h index d115b55..d4fd98b 100644 --- a/vm/include/jit_import_rt.h +++ b/vm/include/jit_import_rt.h @@ -45,6 +45,9 @@ #endif // collection. VMEXPORT void vm_enumerate_root_reference(Managed_Object_Handle *ref, Boolean is_pinned); +//made for separate count of finalizable live object +VMEXPORT void vm_enumerate_finalizable_root_reference(Managed_Object_Handle *ref, Boolean is_pinned); + // Resembles vm_enumerate_root_reference() but is passed the address of // a slot containing a compressed reference. VMEXPORT void vm_enumerate_compressed_root_reference(uint32 *ref, Boolean is_pinned); diff --git a/vm/include/open/gc.h b/vm/include/open/gc.h index 10b40e7..07ef471 100644 --- a/vm/include/open/gc.h +++ b/vm/include/open/gc.h @@ -160,6 +160,10 @@ GCExport void gc_wrapup(); */ GCExport void gc_add_root_set_entry(Managed_Object_Handle *ref, Boolean is_pinned); +/* + *Is called by VM to enumerate finalized root reference + */ +GCExport void gc_add_finalizable_root_set_entry(Managed_Object_Handle *ref, Boolean is_pinned); /** * Resembles gc_add_root_set_entry() but is passed the address of a slot * containing a compressed reference. @@ -555,6 +559,7 @@ #else /* #if defined(USE_GC_STATIC) || d */ extern void (*gc_add_root_set_entry)(Managed_Object_Handle *ref, Boolean is_pinned); +extern void (*gc_add_finalizable_root_set_entry)(Managed_Object_Handle *ref, Boolean is_pinned); extern void (*gc_add_compressed_root_set_entry)(uint32 *ref, Boolean is_pinned); extern void (*gc_add_root_set_entry_interior_pointer)(void **slot, int offset, Boolean is_pinned); extern void (*gc_add_weak_root_set_entry)(Managed_Object_Handle *ref1, Boolean is_pinned,Boolean is_short_weak); diff --git a/vm/vmcore/src/gc/dll_gc.cpp b/vm/vmcore/src/gc/dll_gc.cpp index c3204b8..09437a5 100644 --- a/vm/vmcore/src/gc/dll_gc.cpp +++ b/vm/vmcore/src/gc/dll_gc.cpp @@ -65,6 +65,7 @@ static Boolean default_gc_supports_front Boolean (*gc_supports_compressed_references)() = 0; void (*gc_add_root_set_entry)(Managed_Object_Handle *ref, Boolean is_pinned) = 0; +void (*gc_add_finalizable_root_set_entry)(Managed_Object_Handle *ref, Boolean is_pinned) = 0; void (*gc_add_weak_root_set_entry)(Managed_Object_Handle *ref, Boolean is_pinned,Boolean is_short_weak) = 0; void (*gc_add_compressed_root_set_entry)(uint32 *ref, Boolean is_pinned) = 0; void (*gc_add_root_set_entry_interior_pointer)(void **slot, int offset, Boolean is_pinned) = 0; @@ -165,6 +166,7 @@ void vm_add_gc(const char *dllName) (apr_dso_handle_sym_t)default_gc_supports_compressed_references); gc_add_root_set_entry = (void (*)(Managed_Object_Handle *ref, Boolean is_pinned)) getFunction(handle, "gc_add_root_set_entry", dllName); + gc_add_finalizable_root_set_entry = (void (*)(Managed_Object_Handle *ref, Boolean is_pinned)) getFunction(handle, "gc_add_finalizable_root_set_entry", dllName); gc_add_compressed_root_set_entry = (void (*)(uint32 *ref, Boolean is_pinned)) getFunctionOptional(handle, "gc_add_compressed_root_set_entry", diff --git a/vm/vmcore/src/gc/root_set_enum_common.cpp b/vm/vmcore/src/gc/root_set_enum_common.cpp index 17a81b7..cce99ed 100644 --- a/vm/vmcore/src/gc/root_set_enum_common.cpp +++ b/vm/vmcore/src/gc/root_set_enum_common.cpp @@ -149,6 +149,27 @@ #endif // _DEBUG } } //vm_enumerate_root_reference +void +vm_enumerate_finalizable_root_reference(void **ref, Boolean is_pinned) +{ + if (get_global_safepoint_status() == enumerate_the_universe) { + +#if _DEBUG + if (VM_Global_State::loader_env->compress_references) { + // 20030324 DEBUG: verify the slot whose reference is being passed. + ManagedObject **p_obj = (ManagedObject **)ref; + ManagedObject* obj = *p_obj; + assert(obj != NULL); // See the comment at the top of the procedure. + if ((void *)obj != Class::heap_base) { + assert(((POINTER_SIZE_INT)Class::heap_base <= (POINTER_SIZE_INT)obj) && ((POINTER_SIZE_INT)obj <= (POINTER_SIZE_INT)Class::heap_end)); + (obj->vt())->clss->name->bytes; + } + } +#endif // _DEBUG + + gc_add_finalizable_root_set_entry((Managed_Object_Handle *)ref, is_pinned); + } +} //vm_enumerate_finalizable_root_reference // Resembles vm_enumerate_root_reference() but is passed the address of a uint32 slot containing a compressed reference. diff --git a/vm/vmcore/src/init/finalize.cpp b/vm/vmcore/src/init/finalize.cpp index a50231c..d2ee7cb 100644 --- a/vm/vmcore/src/init/finalize.cpp +++ b/vm/vmcore/src/init/finalize.cpp @@ -240,7 +240,7 @@ void Object_Queue::enumerate_for_gc() // enumerate elements in the queue for(unsigned i = 0; i < num_objects; i++) { - vm_enumerate_root_reference((void **)&(objects[i]), FALSE); + vm_enumerate_finalizable_root_reference((void **)&(objects[i]), FALSE); } // unlock -- 1.3.GIT