8267842: SIGSEGV in get_current_contended_monitor

Reviewed-by: stefank, dcubed, ysuenaga, dholmes
This commit is contained in:
Martin Doerr 2021-05-31 08:27:52 +00:00
parent 236bd89dc3
commit 1e29005a22
2 changed files with 12 additions and 8 deletions

View file

@ -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:

View file

@ -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) \