mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-17 01:24:33 +02:00
8267842: SIGSEGV in get_current_contended_monitor
Reviewed-by: stefank, dcubed, ysuenaga, dholmes
This commit is contained in:
parent
236bd89dc3
commit
1e29005a22
2 changed files with 12 additions and 8 deletions
|
@ -746,18 +746,21 @@ class JavaThread: public Thread {
|
||||||
// elided card-marks for performance along the fast-path.
|
// elided card-marks for performance along the fast-path.
|
||||||
MemRegion _deferred_card_mark;
|
MemRegion _deferred_card_mark;
|
||||||
|
|
||||||
ObjectMonitor* _current_pending_monitor; // ObjectMonitor this thread is waiting to lock
|
ObjectMonitor* volatile _current_pending_monitor; // ObjectMonitor this thread is waiting to lock
|
||||||
bool _current_pending_monitor_is_from_java; // locking is from Java code
|
bool _current_pending_monitor_is_from_java; // locking is from Java code
|
||||||
ObjectMonitor* _current_waiting_monitor; // ObjectMonitor on which this thread called Object.wait()
|
ObjectMonitor* volatile _current_waiting_monitor; // ObjectMonitor on which this thread called Object.wait()
|
||||||
public:
|
public:
|
||||||
volatile intptr_t _Stalled;
|
volatile intptr_t _Stalled;
|
||||||
|
|
||||||
// For tracking the heavyweight monitor the thread is pending on.
|
// For tracking the heavyweight monitor the thread is pending on.
|
||||||
ObjectMonitor* current_pending_monitor() {
|
ObjectMonitor* current_pending_monitor() {
|
||||||
return _current_pending_monitor;
|
// Use Atomic::load() to prevent data race between concurrent modification and
|
||||||
|
// concurrent readers, e.g. ThreadService::get_current_contended_monitor().
|
||||||
|
// Especially, reloading pointer from thread after NULL check must be prevented.
|
||||||
|
return Atomic::load(&_current_pending_monitor);
|
||||||
}
|
}
|
||||||
void set_current_pending_monitor(ObjectMonitor* monitor) {
|
void set_current_pending_monitor(ObjectMonitor* monitor) {
|
||||||
_current_pending_monitor = monitor;
|
Atomic::store(&_current_pending_monitor, monitor);
|
||||||
}
|
}
|
||||||
void set_current_pending_monitor_is_from_java(bool from_java) {
|
void set_current_pending_monitor_is_from_java(bool from_java) {
|
||||||
_current_pending_monitor_is_from_java = from_java;
|
_current_pending_monitor_is_from_java = from_java;
|
||||||
|
@ -766,10 +769,11 @@ class JavaThread: public Thread {
|
||||||
return _current_pending_monitor_is_from_java;
|
return _current_pending_monitor_is_from_java;
|
||||||
}
|
}
|
||||||
ObjectMonitor* current_waiting_monitor() {
|
ObjectMonitor* current_waiting_monitor() {
|
||||||
return _current_waiting_monitor;
|
// See the comment in current_pending_monitor() above.
|
||||||
|
return Atomic::load(&_current_waiting_monitor);
|
||||||
}
|
}
|
||||||
void set_current_waiting_monitor(ObjectMonitor* monitor) {
|
void set_current_waiting_monitor(ObjectMonitor* monitor) {
|
||||||
_current_waiting_monitor = monitor;
|
Atomic::store(&_current_waiting_monitor, monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -740,9 +740,9 @@ typedef HashtableEntry<InstanceKlass*, mtClass> KlassHashtableEntry;
|
||||||
nonstatic_field(JavaThread, _anchor, JavaFrameAnchor) \
|
nonstatic_field(JavaThread, _anchor, JavaFrameAnchor) \
|
||||||
nonstatic_field(JavaThread, _vm_result, oop) \
|
nonstatic_field(JavaThread, _vm_result, oop) \
|
||||||
nonstatic_field(JavaThread, _vm_result_2, Metadata*) \
|
nonstatic_field(JavaThread, _vm_result_2, Metadata*) \
|
||||||
nonstatic_field(JavaThread, _current_pending_monitor, ObjectMonitor*) \
|
volatile_nonstatic_field(JavaThread, _current_pending_monitor, ObjectMonitor*) \
|
||||||
nonstatic_field(JavaThread, _current_pending_monitor_is_from_java, bool) \
|
nonstatic_field(JavaThread, _current_pending_monitor_is_from_java, bool) \
|
||||||
nonstatic_field(JavaThread, _current_waiting_monitor, ObjectMonitor*) \
|
volatile_nonstatic_field(JavaThread, _current_waiting_monitor, ObjectMonitor*) \
|
||||||
volatile_nonstatic_field(JavaThread, _suspend_flags, uint32_t) \
|
volatile_nonstatic_field(JavaThread, _suspend_flags, uint32_t) \
|
||||||
nonstatic_field(JavaThread, _async_exception_condition, JavaThread::AsyncExceptionCondition) \
|
nonstatic_field(JavaThread, _async_exception_condition, JavaThread::AsyncExceptionCondition) \
|
||||||
nonstatic_field(JavaThread, _pending_async_exception, oop) \
|
nonstatic_field(JavaThread, _pending_async_exception, oop) \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue