8255243: Reinforce escape barrier interactions with ZGC conc stack processing

Co-authored-by: Richard Reingruber <rrich@openjdk.org>
Reviewed-by: rrich, sspitsyn
This commit is contained in:
Erik Österlund 2020-10-29 14:18:11 +00:00
parent faf23de54d
commit 5b185585e8
15 changed files with 196 additions and 104 deletions

View file

@ -163,7 +163,8 @@ StackWatermark::StackWatermark(JavaThread* jt, StackWatermarkKind kind, uint32_t
_jt(jt),
_iterator(NULL),
_lock(Mutex::tty - 1, "stack_watermark_lock", true, Mutex::_safepoint_check_never),
_kind(kind) {
_kind(kind),
_linked_watermark(NULL) {
}
StackWatermark::~StackWatermark() {
@ -247,6 +248,11 @@ void StackWatermark::process_one() {
}
}
void StackWatermark::link_watermark(StackWatermark* watermark) {
assert(watermark == NULL || _linked_watermark == NULL, "nesting not supported");
_linked_watermark = watermark;
}
uintptr_t StackWatermark::watermark() {
return Atomic::load_acquire(&_watermark);
}
@ -280,6 +286,14 @@ bool StackWatermark::processing_completed_acquire() const {
return processing_completed(Atomic::load_acquire(&_state));
}
void StackWatermark::on_safepoint() {
start_processing();
StackWatermark* linked_watermark = _linked_watermark;
if (linked_watermark != NULL) {
linked_watermark->finish_processing(NULL /* context */);
}
}
void StackWatermark::start_processing() {
if (!processing_started_acquire()) {
MutexLocker ml(&_lock, Mutex::_no_safepoint_check_flag);