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/12/11 13:49:14 UTC

svn commit: r603228 - /harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_class.cpp

Author: gshimansky
Date: Tue Dec 11 04:49:13 2007
New Revision: 603228

URL: http://svn.apache.org/viewvc?rev=603228&view=rev
Log:
Fixed bug HARMONY-5287
[drlvm][jvmti] Lack of synchronization in GetLoadedClasses and GetClassLoaderClasses may cause VM to crash

Patch adds synchronization to lock all classloaders until the table of
reported classes is filled up.


Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_class.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_class.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_class.cpp?rev=603228&r1=603227&r2=603228&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_class.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_class.cpp Tue Dec 11 04:49:13 2007
@@ -101,6 +101,7 @@
     unsigned int cl_count;
     jvmtiError errorCode;
     ClassLoader* classloader;
+    ClassLoader *bootstrap;
 
     /*
      * Check given env & current phase.
@@ -114,11 +115,13 @@
         return JVMTI_ERROR_NULL_POINTER;
     }
 
+    ClassLoader::LockLoadersTable();
     /**
      * Get the number of loaded classes by bootstrap loader
      */
-    ClassTable* tbl =
-        VM_Global_State::loader_env->bootstrap_class_loader->GetLoadedClasses();
+    bootstrap = VM_Global_State::loader_env->bootstrap_class_loader;
+    bootstrap->Lock();
+    ClassTable* tbl = bootstrap->GetLoadedClasses();
     count = tbl->GetItemCount();
 
     /**
@@ -128,6 +131,7 @@
     for( index = 0; index < cl_count; index++ )
     {
         classloader = (ClassLoader::GetClassLoaderTable())[index];
+        classloader->Lock();
         tbl = classloader->GetLoadedClasses();
         ClassTable::iterator it;
         for(it = tbl->begin(); it != tbl->end(); it++)
@@ -146,6 +150,14 @@
      */
     if (!count)
     {
+        for(index = 0; index < cl_count; index++)
+        {
+            classloader = (ClassLoader::GetClassLoaderTable())[index];
+            classloader->Unlock();
+        }
+        bootstrap->Unlock();
+        ClassLoader::UnlockLoadersTable();
+
         *classes = NULL;
         *classes_num = 0;
         return JVMTI_ERROR_NONE;
@@ -156,6 +168,13 @@
      */
     errorCode = _allocate( (sizeof(jclass) * count), (unsigned char**) classes );
     if (errorCode != JVMTI_ERROR_NONE) {
+        for(index = 0; index < cl_count; index++)
+        {
+            classloader = (ClassLoader::GetClassLoaderTable())[index];
+            classloader->Unlock();
+        }
+        bootstrap->Unlock();
+        ClassLoader::UnlockLoadersTable();
         return errorCode;
     }
 
@@ -187,6 +206,7 @@
             (*classes)[number++] = (jclass)new_handle;
         }
 
+        classloader->Unlock();
         /**
          * Get next class loader
          */
@@ -198,6 +218,7 @@
     } while( true );
     assert( number == count );
 
+    ClassLoader::UnlockLoadersTable();
     /**
      * Set class number
      */
@@ -246,11 +267,13 @@
         classloader = ClassLoader::FindByObject((((ObjectHandle)initiating_loader)->object));
     }
 
+    classloader->Lock();
     /**
      * Get the number of loaded classes
      */
     tbl = classloader->GetInitiatedClasses();
     if( !(count = tbl->GetItemCount()) ) {
+        classloader->Unlock();
         // no loaded classes
         *classes_ptr = NULL;
         *class_count_ptr = 0;
@@ -262,6 +285,7 @@
      */
     errorCode = _allocate( (sizeof(jclass) * count), (unsigned char**)classes_ptr );
     if (errorCode != JVMTI_ERROR_NONE) {
+        classloader->Unlock();
         return errorCode;
     }
 
@@ -281,6 +305,7 @@
     }
     assert( index == count );
 
+    classloader->Unlock();
     /**
      * Set class number
      */