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 2006/12/14 21:31:22 UTC

svn commit: r487342 - in /harmony/enhanced/drlvm/trunk/vm/vmcore: include/class_member.h src/class_support/Class.cpp src/class_support/classloader.cpp

Author: gshimansky
Date: Thu Dec 14 12:31:22 2006
New Revision: 487342

URL: http://svn.apache.org/viewvc?view=rev&rev=487342
Log:
Applied HARMONY-2541 [drlvm][jvmti] VM in OPT mode returns NULL values by GetThreadInfo if java.lang.Thread is instrumented by profiler

Tests passed on Ubuntu6 x86, WindowsXP and SuSE9 x86_64


Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h?view=diff&rev=487342&r1=487341&r2=487342
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h Thu Dec 14 12:31:22 2006
@@ -514,6 +514,12 @@
     void add_vtable_patch(void *);
     void apply_vtable_patches();
 
+    NativeCodePtr get_registered_native_func() 
+            { return _registered_native_func; }
+
+    void set_registered_native_func(NativeCodePtr native_func) 
+            { _registered_native_func = native_func; }
+
     /**
      * This returns a block for jitted code. It is not used for native methods.
      * It is safe to call this function from multiple threads.
@@ -587,6 +593,9 @@
     Method_Side_Effects _side_effects;
     Method_Signature *_method_sig;
 
+    /** set by JNI RegisterNatives() funcs */
+    NativeCodePtr _registered_native_func;
+
 public:
     Method();
     // destructor should be instead of this function, but it's not allowed to use it because copy for Method class is
@@ -607,11 +616,8 @@
     bool is_clinit()        {return _flags.is_clinit?true:false;}
     bool is_finalize()      {return _flags.is_finalize?true:false;}
     bool is_overridden()    {return _flags.is_overridden?true:false;}
-    bool is_registered()    {return _flags.is_registered?true:false;}
     Boolean  is_nop()       {return _flags.is_nop;}
 
-    void set_registered( bool flag ) { _flags.is_registered = flag; }
-
     unsigned get_index()    {return _index;}
 
     // Fake methods are interface methods inherited by an abstract class that are not (directly or indirectly)
@@ -665,7 +671,6 @@
         unsigned is_finalize    : 1;    // is finalize() method
         unsigned is_overridden  : 1;    // has this virtual method been overridden by a loaded subclass?
         unsigned is_nop         : 1;
-        unsigned is_registered  : 1;    // the method is registred native method
     } _flags;
 
     //

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class.cpp?view=diff&rev=487342&r1=487341&r2=487342
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class.cpp Thu Dec 14 12:31:22 2006
@@ -602,6 +602,7 @@
     _vtable_patch = 0;
 
     _code = NULL;
+    _registered_native_func = NULL;
 
     _state = ST_NotCompiled;
     _jits = NULL;
@@ -622,7 +623,6 @@
     _flags.is_overridden = 0;
     _flags.is_finalize = 0;
     _flags.is_nop = FALSE;
-    _flags.is_registered = 0;
 
     _line_number_table = NULL;
     _local_vars_table = NULL;
@@ -990,54 +990,50 @@
         const String *desc = pool.lookup(methods[index].signature);
 
         // find method from class
-        bool not_found = true;
+        Method *class_method = NULL;
+        bool found = false;
+
         for(int count = 0; count < klass->get_number_of_methods(); count++ ) {
-            Method *class_method = klass->get_method(count);
-            const String *method_name = class_method->get_name();
-            const String *method_desc = class_method->get_descriptor();
-            if( method_name == name && method_desc == desc )
-            {
-                // trace
-                TRACE2("class.native", "Register native method: "
-                    << klass->get_name()->bytes
-                    << "." << name->bytes << desc->bytes);
+            class_method = klass->get_method(count);
 
+            if( class_method->get_name() == name && 
+                    class_method->get_descriptor() == desc ) {
                 // found method
-                not_found = false;
-
-                // Calling callback for NativeMethodBind event
-                NativeCodePtr native_addr = methods[index].fnPtr;
-
-                jvmti_process_native_method_bind_event( (jmethodID) class_method, native_addr, &native_addr);
-
-                if (interpreter_enabled()) {
-                    //lock class
-                    klass->lock();
-                    class_method->set_code_addr( native_addr );
-                    class_method->set_registered( true );
-                    klass->unlock();
-                } else {
-                    NativeCodePtr stub = compile_create_lil_jni_stub(class_method, native_addr, NULL);
-                    if (!stub)
-                        return true;
-
-                    class_method->lock();
-                    class_method->set_code_addr(stub);
-                    class_method->unlock();
-
-                    // the following lines were copy-pasted from compile_do_compilation() function
-                    // it is not obvious that they should be here.
-                    //compile_flush_generated_code();
-                    //class_method->set_state(Method::ST_Compiled);
-                    //class_method->do_jit_recompiled_method_callbacks();
-
-                    class_method->apply_vtable_patches();
-                }
-
+                found = true;
                 break;
             }
         }
-        if( not_found ) {
+
+        if (found) {
+            TRACE2("class.native", "Register native method: "
+                << klass->get_name()->bytes
+                << "." << name->bytes << desc->bytes);
+
+            // Calling callback for NativeMethodBind event
+            NativeCodePtr native_addr = methods[index].fnPtr;
+
+            jvmti_process_native_method_bind_event( (jmethodID) class_method, native_addr, &native_addr);
+
+            if (! interpreter_enabled()) {
+                NativeCodePtr stub = compile_create_lil_jni_stub(class_method, native_addr, NULL);
+                if (!stub)
+                    return true;
+
+                class_method->lock();
+                class_method->set_code_addr(stub);
+                class_method->unlock();
+
+                // the following lines were copy-pasted from compile_do_compilation() function
+                // it is not obvious that they should be here.
+                compile_flush_generated_code();
+                //class_method->set_state(Method::ST_Compiled);
+                //class_method->do_jit_recompiled_method_callbacks();
+
+                class_method->apply_vtable_patches();
+            }
+
+            class_method->set_registered_native_func(native_addr);
+        } else {
             // create error string "<class_name>.<method_name><method_descriptor>
             int clen = klass->get_name()->len;
             int mlen = name->len;
@@ -1050,7 +1046,6 @@
             memcpy(error + clen + 1 + mlen, desc->bytes, dlen);
             error[len] = '\0';
 
-            // trace
             TRACE2("class.native", "Native could not be registered: "
                 << klass->get_name()->bytes << "." << name->bytes << desc->bytes);
 
@@ -1071,14 +1066,14 @@
     klass->lock();
     for(int count = 0; count < klass->get_number_of_methods(); count++ ) {
         Method* method = klass->get_method(count);
-        if( method->is_registered() ) {
+        if (NULL != method->get_registered_native_func()) {
             // trace
             TRACE2("class.native", "Unregister native method: "
                 << klass->get_name() << "." << method->get_name()->bytes
                 << method->get_descriptor()->bytes);
 
-            // reset registered flag
-            method->set_registered(false);
+            // reset registered_native_func
+            method->set_registered_native_func(NULL);
         }
     }
     // unlock class

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=487342&r1=487341&r2=487342
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/classloader.cpp Thu Dec 14 12:31:22 2006
@@ -1048,8 +1048,8 @@
         << method_name->bytes << method_desc->bytes);
 
     // return if method is already registered
-    if( method->is_registered() ) {
-        return (GenericFunctionPointer)method->get_code_addr();
+    if (NULL != method->get_registered_native_func()) {
+        return (GenericFunctionPointer) method->get_registered_native_func();
     }
     
     // find throughout all the libraries