Mercurial > hg > truffle
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);