Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8256754: Deoptimization::revoke_for_object_deoptimization: stack processing start call is redundant #1381

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 2 additions & 4 deletions src/hotspot/share/runtime/deoptimization.cpp
Expand Up @@ -63,6 +63,7 @@
#include "runtime/handles.inline.hpp"
#include "runtime/interfaceSupport.inline.hpp"
#include "runtime/jniHandles.inline.hpp"
#include "runtime/keepStackGCProcessed.hpp"
#include "runtime/objectMonitor.inline.hpp"
#include "runtime/safepointVerifiers.hpp"
#include "runtime/sharedRuntime.hpp"
Expand Down Expand Up @@ -1651,10 +1652,7 @@ void Deoptimization::revoke_for_object_deoptimization(JavaThread* deoptee_thread
return;
}
GrowableArray<Handle>* objects_to_revoke = new GrowableArray<Handle>();
if (deoptee_thread != thread) {
// Process stack of deoptee thread as we will access oops during object deoptimization.
StackWatermarkSet::start_processing(deoptee_thread, StackWatermarkKind::gc);
}
assert(KeepStackGCProcessedMark::stack_is_kept_gc_processed(deoptee_thread), "must be");
// Collect monitors but only those with eliminated locking.
get_monitors_from_stack(objects_to_revoke, deoptee_thread, fr, map, true);

Expand Down
16 changes: 16 additions & 0 deletions src/hotspot/share/runtime/keepStackGCProcessed.cpp
Expand Up @@ -58,3 +58,19 @@ KeepStackGCProcessedMark::~KeepStackGCProcessedMark() {
void KeepStackGCProcessedMark::finish_processing() {
StackWatermarkSet::finish_processing(_jt, NULL /* context */, StackWatermarkKind::gc);
}

#ifdef ASSERT
bool KeepStackGCProcessedMark::stack_is_kept_gc_processed(JavaThread* jt) {
if (!Thread::current()->is_Java_thread()) {
assert(SafepointSynchronize::is_at_safepoint() && Thread::current()->is_VM_thread(),
"must be either Java thread or VM thread in a safepoint");
return true;
}
StackWatermark* our_watermark = StackWatermarkSet::get(JavaThread::current(), StackWatermarkKind::gc);
if (our_watermark == nullptr) {
return true;
}
StackWatermark* their_watermark = StackWatermarkSet::get(jt, StackWatermarkKind::gc);
return our_watermark->linked_watermark() == their_watermark;
}
#endif // ASSERT
2 changes: 2 additions & 0 deletions src/hotspot/share/runtime/keepStackGCProcessed.hpp
Expand Up @@ -43,6 +43,8 @@ class KeepStackGCProcessedMark : public StackObj {
public:
KeepStackGCProcessedMark(JavaThread* jt);
~KeepStackGCProcessedMark();

static bool stack_is_kept_gc_processed(JavaThread* jt) NOT_DEBUG({ return true; }) ;
};


Expand Down
1 change: 1 addition & 0 deletions src/hotspot/share/runtime/stackWatermark.hpp
Expand Up @@ -130,6 +130,7 @@ class StackWatermark : public CHeapObj<mtInternal> {
void set_next(StackWatermark* n) { _next = n; }

void link_watermark(StackWatermark* watermark);
DEBUG_ONLY(StackWatermark* linked_watermark() const { return _linked_watermark; })

uintptr_t watermark();
uintptr_t last_processed();
Expand Down