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/02/09 16:53:45 UTC

svn commit: r505334 - in /harmony/enhanced/drlvm/trunk: src/test/regression/H3074/ vm/vmcore/include/ vm/vmcore/src/class_support/ vm/vmcore/src/jni/

Author: gshimansky
Date: Fri Feb  9 07:53:45 2007
New Revision: 505334

URL: http://svn.apache.org/viewvc?view=rev&rev=505334
Log:
Applied HARMONY-3074 [drlvm][classloader][jni] When FindClass is called from JNI_OnLoad function it cannot load user application classes

Also added regression test for this bug.

Tests passed on Ubuntu6 x86, Windows 2003 server x86 and SuSE9 x86_64


Added:
    harmony/enhanced/drlvm/trunk/src/test/regression/H3074/
    harmony/enhanced/drlvm/trunk/src/test/regression/H3074/AnotherClass.java   (with props)
    harmony/enhanced/drlvm/trunk/src/test/regression/H3074/Test.java   (with props)
    harmony/enhanced/drlvm/trunk/src/test/regression/H3074/natives.cpp   (with props)
    harmony/enhanced/drlvm/trunk/src/test/regression/H3074/run.test.xml   (with props)
Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_utils.cpp

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3074/AnotherClass.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3074/AnotherClass.java?view=auto&rev=505334
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3074/AnotherClass.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3074/AnotherClass.java Fri Feb  9 07:53:45 2007
@@ -0,0 +1,11 @@
+package org.apache.harmony.drlvm.tests.regression.h3074;
+
+public class AnotherClass {
+    public static boolean status = false;
+
+    public static void method() {
+        System.out.println("Class was loaded with " +
+            AnotherClass.class.getClassLoader());
+        status = true;
+    }
+}

Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H3074/AnotherClass.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3074/Test.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3074/Test.java?view=auto&rev=505334
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3074/Test.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3074/Test.java Fri Feb  9 07:53:45 2007
@@ -0,0 +1,16 @@
+package org.apache.harmony.drlvm.tests.regression.h3074;
+
+import junit.framework.TestCase;
+
+public class Test extends TestCase {
+    public void test() {
+        System.out.println("Test is loaded with " + Test.class.getClassLoader());
+        try {
+            System.loadLibrary("natives");
+        } catch (Throwable e) {
+            System.out.println("Test failed on exception:");
+            e.printStackTrace();
+        }
+        assertTrue(AnotherClass.status);
+    }
+}

Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H3074/Test.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3074/natives.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3074/natives.cpp?view=auto&rev=505334
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3074/natives.cpp (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3074/natives.cpp Fri Feb  9 07:53:45 2007
@@ -0,0 +1,35 @@
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C" jint JNIEXPORT JNICALL JNI_OnLoad(JavaVM *vm, void *reserved);
+#endif
+
+jint JNIEXPORT JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
+{
+    JNIEnv *env;
+    jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_4);
+    if (status != JNI_OK)
+    {
+        printf("Could not get JNIenv\n");
+        return 0;
+    }
+
+    jclass cl = env->FindClass("org/apache/harmony/drlvm/tests/regression/h3074/AnotherClass");
+    if (NULL == cl)
+    {
+        printf("Failed to load class:\n");
+        env->ExceptionDescribe();
+        return 0;
+    }
+
+    jmethodID mid = env->GetStaticMethodID(cl, "method", "()V");
+    if (NULL == mid)
+    {
+        printf("Failed to get method ID:\n");
+        env->ExceptionDescribe();
+        return 0;
+    }
+
+    env->CallStaticVoidMethod(cl, mid);
+    return JNI_VERSION_1_4;
+}

Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H3074/natives.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3074/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3074/run.test.xml?view=auto&rev=505334
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3074/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3074/run.test.xml Fri Feb  9 07:53:45 2007
@@ -0,0 +1,11 @@
+<project name="RUN HARMONY-3074 Regression Test">
+    <target name="run-test">
+        <run-junit-test 
+            test="org.apache.harmony.drlvm.tests.regression.h3074.Test">
+            <junit-element>
+              <sysproperty key="java.library.path" value="${reg.test.native.path}/H3074"/>
+            </junit-element>
+        </run-junit-test>
+    </target>
+</project>
+

Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H3074/run.test.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h?view=diff&rev=505334&r1=505333&r2=505334
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/vm_threads.h Fri Feb  9 07:53:45 2007
@@ -81,6 +81,11 @@
      */
     JNIEnv_Internal * jni_env;
 
