changeset 1478:5571b97fc1ec

More JNI global handle clean ups.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Fri, 26 Nov 2010 19:45:05 +0100
parents 30e1f67703da
children 71cd4b9610eb
files c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java c1x4hotspotsrc/hotspot/hotspot jtt.launch src/share/vm/ci/ciEnv.cpp src/share/vm/ci/ciInstanceKlass.cpp src/share/vm/ci/ciInstanceKlass.hpp src/share/vm/ci/ciObject.cpp src/share/vm/ci/ciObject.hpp src/share/vm/ci/ciObjectFactory.cpp src/share/vm/ci/ciObjectFactory.hpp src/share/vm/compiler/compileBroker.cpp
diffstat 10 files changed, 65 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java	Fri Nov 26 13:52:15 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java	Fri Nov 26 19:45:05 2010 +0100
@@ -372,13 +372,13 @@
                 return asm.finishTemplate("putfield<" + kind + ">");
             }
             XirParameter fieldOffset = asm.createConstantInputParameter("fieldOffset", CiKind.Int);
+            if (kind == CiKind.Object) {
+                verifyPointer(asm, value);
+            }
             if (is(NULL_CHECK, flags)) {
                 asm.nop(1);
                 asm.mark(MARK_IMPLICIT_NULL);
             }
-            if (kind == CiKind.Object) {
-                verifyPointer(asm, value);
-            }
             asm.pstore(kind, object, fieldOffset, value, is(NULL_CHECK, flags));
             if (is(WRITE_BARRIER, flags)) {
                 XirOperand temp = asm.createTemp("temp", CiKind.Word);
--- a/c1x4hotspotsrc/hotspot/hotspot jtt.launch	Fri Nov 26 13:52:15 2010 +0100
+++ b/c1x4hotspotsrc/hotspot/hotspot jtt.launch	Fri Nov 26 19:45:05 2010 +0100
@@ -1,7 +1,20 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
+<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
+<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
+<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
+<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
+<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
+<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
+<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
+<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
 <intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
 <stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
+<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
+<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
+<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
+<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
 <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-client -XX:+UseC1X -Xcomp -XX:CompileOnly=jtt -XX:+PrintCompilation -Xbootclasspath/p:${workspace_loc:hotspot}/../../../maxine/C1X/bin:${workspace_loc:hotspot}/../../../maxine/CRI/bin:${workspace_loc:hotspot}/../../../maxine/Base/bin:${workspace_loc:hotspot}/../../../maxine/Assembler/bin:${workspace_loc:hotspot}/../HotSpotVM/bin -classpath ${workspace_loc:hotspot}/../../../maxine/VM/bin:${workspace_loc:hotspot}/../HotSpotTest/bin -C1X:+PrintCompilation JavaTester"/>
 <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="java"/>
 <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="hotspot"/>
--- a/src/share/vm/ci/ciEnv.cpp	Fri Nov 26 13:52:15 2010 +0100
+++ b/src/share/vm/ci/ciEnv.cpp	Fri Nov 26 19:45:05 2010 +0100
@@ -165,6 +165,7 @@
 }
 
 ciEnv::~ciEnv() {
+  _factory->cleanup();
   CompilerThread* current_thread = CompilerThread::current();
   current_thread->set_env(NULL);
 }
--- a/src/share/vm/ci/ciInstanceKlass.cpp	Fri Nov 26 13:52:15 2010 +0100
+++ b/src/share/vm/ci/ciInstanceKlass.cpp	Fri Nov 26 19:45:05 2010 +0100
@@ -66,7 +66,7 @@
     Handle h_protection_domain(thread, ik->protection_domain());
     _loader = JNIHandles::make_global(h_loader);
     _protection_domain = JNIHandles::make_global(h_protection_domain);
-    _is_shared = true;
+    _is_shared = !ciObjectFactory::is_initialized();
   }
 
   // Lazy fields get filled in only upon request.
--- a/src/share/vm/ci/ciInstanceKlass.hpp	Fri Nov 26 13:52:15 2010 +0100
+++ b/src/share/vm/ci/ciInstanceKlass.hpp	Fri Nov 26 19:45:05 2010 +0100
@@ -63,6 +63,19 @@
 
   GrowableArray<ciField*>* _non_static_fields;
 
+public:
+  virtual void cleanup() {
+    ciObject::cleanup();
+    if (!_is_shared) {
+      if (JNIHandles::is_global_handle(_loader)) {
+        JNIHandles::destroy_global(_loader);
+      }
+      if (JNIHandles::is_global_handle(_protection_domain)) {
+        JNIHandles::destroy_global(_protection_domain);
+      }
+    }
+  }
+
 protected:
   ciInstanceKlass(KlassHandle h_k);
   ciInstanceKlass(ciSymbol* name, jobject loader, jobject protection_domain);
