@@ -49,6 +49,7 @@ class ContinuationWrapper : public StackObj {
49
49
// These oops are managed by SafepointOp
50
50
oop _continuation; // jdk.internal.vm.Continuation instance
51
51
stackChunkOop _tail;
52
+ bool _done;
52
53
53
54
ContinuationWrapper (const ContinuationWrapper& cont); // no copy constructor
54
55
@@ -58,6 +59,7 @@ class ContinuationWrapper : public StackObj {
58
59
59
60
void disallow_safepoint () {
60
61
#ifdef ASSERT
62
+ assert (!_done, " " );
61
63
assert (_continuation != nullptr , " " );
62
64
_current_thread = Thread::current ();
63
65
if (_current_thread->is_Java_thread ()) {
@@ -69,16 +71,19 @@ class ContinuationWrapper : public StackObj {
69
71
void allow_safepoint () {
70
72
#ifdef ASSERT
71
73
// we could have already allowed safepoints in done
72
- if (_continuation != nullptr && _current_thread->is_Java_thread ()) {
74
+ if (!_done && _current_thread->is_Java_thread ()) {
73
75
JavaThread::cast (_current_thread)->dec_no_safepoint_count ();
74
76
}
75
77
#endif
76
78
}
77
79
80
+ ContinuationWrapper (JavaThread* thread, ContinuationEntry* entry, oop continuation);
81
+
78
82
public:
79
83
void done () {
80
84
allow_safepoint (); // must be done first
81
- _continuation = nullptr ;
85
+ _done = true ;
86
+ *reinterpret_cast <intptr_t *>(&_continuation) = badHeapOopVal;
82
87
*reinterpret_cast <intptr_t *>(&_tail) = badHeapOopVal;
83
88
}
84
89
@@ -140,23 +145,19 @@ class ContinuationWrapper : public StackObj {
140
145
#endif
141
146
};
142
147
143
- inline ContinuationWrapper::ContinuationWrapper (JavaThread* thread, oop continuation)
144
- : _thread(thread), _entry(thread->last_continuation ()), _continuation(continuation)
145
- {
148
+ inline ContinuationWrapper::ContinuationWrapper (JavaThread* thread, ContinuationEntry* entry, oop continuation)
149
+ : _thread(thread), _entry(entry), _continuation(continuation), _done(false ) {
146
150
assert (oopDesc::is_oop (_continuation),
147
151
" Invalid continuation object: " INTPTR_FORMAT, p2i ((void *)_continuation));
148
152
disallow_safepoint ();
149
153
read ();
150
154
}
151
155
156
+ inline ContinuationWrapper::ContinuationWrapper (JavaThread* thread, oop continuation)
157
+ : ContinuationWrapper(thread, thread->last_continuation (), continuation) {}
158
+
152
159
inline ContinuationWrapper::ContinuationWrapper (oop continuation)
153
- : _thread(nullptr ), _entry(nullptr ), _continuation(continuation)
154
- {
155
- assert (oopDesc::is_oop (_continuation),
156
- " Invalid continuation object: " INTPTR_FORMAT, p2i ((void *)_continuation));
157
- disallow_safepoint ();
158
- read ();
159
- }
160
+ : ContinuationWrapper(nullptr , nullptr , continuation) {}
160
161
161
162
inline bool ContinuationWrapper::is_preempted () {
162
163
return jdk_internal_vm_Continuation::is_preempted (_continuation);
0 commit comments