You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/11/04 15:10:27 UTC

svn commit: r471196 - in /incubator/harmony/enhanced/drlvm/trunk/vm/vmcore: include/version_svn_tag.h src/kernel_classes/native/java_lang_VMClassRegistry.cpp

Author: geirm
Date: Sat Nov  4 06:10:26 2006
New Revision: 471196

URL: http://svn.apache.org/viewvc?view=rev&rev=471196
Log:
HARMONY-1833

[DRLVM] deadlock during finalization

Tested on Ubuntu 6 - smoke, c-unit, ~kernel

Please re-verify that bug has gone away.


Modified:
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/version_svn_tag.h
    incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/version_svn_tag.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/version_svn_tag.h?view=diff&rev=471196&r1=471195&r2=471196
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/version_svn_tag.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/include/version_svn_tag.h Sat Nov  4 06:10:26 2006
@@ -18,6 +18,6 @@
 #ifndef _VERSION_SVN_TAG_
 #define _VERSION_SVN_TAG_
 
-#define VERSION_SVN_TAG  "470869"
+#define VERSION_SVN_TAG  "471166"
 
 #endif // _VERSION_SVN_TAG_

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp?view=diff&rev=471196&r1=471195&r2=471196
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp Sat Nov  4 06:10:26 2006
@@ -370,10 +370,27 @@
     ClassLoader* cl = static_cast<ClassLoader*>
         (genv->bootstrap_class_loader);
     Package_Table* ptab = cl->getPackageTable();
-    if (ptab->size() == (unsigned)len) 
+    cl->Lock();
+    unsigned p_num = ptab->size();
+    if (p_num == (unsigned)len) 
     {
+        cl->Unlock();
         return NULL;
     }
+    const char ** pkgs = (const char **)STD_MALLOC(p_num * 2 * sizeof(char*));
+    size_t buf_len = 0;
+    unsigned index = 0;
+    for (Package_Table::const_iterator it = ptab->begin(), end = ptab->end(); 
+        it != end; ++it)
+    {
+        const char* name = pkgs[index++] = (*it).first->bytes;
+        pkgs[index++] = (*it).second->get_jar();
+        size_t name_len = (*it).first->len;
+        if (name_len > buf_len) {
+            buf_len = name_len;
+        }
+    }
+    cl->Unlock();
 
     jclass string_class = struct_Class_to_java_lang_Class_Handle(genv->JavaLangString_Class);
     static Class* aos = genv->LoadCoreClass(genv->string_pool.lookup("[Ljava/lang/String;"));
@@ -381,38 +398,44 @@
     assert(string_class);
     assert(string_array_class);
         
-    apr_pool_t* pool;
-    apr_pool_create(&pool, NULL);
-    unsigned index = 0;
-
-    cl->Lock();
-    jobjectArray result = NewObjectArray(jenv, ptab->size(), string_array_class, NULL);
-    assert(result);
-
-    for (Package_Table::const_iterator it = ptab->begin(), end = ptab->end(); 
-        it != end; ++it, ++index)
+    jobjectArray result = NewObjectArray(jenv, p_num, string_array_class, NULL);
+    if (result) 
     {
-        jobjectArray pair = NewObjectArray(jenv, 2, string_class, NULL);
-        assert(pair);
-        
-        char* name = apr_pstrdup(pool, (*it).first->bytes);
-        for (char* c = name; *c != '\0'; ++c) {
-            if (*c == '/') {
-                *c = '.';
+        char* buf = (char*)STD_MALLOC(buf_len + 1);
+        p_num *= 2;
+        for (index = 0; index < p_num; )
+        {
+            jobjectArray pair = NewObjectArray(jenv, 2, string_class, NULL);
+            if (!pair) {
+                break;
             }
-        }
-        SetObjectArrayElement(jenv, pair, 0, NewStringUTF(jenv, name));
+            SetObjectArrayElement(jenv, result, index/2, pair);
+
+            char* name = strcpy(buf, pkgs[index++]);
+            for (char* c = name; *c != '\0'; ++c) {
+                if (*c == '/') {
+                    *c = '.';
+                }
+            }
+            jstring jname = NewStringUTF(jenv, name);
+            if (!jname) {
+                break;
+            }
+            SetObjectArrayElement(jenv, pair, 0, jname);
 
-        const char * jar = (*it).second->get_jar();
-        if (jar) {
-            SetObjectArrayElement(jenv, pair, 1, NewStringUTF(jenv, jar));
+            const char * jar = pkgs[index++];
+            if (jar) {
+                jstring js = NewStringUTF(jenv, jar);
+                if (!js) break;
+                SetObjectArrayElement(jenv, pair, 1, js);
+            }
         }
-        
-        SetObjectArrayElement(jenv, result, index, pair);
+        STD_FREE(buf);
     }
-    cl->Unlock();
-    apr_pool_destroy(pool);
 
+    STD_FREE(pkgs);
+    
+    assert(result || exn_raised());
     return result;
 }