mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8167108: inconsistent handling of SR_lock can lead to crashes
Add Thread Safe Memory Reclamation (Thread-SMR) mechanism. Co-authored-by: Erik Osterlund <erik.osterlund@oracle.com> Co-authored-by: Robbin Ehn <robbin.ehn@oracle.com> Reviewed-by: coleenp, dcubed, dholmes, eosterlund, gthornbr, kbarrett, rehn, sspitsyn, stefank
This commit is contained in:
parent
cd0c6d0fae
commit
0dff96ff0b
67 changed files with 4220 additions and 995 deletions
|
@ -39,6 +39,8 @@
|
|||
#include "runtime/interfaceSupport.hpp"
|
||||
#include "runtime/orderAccess.inline.hpp"
|
||||
#include "runtime/reflection.hpp"
|
||||
#include "runtime/thread.hpp"
|
||||
#include "runtime/threadSMR.hpp"
|
||||
#include "runtime/vm_version.hpp"
|
||||
#include "services/threadService.hpp"
|
||||
#include "trace/tracing.hpp"
|
||||
|
@ -937,8 +939,12 @@ UNSAFE_ENTRY(void, Unsafe_Unpark(JNIEnv *env, jobject unsafe, jobject jthread))
|
|||
Parker* p = NULL;
|
||||
|
||||
if (jthread != NULL) {
|
||||
oop java_thread = JNIHandles::resolve_non_null(jthread);
|
||||
ThreadsListHandle tlh;
|
||||
JavaThread* thr = NULL;
|
||||
oop java_thread = NULL;
|
||||
(void) tlh.cv_internal_thread_to_JavaThread(jthread, &thr, &java_thread);
|
||||
if (java_thread != NULL) {
|
||||
// This is a valid oop.
|
||||
jlong lp = java_lang_Thread::park_event(java_thread);
|
||||
if (lp != 0) {
|
||||
// This cast is OK even though the jlong might have been read
|
||||
|
@ -946,22 +952,19 @@ UNSAFE_ENTRY(void, Unsafe_Unpark(JNIEnv *env, jobject unsafe, jobject jthread))
|
|||
// always be zero anyway and the value set is always the same
|
||||
p = (Parker*)addr_from_java(lp);
|
||||
} else {
|
||||
// Grab lock if apparently null or using older version of library
|
||||
MutexLocker mu(Threads_lock);
|
||||
java_thread = JNIHandles::resolve_non_null(jthread);
|
||||
|
||||
if (java_thread != NULL) {
|
||||
JavaThread* thr = java_lang_Thread::thread(java_thread);
|
||||
if (thr != NULL) {
|
||||
p = thr->parker();
|
||||
if (p != NULL) { // Bind to Java thread for next time.
|
||||
java_lang_Thread::set_park_event(java_thread, addr_to_java(p));
|
||||
}
|
||||
// Not cached in the java.lang.Thread oop yet (could be an
|
||||
// older version of library).
|
||||
if (thr != NULL) {
|
||||
// The JavaThread is alive.
|
||||
p = thr->parker();
|
||||
if (p != NULL) {
|
||||
// Cache the Parker in the java.lang.Thread oop for next time.
|
||||
java_lang_Thread::set_park_event(java_thread, addr_to_java(p));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // ThreadsListHandle is destroyed here.
|
||||
|
||||
if (p != NULL) {
|
||||
HOTSPOT_THREAD_UNPARK((uintptr_t) p);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue