< prev index next > src/hotspot/share/oops/instanceKlass.cpp
Print this page
class PreemptableInitCall {
JavaThread* _thread;
bool _previous;
DEBUG_ONLY(InstanceKlass* _previous_klass;)
public:
! PreemptableInitCall(JavaThread* thread, InstanceKlass* ik) : _thread(thread) {
! _previous = thread->at_preemptable_init();
! _thread->set_at_preemptable_init(true);
! DEBUG_ONLY(_previous_klass = _thread->preempt_init_klass();)
! DEBUG_ONLY(_thread->set_preempt_init_klass(ik));
}
~PreemptableInitCall() {
! _thread->set_at_preemptable_init(_previous);
! DEBUG_ONLY(_thread->set_preempt_init_klass(_previous_klass));
}
};
void InstanceKlass::initialize_preemptable(TRAPS) {
if (this->should_be_initialized()) {
class PreemptableInitCall {
JavaThread* _thread;
bool _previous;
DEBUG_ONLY(InstanceKlass* _previous_klass;)
public:
! PreemptableInitCall(JavaThread* thread, InstanceKlass* ik) : _thread(nullptr) {
! if (thread->is_vthread_mounted()) {
! _thread = thread;
! _previous = _thread->at_preemptable_init();
! _thread->set_at_preemptable_init(true);
+ DEBUG_ONLY(_previous_klass = _thread->preempt_init_klass();)
+ DEBUG_ONLY(_thread->set_preempt_init_klass(ik));
+ }
}
~PreemptableInitCall() {
! if (_thread != nullptr) {
! _thread->set_at_preemptable_init(_previous);
+ DEBUG_ONLY(_thread->set_preempt_init_klass(_previous_klass));
+ }
}
};
void InstanceKlass::initialize_preemptable(TRAPS) {
if (this->should_be_initialized()) {
< prev index next >