+    /**
+     * Class loader which loads native library and calls to its JNI_OnLoad
+     */
+    ClassLoader* onload_caller;
+
     // In case exception is thrown, Exception object is put here
     // TODO: Needs to be replaced with jobject!
     //volatile ManagedObject*           p_exception_object;
@@ -133,8 +138,7 @@
     //gc_enable_disable_state           gc_enabled_status;
     bool                              gc_wait_for_enumeration;
     bool                              restore_context_after_gc_and_resume;
-    
-    
+
 #if defined(PLATFORM_POSIX) && defined(_IPF_)
     // Linux/IPF
     sem_t                             suspend_sem;     // To suspend thread in signal handler

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=505334&r1=505333&r2=505334
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp Fri Feb  9 07:53:45 2007
@@ -968,15 +968,14 @@
     apr_pool_t* tmp_pool;
     apr_status_t stat = apr_pool_create(&tmp_pool, this->pool);
     // FIXME: process failure properly
-    
-   //
-   // $$$ GMJ - we don't want it to be where we're running from, but
-   //    where everything else came from.  For now, let it be
-   //    so that apr_dso_load() will do the right thing.  This is
-   //    going to be weird, because we have native code in both
-   //    / as well as /default...  FIXME
-   //
-   // const char* canoname = port_filepath_canonical(name, tmp_pool); 
+
+    // $$$ GMJ - we don't want it to be where we're running from, but
+    //    where everything else came from.  For now, let it be
+    //    so that apr_dso_load() will do the right thing.  This is
+    //    going to be weird, because we have native code in both
+    //    / as well as /default...  FIXME
+    //
+    // const char* canoname = port_filepath_canonical(name, tmp_pool); 
 
     const char *canoname = name;
     
@@ -1006,7 +1005,10 @@
     // load native library
     bool just_loaded;
     NativeLoadStatus status;
+    // FIXME: add storing class loader here
+    p_TLS_vmthread->onload_caller = this;
     NativeLibraryHandle handle = natives_load_library(lib_name->bytes, &just_loaded, &status);
+    p_TLS_vmthread->onload_caller = NULL;
     if( !handle || !just_loaded ) {
         // create error message
         char apr_error_message[1024];

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_utils.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_utils.cpp?view=diff&rev=505334&r1=505333&r2=505334
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_utils.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_utils.cpp Fri Feb  9 07:53:45 2007
@@ -676,12 +676,14 @@
     assert(hythread_is_suspend_enabled());
     // Determine loader
     StackTraceFrame stf;
-    bool res = st_get_frame(0, &stf);
-    ClassLoader* loader;
-    if (res)
-        loader = (ClassLoader*)class_get_class_loader(method_get_class(stf.method));
-    else
-        loader = env->vm->vm_env->system_class_loader;
+    ClassLoader* loader = p_TLS_vmthread->onload_caller;
+    if(loader == NULL) {
+        bool res = st_get_frame(0, &stf);
+        if (res)
+            loader = (ClassLoader*)class_get_class_loader(method_get_class(stf.method));
+        else
+            loader = env->vm->vm_env->system_class_loader;
+    }
     String *s = name;
     Class* clss =
         class_load_verify_prepare_by_loader_jni(VM_Global_State::loader_env, s, loader);