--- a/src/share/vm/ci/ciObject.cpp	Fri Nov 26 13:52:15 2010 +0100
+++ b/src/share/vm/ci/ciObject.cpp	Fri Nov 26 19:45:05 2010 +0100
@@ -48,14 +48,20 @@
 // ciObject::ciObject
 ciObject::ciObject(oop o) {
   ASSERT_IN_VM;
-  if (ciObjectFactory::is_initialized() && !UseC1X) {
-    _handle = JNIHandles::make_local(o);
+  if (ciObjectFactory::is_initialized()) {
+    if (UseC1X) {
+      _handle = JNIHandles::make_global(o);
+      _temp_global = true;
+    } else {
+      _handle = JNIHandles::make_local(o);
+    }
   } else {
     _handle = JNIHandles::make_global(o);
   }
   _klass = NULL;
   _ident = 0;
   init_flags_from(o);
+  _temp_global = false;
 }
 
 // ------------------------------------------------------------------
@@ -63,14 +69,20 @@
 //
 ciObject::ciObject(Handle h) {
   ASSERT_IN_VM;
-  if (ciObjectFactory::is_initialized() && !UseC1X) {
-    _handle = JNIHandles::make_local(h());
+  if (ciObjectFactory::is_initialized()) {
+    if (UseC1X) {
+      _handle = JNIHandles::make_global(h);
+      _temp_global = true;
+    } else {
+      _handle = JNIHandles::make_local(h());
+    }
   } else {
     _handle = JNIHandles::make_global(h);
   }
   _klass = NULL;
   _ident = 0;
   init_flags_from(h());
+  _temp_global = false;
 }
 
 // ------------------------------------------------------------------
@@ -84,6 +96,7 @@
   _handle = NULL;
   _klass = klass;
   _ident = 0;
+  _temp_global = false;
 }
 
 // ------------------------------------------------------------------
@@ -95,6 +108,7 @@
   _handle = NULL;
   _klass = NULL;
   _ident = 0;
+  _temp_global = false;
 }
 
 // ------------------------------------------------------------------
--- a/src/share/vm/ci/ciObject.hpp	Fri Nov 26 13:52:15 2010 +0100
+++ b/src/share/vm/ci/ciObject.hpp	Fri Nov 26 19:45:05 2010 +0100
@@ -50,6 +50,7 @@
   jobject  _handle;
   ciKlass* _klass;
   uint     _ident;
+  bool     _temp_global;
 
   enum { FLAG_BITS   = 2 };
   enum {
@@ -63,6 +64,11 @@
   ciObject(ciKlass* klass);
 
 public:
+  virtual void cleanup() {
+    if (_temp_global && _handle != NULL && JNIHandles::is_global_handle(_handle)) {
+      JNIHandles::destroy_global(_handle);
+    }
+  }
   jobject      handle()  const { return _handle; }
   // Get the VM oop that this object holds.
   oop get_oop() const {
--- a/src/share/vm/ci/ciObjectFactory.cpp	Fri Nov 26 13:52:15 2010 +0100
+++ b/src/share/vm/ci/ciObjectFactory.cpp	Fri Nov 26 19:45:05 2010 +0100
@@ -74,6 +74,14 @@
     new (arena) GrowableArray<ciReturnAddress*>(arena, 8, 0, NULL);
 }
 
+void ciObjectFactory::cleanup() {
+  int start = 0;
+  if (_shared_ci_objects != NULL) start = _shared_ci_objects->length();
+  for (int i = start; i < _ci_objects->length(); ++i) {
+    _ci_objects->at(i)->cleanup();
+  }
+}
+
 // ------------------------------------------------------------------
 // ciObjectFactory::ciObjectFactory
 void ciObjectFactory::initialize() {
--- a/src/share/vm/ci/ciObjectFactory.hpp	Fri Nov 26 13:52:15 2010 +0100
+++ b/src/share/vm/ci/ciObjectFactory.hpp	Fri Nov 26 19:45:05 2010 +0100
@@ -81,6 +81,7 @@
 
   ciObjectFactory(Arena* arena, int expected_size);
 
+  void cleanup();
 
   // Get the ciObject corresponding to some oop.
   ciObject* get(oop key);
--- a/src/share/vm/compiler/compileBroker.cpp	Fri Nov 26 13:52:15 2010 +0100
+++ b/src/share/vm/compiler/compileBroker.cpp	Fri Nov 26 19:45:05 2010 +0100
@@ -1616,7 +1616,7 @@
     }
 
 	// (tw) Check if we may do this?
-    //NoHandleMark  nhm;
+    // NoHandleMark  nhm;
     ThreadToNativeFromVM ttn(thread);
 
     ciEnv ci_env(task, system_dictionary_modification_counter);