mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-17 17:44:40 +02:00
Merge
This commit is contained in:
commit
9e981ee107
1617 changed files with 150372 additions and 32786 deletions
|
@ -78,7 +78,6 @@
|
|||
#include "runtime/task.hpp"
|
||||
#include "runtime/thread.inline.hpp"
|
||||
#include "runtime/threadCritical.hpp"
|
||||
#include "runtime/threadLocalStorage.hpp"
|
||||
#include "runtime/vframe.hpp"
|
||||
#include "runtime/vframeArray.hpp"
|
||||
#include "runtime/vframe_hp.hpp"
|
||||
|
@ -142,6 +141,10 @@
|
|||
|
||||
#endif // ndef DTRACE_ENABLED
|
||||
|
||||
#ifndef USE_LIBRARY_BASED_TLS_ONLY
|
||||
// Current thread is maintained as a thread-local variable
|
||||
THREAD_LOCAL_DECL Thread* Thread::_thr_current = NULL;
|
||||
#endif
|
||||
|
||||
// Class hierarchy
|
||||
// - Thread
|
||||
|
@ -281,22 +284,22 @@ Thread::Thread() {
|
|||
#endif // ASSERT
|
||||
}
|
||||
|
||||
// Non-inlined version to be used where thread.inline.hpp shouldn't be included.
|
||||
Thread* Thread::current_noinline() {
|
||||
return Thread::current();
|
||||
void Thread::initialize_thread_current() {
|
||||
#ifndef USE_LIBRARY_BASED_TLS_ONLY
|
||||
assert(_thr_current == NULL, "Thread::current already initialized");
|
||||
_thr_current = this;
|
||||
#endif
|
||||
assert(ThreadLocalStorage::thread() == NULL, "ThreadLocalStorage::thread already initialized");
|
||||
ThreadLocalStorage::set_thread(this);
|
||||
assert(Thread::current() == ThreadLocalStorage::thread(), "TLS mismatch!");
|
||||
}
|
||||
|
||||
void Thread::initialize_thread_local_storage() {
|
||||
// Note: Make sure this method only calls
|
||||
// non-blocking operations. Otherwise, it might not work
|
||||
// with the thread-startup/safepoint interaction.
|
||||
|
||||
// During Java thread startup, safepoint code should allow this
|
||||
// method to complete because it may need to allocate memory to
|
||||
// store information for the new thread.
|
||||
|
||||
// initialize structure dependent on thread local storage
|
||||
ThreadLocalStorage::set_thread(this);
|
||||
void Thread::clear_thread_current() {
|
||||
assert(Thread::current() == ThreadLocalStorage::thread(), "TLS mismatch!");
|
||||
#ifndef USE_LIBRARY_BASED_TLS_ONLY
|
||||
_thr_current = NULL;
|
||||
#endif
|
||||
ThreadLocalStorage::set_thread(NULL);
|
||||
}
|
||||
|
||||
void Thread::record_stack_base_and_size() {
|
||||
|
@ -304,6 +307,7 @@ void Thread::record_stack_base_and_size() {
|
|||
set_stack_size(os::current_stack_size());
|
||||
if (is_Java_thread()) {
|
||||
((JavaThread*) this)->set_stack_overflow_limit();
|
||||
((JavaThread*) this)->set_reserved_stack_activation(stack_base());
|
||||
}
|
||||
// CR 7190089: on Solaris, primordial thread's stack is adjusted
|
||||
// in initialize_thread(). Without the adjustment, stack size is
|
||||
|
@ -364,15 +368,12 @@ Thread::~Thread() {
|
|||
|
||||
delete _SR_lock;
|
||||
|
||||
// clear thread local storage if the Thread is deleting itself
|
||||
// clear Thread::current if thread is deleting itself.
|
||||
// Needed to ensure JNI correctly detects non-attached threads.
|
||||
if (this == Thread::current()) {
|
||||
ThreadLocalStorage::set_thread(NULL);
|
||||
} else {
|
||||
// In the case where we're not the current thread, invalidate all the
|
||||
// caches in case some code tries to get the current thread or the
|
||||
// thread that was destroyed, and gets stale information.
|
||||
ThreadLocalStorage::invalidate_all();
|
||||
clear_thread_current();
|
||||
}
|
||||
|
||||
CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) delete unhandled_oops();)
|
||||
}
|
||||
|
||||
|
@ -908,7 +909,7 @@ bool Thread::is_in_stack(address adr) const {
|
|||
|
||||
|
||||
bool Thread::is_in_usable_stack(address adr) const {
|
||||
size_t stack_guard_size = os::uses_stack_guard_pages() ? (StackYellowPages + StackRedPages) * os::vm_page_size() : 0;
|
||||
size_t stack_guard_size = os::uses_stack_guard_pages() ? (StackReservedPages + StackYellowPages + StackRedPages) * os::vm_page_size() : 0;
|
||||
size_t usable_stack_size = _stack_size - stack_guard_size;
|
||||
|
||||
return ((adr < stack_base()) && (adr >= stack_base() - usable_stack_size));
|
||||
|
@ -1273,7 +1274,6 @@ void WatcherThread::run() {
|
|||
assert(this == watcher_thread(), "just checking");
|
||||
|
||||
this->record_stack_base_and_size();
|
||||
this->initialize_thread_local_storage();
|
||||
this->set_native_thread_name(this->name());
|
||||
this->set_active_handles(JNIHandleBlock::allocate_block());
|
||||
while (true) {
|
||||
|
@ -1326,9 +1326,6 @@ void WatcherThread::run() {
|
|||
_watcher_thread = NULL;
|
||||
Terminator_lock->notify();
|
||||
}
|
||||
|
||||
// Thread destructor usually does this..
|
||||
ThreadLocalStorage::set_thread(NULL);
|
||||
}
|
||||
|
||||
void WatcherThread::start() {
|
||||
|
@ -1464,6 +1461,7 @@ void JavaThread::initialize() {
|
|||
_jvmci_counters = NULL;
|
||||
}
|
||||
#endif // INCLUDE_JVMCI
|
||||
_reserved_stack_activation = NULL; // stack base not known yet
|
||||
(void)const_cast<oop&>(_exception_oop = oop(NULL));
|
||||
_exception_pc = 0;
|
||||
_exception_handler_pc = 0;
|
||||
|
@ -1536,7 +1534,8 @@ JavaThread::JavaThread(bool is_attaching_via_jni) :
|
|||
}
|
||||
|
||||
bool JavaThread::reguard_stack(address cur_sp) {
|
||||
if (_stack_guard_state != stack_guard_yellow_disabled) {
|
||||
if (_stack_guard_state != stack_guard_yellow_disabled
|
||||
&& _stack_guard_state != stack_guard_reserved_disabled) {
|
||||
return true; // Stack already guarded or guard pages not needed.
|
||||
}
|
||||
|
||||
|
@ -1553,8 +1552,15 @@ bool JavaThread::reguard_stack(address cur_sp) {
|
|||
// some exception code in c1, c2 or the interpreter isn't unwinding
|
||||
// when it should.
|
||||
guarantee(cur_sp > stack_yellow_zone_base(), "not enough space to reguard - increase StackShadowPages");
|
||||
|
||||
enable_stack_yellow_zone();
|
||||
if (_stack_guard_state == stack_guard_yellow_disabled) {
|
||||
enable_stack_yellow_zone();
|
||||
if (reserved_stack_activation() != stack_base()) {
|
||||
set_reserved_stack_activation(stack_base());
|
||||
}
|
||||
} else if (_stack_guard_state == stack_guard_reserved_disabled) {
|
||||
set_reserved_stack_activation(stack_base());
|
||||
enable_stack_reserved_zone();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1663,9 +1669,6 @@ void JavaThread::run() {
|
|||
// Record real stack base and size.
|
||||
this->record_stack_base_and_size();
|
||||
|
||||
// Initialize thread local storage; set before calling MutexLocker
|
||||
this->initialize_thread_local_storage();
|
||||
|
||||
this->create_stack_guard_pages();
|
||||
|
||||
this->cache_global_variables();
|
||||
|
@ -1997,8 +2000,7 @@ void JavaThread::cleanup_failed_attach_current_thread() {
|
|||
|
||||
|
||||
JavaThread* JavaThread::active() {
|
||||
Thread* thread = ThreadLocalStorage::thread();
|
||||
assert(thread != NULL, "just checking");
|
||||
Thread* thread = Thread::current();
|
||||
if (thread->is_Java_thread()) {
|
||||
return (JavaThread*) thread;
|
||||
} else {
|
||||
|
@ -2481,7 +2483,7 @@ void JavaThread::java_resume() {
|
|||
void JavaThread::create_stack_guard_pages() {
|
||||
if (! os::uses_stack_guard_pages() || _stack_guard_state != stack_guard_unused) return;
|
||||
address low_addr = stack_base() - stack_size();
|
||||
size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
|
||||
size_t len = (StackReservedPages + StackYellowPages + StackRedPages) * os::vm_page_size();
|
||||
|
||||
int allocate = os::allocate_stack_guard_pages();
|
||||
// warning("Guarding at " PTR_FORMAT " for len " SIZE_FORMAT "\n", low_addr, len);
|
||||
|
@ -2505,7 +2507,7 @@ void JavaThread::remove_stack_guard_pages() {
|
|||
assert(Thread::current() == this, "from different thread");
|
||||
if (_stack_guard_state == stack_guard_unused) return;
|
||||
address low_addr = stack_base() - stack_size();
|
||||
size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
|
||||
size_t len = (StackReservedPages + StackYellowPages + StackRedPages) * os::vm_page_size();
|
||||
|
||||
if (os::allocate_stack_guard_pages()) {
|
||||
if (os::remove_stack_guard_pages((char *) low_addr, len)) {
|
||||
|
@ -2523,6 +2525,44 @@ void JavaThread::remove_stack_guard_pages() {
|
|||
}
|
||||
}
|
||||
|
||||
void JavaThread::enable_stack_reserved_zone() {
|
||||
assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
|
||||
assert(_stack_guard_state != stack_guard_enabled, "already enabled");
|
||||
|
||||
// The base notation is from the stack's point of view, growing downward.
|
||||
// We need to adjust it to work correctly with guard_memory()
|
||||
address base = stack_reserved_zone_base() - stack_reserved_zone_size();
|
||||
|
||||
guarantee(base < stack_base(),"Error calculating stack reserved zone");
|
||||
guarantee(base < os::current_stack_pointer(),"Error calculating stack reserved zone");
|
||||
|
||||
if (os::guard_memory((char *) base, stack_reserved_zone_size())) {
|
||||
_stack_guard_state = stack_guard_enabled;
|
||||
} else {
|
||||
warning("Attempt to guard stack reserved zone failed.");
|
||||
}
|
||||
enable_register_stack_guard();
|
||||
}
|
||||
|
||||
void JavaThread::disable_stack_reserved_zone() {
|
||||
assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
|
||||
assert(_stack_guard_state != stack_guard_reserved_disabled, "already disabled");
|
||||
|
||||
// Simply return if called for a thread that does not use guard pages.
|
||||
if (_stack_guard_state == stack_guard_unused) return;
|
||||
|
||||
// The base notation is from the stack's point of view, growing downward.
|
||||
// We need to adjust it to work correctly with guard_memory()
|
||||
address base = stack_reserved_zone_base() - stack_reserved_zone_size();
|
||||
|
||||
if (os::unguard_memory((char *)base, stack_reserved_zone_size())) {
|
||||
_stack_guard_state = stack_guard_reserved_disabled;
|
||||
} else {
|
||||
warning("Attempt to unguard stack reserved zone failed.");
|
||||
}
|
||||
disable_register_stack_guard();
|
||||
}
|
||||
|
||||
void JavaThread::enable_stack_yellow_zone() {
|
||||
assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
|
||||
assert(_stack_guard_state != stack_guard_enabled, "already enabled");
|
||||
|
@ -3407,7 +3447,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
|||
jint adjust_after_os_result = Arguments::adjust_after_os();
|
||||
if (adjust_after_os_result != JNI_OK) return adjust_after_os_result;
|
||||
|
||||
// initialize TLS
|
||||
// Initialize library-based TLS
|
||||
ThreadLocalStorage::init();
|
||||
|
||||
// Initialize output stream logging
|
||||
|
@ -3444,14 +3484,9 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
|||
// Attach the main thread to this os thread
|
||||
JavaThread* main_thread = new JavaThread();
|
||||
main_thread->set_thread_state(_thread_in_vm);
|
||||
// must do this before set_active_handles and initialize_thread_local_storage
|
||||
// Note: on solaris initialize_thread_local_storage() will (indirectly)
|
||||
// change the stack size recorded here to one based on the java thread
|
||||
// stacksize. This adjusted size is what is used to figure the placement
|
||||
// of the guard pages.
|
||||
main_thread->initialize_thread_current();
|
||||
// must do this before set_active_handles
|
||||
main_thread->record_stack_base_and_size();
|
||||
main_thread->initialize_thread_local_storage();
|
||||
|
||||
main_thread->set_active_handles(JNIHandleBlock::allocate_block());
|
||||
|
||||
if (!main_thread->set_as_starting_thread()) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue