You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/04/18 20:08:19 UTC

svn commit: r530111 - in /harmony/enhanced/drlvm/trunk/vm/vmcore: include/classloader.h include/unloading.h src/class_support/classloader.cpp src/gc/root_set_enum_common.cpp src/gc/stop_the_world_root_set_enum.cpp

Author: gshimansky
Date: Wed Apr 18 11:08:18 2007
New Revision: 530111

URL: http://svn.apache.org/viewvc?view=rev&rev=530111
Log:
Applied HARMONY-3402 [drlvm] j.l.Classloaders for active frames on stack are to be enumerated as strong references


Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/unloading.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h?view=diff&rev=530111&r1=530110&r2=530111
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h Wed Apr 18 11:08:18 2007
@@ -155,7 +155,7 @@
 public:
     ClassLoader() : m_loader(NULL), m_parent(NULL), m_name(NULL), m_package_table(NULL), 
         m_loadedClasses(NULL), m_loadingClasses(NULL), m_reportedClasses(NULL),
-        m_javaTypes(NULL), m_nativeLibraries(NULL), m_verifyData(NULL)
+        m_javaTypes(NULL), m_nativeLibraries(NULL), m_verifyData(NULL), m_markBit(false)
     {
         apr_pool_create(&pool, 0);
     }
@@ -208,6 +208,8 @@
 
 public:
     bool IsBootstrap() { return m_loader == NULL; }
+    void Mark() { m_markBit = true; }
+    bool isMarked() { return m_markBit; }
     ManagedObject* GetLoader() { return m_loader; }
     const String* GetName() { return m_name; }
     ClassLoader* GetParent() { return m_parent; }
@@ -225,6 +227,7 @@
     VMEXPORT static ClassLoader* LookupLoader( ManagedObject* loader );
     static void UnloadClassLoader( ManagedObject* loader );
     static void gc_enumerate();
+    static void ClearMarkBits();
     static unsigned GetClassLoaderNumber() { return m_nextEntry; }
     static ClassLoader** GetClassLoaderTable() { return m_table; }
     static void DeleteClassLoaderTable(){
@@ -273,6 +276,7 @@
     NativeLibraryList m_nativeLibraries;
     Lock_Manager m_lock;
     Lock_Manager m_types_cache_lock;
+    bool m_markBit;
     void* m_verifyData;
     apr_pool_t* pool;
     PoolManager *CodeMemoryManager;

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/unloading.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/unloading.h?view=diff&rev=530111&r1=530110&r2=530111
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/unloading.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/unloading.h Wed Apr 18 11:08:18 2007
@@ -22,5 +22,6 @@
 #ifndef __UNLOADING_H__
 #define __UNLOADING_H__
 
+void class_unloading_clear_mark_bits();
 #endif
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp?view=diff&rev=530111&r1=530110&r2=530111
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp Wed Apr 18 11:08:18 2007
@@ -488,6 +488,21 @@
 }
 
 
+void ClassLoader::ClearMarkBits()
+{
+    TRACE2("classloader.unloading.clear", "Clearing mark bits");
+    LMAutoUnlock aulock( &(ClassLoader::m_tableLock) );
+    ClassTable::iterator cti;
+    for(unsigned i = 0; i < m_nextEntry; i++) {
+        TRACE2("classloader.unloading.debug", "  Clearing mark bits in classloader "
+            << m_table[i] << " (" << m_table[i]->m_loader << " : "
+            << m_table[i]->m_loader->vt_unsafe()->clss->get_name()->bytes << ") and its classes");
+        m_table[i]->m_markBit = 0;
+     }
+    TRACE2("classloader.unloading.clear", "Finished clearing mark bits");
+}
+
+
 ClassLoader* ClassLoader::AddClassLoader( ManagedObject* loader )
 {
     SuspendDisabledChecker sdc;
@@ -1001,6 +1016,9 @@
     return NULL;
 }
 
+void class_unloading_clear_mark_bits() {
+    ClassLoader::ClearMarkBits();
+}
 inline void
 BootstrapClassLoader::SetClasspathFromString(char* bcp,
                                                apr_pool_t* tmp_pool)

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp?view=diff&rev=530111&r1=530110&r2=530111
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/root_set_enum_common.cpp Wed Apr 18 11:08:18 2007
@@ -255,6 +255,24 @@
                 << "." << method_get_name(cci->get_method())
                 << method_get_descriptor(cci->get_method()));
             cci->get_jit()->get_root_set_from_stack_frame(cci->get_method(), 0, si_get_jit_context(si));
+            ClassLoader* cl = cci->get_method()->get_class()->get_class_loader();
+            assert (cl);
+            // force cl classloader to be enumerated as strong reference
+            cl->Mark();
+            if (cci->has_inline_info()) {
+                JIT *jit = cci->get_jit();
+                NativeCodePtr ip = si_get_ip(si);
+                uint32 inlined_depth = si_get_inline_depth(si);
+                uint32 offset = (POINTER_SIZE_INT)ip - (POINTER_SIZE_INT)cci->get_code_block_addr();
+                for (uint32 i = 0; i < inlined_depth; i++) {
+                    Method* m = jit->get_inlined_method(cci->get_inline_info(), offset, i);
+                    assert (m);
+                    cl = m->get_class()->get_class_loader();
+                    assert (cl);
+                    // force cl classloader to be enumerated as strong reference
+                    cl->Mark();
+                }
+            }
             TRACE2("enumeration", "enumerated eip=" << (void *) si_get_ip(si)
                 << " is_first=" << !si_get_jit_context(si)->is_ip_past
                 << " " << class_get_name(method_get_class(cci->get_method()))
@@ -268,6 +286,13 @@
                 << (m2n_get_method(si_get_m2n(si)) ? method_get_name(m2n_get_method(si_get_m2n(si))) : "")
                 << (m2n_get_method(si_get_m2n(si)) ? method_get_descriptor(m2n_get_method(si_get_m2n(si))) : ""));
             oh_enumerate_handles(m2n_get_local_handles(si_get_m2n(si)));
+            Method* m = m2n_get_method(si_get_m2n(si));
+            if (m) {
+                ClassLoader* cl = m->get_class()->get_class_loader();
+                assert (cl);
+                // force cl classloader to be enumerated as strong reference
+                cl->Mark();
+            }
         }
         si_goto_previous(si, false);
     }

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp?view=diff&rev=530111&r1=530110&r2=530111
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/gc/stop_the_world_root_set_enum.cpp Wed Apr 18 11:08:18 2007
@@ -98,6 +98,8 @@
 
     jvmti_send_gc_start_event();
 
+    class_unloading_clear_mark_bits();
+
     current_vm_thread = p_TLS_vmthread;
     // Run through list of active threads and enumerate each one of them.
     hythread_t tm_thread = hythread_iterator_next(&iterator);