< prev index next >
src/hotspot/share/jvmci/jvmci.cpp
Print this page
*** 27,42 ****
#include "gc/shared/oopStorage.inline.hpp"
#include "jvmci/jvmci.hpp"
#include "jvmci/jvmci_globals.hpp"
#include "jvmci/jvmciJavaClasses.hpp"
#include "jvmci/jvmciRuntime.hpp"
! #include "jvmci/metadataHandleBlock.hpp"
- OopStorage* JVMCI::_object_handles = NULL;
- MetadataHandleBlock* JVMCI::_metadata_handles = NULL;
JVMCIRuntime* JVMCI::_compiler_runtime = NULL;
JVMCIRuntime* JVMCI::_java_runtime = NULL;
bool JVMCI::can_initialize_JVMCI() {
// Initializing JVMCI requires the module system to be initialized past phase 3.
// The JVMCI API itself isn't available until phase 2 and ServiceLoader (which
// JVMCI initialization requires) isn't usable until after phase 3. Testing
--- 27,45 ----
#include "gc/shared/oopStorage.inline.hpp"
#include "jvmci/jvmci.hpp"
#include "jvmci/jvmci_globals.hpp"
#include "jvmci/jvmciJavaClasses.hpp"
#include "jvmci/jvmciRuntime.hpp"
! #include "jvmci/metadataHandles.hpp"
! #include "memory/resourceArea.hpp"
JVMCIRuntime* JVMCI::_compiler_runtime = NULL;
JVMCIRuntime* JVMCI::_java_runtime = NULL;
+ volatile bool JVMCI::_is_initialized = false;
+ void* JVMCI::_shared_library_handle = NULL;
+ char* JVMCI::_shared_library_path = NULL;
+ volatile bool JVMCI::_in_shutdown = false;
bool JVMCI::can_initialize_JVMCI() {
// Initializing JVMCI requires the module system to be initialized past phase 3.
// The JVMCI API itself isn't available until phase 2 and ServiceLoader (which
// JVMCI initialization requires) isn't usable until after phase 3. Testing
*** 46,159 ****
}
assert(Universe::is_module_initialized(), "must be");
return true;
}
void JVMCI::initialize_compiler(TRAPS) {
if (JVMCILibDumpJNIConfig) {
JNIJVMCI::initialize_ids(NULL);
ShouldNotReachHere();
}
JVMCI::compiler_runtime()->call_getCompiler(CHECK);
}
void JVMCI::initialize_globals() {
- _object_handles = new OopStorage("JVMCI Global Oop Handles",
- JVMCIGlobalAlloc_lock,
- JVMCIGlobalActive_lock);
- _metadata_handles = MetadataHandleBlock::allocate_block();
if (UseJVMCINativeLibrary) {
// There are two runtimes.
! _compiler_runtime = new JVMCIRuntime();
! _java_runtime = new JVMCIRuntime();
} else {
// There is only a single runtime
! _java_runtime = _compiler_runtime = new JVMCIRuntime();
! }
! }
!
! OopStorage* JVMCI::object_handles() {
! assert(_object_handles != NULL, "Uninitialized");
! return _object_handles;
! }
!
! jobject JVMCI::make_global(const Handle& obj) {
! assert(!Universe::heap()->is_gc_active(), "can't extend the root set during GC");
! assert(oopDesc::is_oop(obj()), "not an oop");
! oop* ptr = object_handles()->allocate();
! jobject res = NULL;
! if (ptr != NULL) {
! assert(*ptr == NULL, "invariant");
! NativeAccess<>::oop_store(ptr, obj());
! res = reinterpret_cast<jobject>(ptr);
! } else {
! vm_exit_out_of_memory(sizeof(oop), OOM_MALLOC_ERROR,
! "Cannot create JVMCI oop handle");
}
- return res;
- }
-
- void JVMCI::destroy_global(jobject handle) {
- // Assert before nulling out, for better debugging.
- assert(is_global_handle(handle), "precondition");
- oop* oop_ptr = reinterpret_cast<oop*>(handle);
- NativeAccess<>::oop_store(oop_ptr, (oop)NULL);
- object_handles()->release(oop_ptr);
- }
-
- bool JVMCI::is_global_handle(jobject handle) {
- const oop* ptr = reinterpret_cast<oop*>(handle);
- return object_handles()->allocation_status(ptr) == OopStorage::ALLOCATED_ENTRY;
- }
-
- jmetadata JVMCI::allocate_handle(const methodHandle& handle) {
- assert(_metadata_handles != NULL, "uninitialized");
- MutexLocker ml(JVMCI_lock);
- return _metadata_handles->allocate_handle(handle);
- }
-
- jmetadata JVMCI::allocate_handle(const constantPoolHandle& handle) {
- assert(_metadata_handles != NULL, "uninitialized");
- MutexLocker ml(JVMCI_lock);
- return _metadata_handles->allocate_handle(handle);
- }
-
- void JVMCI::release_handle(jmetadata handle) {
- MutexLocker ml(JVMCI_lock);
- _metadata_handles->chain_free_list(handle);
}
void JVMCI::oops_do(OopClosure* f) {
! if (_object_handles != NULL) {
! _object_handles->oops_do(f);
}
}
void JVMCI::metadata_do(void f(Metadata*)) {
! if (_metadata_handles != NULL) {
! _metadata_handles->metadata_do(f);
}
}
void JVMCI::do_unloading(bool unloading_occurred) {
! if (_metadata_handles != NULL && unloading_occurred) {
! _metadata_handles->do_unloading();
}
}
bool JVMCI::is_compiler_initialized() {
! return compiler_runtime()->is_HotSpotJVMCIRuntime_initialized();
}
void JVMCI::shutdown() {
if (compiler_runtime() != NULL) {
compiler_runtime()->shutdown();
}
}
! bool JVMCI::shutdown_called() {
! if (compiler_runtime() != NULL) {
! return compiler_runtime()->shutdown_called();
! }
! return false;
}
--- 49,159 ----
}
assert(Universe::is_module_initialized(), "must be");
return true;
}
+ void* JVMCI::get_shared_library(char*& path, bool load) {
+ void* sl_handle = _shared_library_handle;
+ if (sl_handle != NULL || !load) {
+ path = _shared_library_path;
+ return sl_handle;
+ }
+ assert(JVMCI_lock->owner() == Thread::current(), "must be");
+ path = NULL;
+ if (_shared_library_handle == NULL) {
+ char path[JVM_MAXPATHLEN];
+ char ebuf[1024];
+ if (JVMCILibPath != NULL) {
+ if (!os::dll_locate_lib(path, sizeof(path), JVMCILibPath, JVMCI_SHARED_LIBRARY_NAME)) {
+ vm_exit_during_initialization("Unable to locate JVMCI shared library in path specified by -XX:JVMCILibPath value", JVMCILibPath);
+ }
+ } else {
+ if (!os::dll_locate_lib(path, sizeof(path), Arguments::get_dll_dir(), JVMCI_SHARED_LIBRARY_NAME)) {
+ vm_exit_during_initialization("Unable to create path to JVMCI shared library");
+ }
+ }
+
+ void* handle = os::dll_load(path, ebuf, sizeof ebuf);
+ if (handle == NULL) {
+ vm_exit_during_initialization("Unable to load JVMCI shared library", ebuf);
+ }
+ _shared_library_handle = handle;
+ _shared_library_path = strdup(path);
+
+ TRACE_jvmci_1("loaded JVMCI shared library from %s", path);
+ }
+ path = _shared_library_path;
+ return _shared_library_handle;
+ }
+
void JVMCI::initialize_compiler(TRAPS) {
if (JVMCILibDumpJNIConfig) {
JNIJVMCI::initialize_ids(NULL);
ShouldNotReachHere();
}
JVMCI::compiler_runtime()->call_getCompiler(CHECK);
}
void JVMCI::initialize_globals() {
if (UseJVMCINativeLibrary) {
// There are two runtimes.
! _compiler_runtime = new JVMCIRuntime(0);
! _java_runtime = new JVMCIRuntime(-1);
} else {
// There is only a single runtime
! _java_runtime = _compiler_runtime = new JVMCIRuntime(0);
}
}
void JVMCI::oops_do(OopClosure* f) {
! if (_java_runtime != NULL) {
! _java_runtime->_object_handles->oops_do(f);
! }
! if (_compiler_runtime != NULL && _compiler_runtime != _java_runtime) {
! _compiler_runtime->_object_handles->oops_do(f);
}
}
void JVMCI::metadata_do(void f(Metadata*)) {
! if (_java_runtime != NULL) {
! _java_runtime->_metadata_handles->metadata_do(f);
! }
! if (_compiler_runtime != NULL && _compiler_runtime != _java_runtime) {
! _compiler_runtime->_metadata_handles->metadata_do(f);
}
}
void JVMCI::do_unloading(bool unloading_occurred) {
! if (unloading_occurred) {
! if (_java_runtime != NULL) {
! _java_runtime->_metadata_handles->do_unloading();
! }
! if (_compiler_runtime != NULL && _compiler_runtime != _java_runtime) {
! _compiler_runtime->_metadata_handles->do_unloading();
! }
}
}
bool JVMCI::is_compiler_initialized() {
! return _is_initialized;
}
void JVMCI::shutdown() {
+ ResourceMark rm;
+ {
+ MutexLocker locker(JVMCI_lock);
+ _in_shutdown = true;
+ TRACE_jvmci_1("shutting down JVMCI");
+ }
+ JVMCIRuntime* java_runtime = _java_runtime;
+ if (java_runtime != compiler_runtime()) {
+ java_runtime->shutdown();
+ }
if (compiler_runtime() != NULL) {
compiler_runtime()->shutdown();
}
}
! bool JVMCI::in_shutdown() {
! return _in_shutdown;
}
< prev index next >