< prev index next > src/hotspot/share/classfile/javaClasses.cpp
Print this page
bool java_lang_Thread::is_in_VTMS_transition(oop java_thread) {
return java_thread->bool_field_volatile(_jvmti_is_in_VTMS_transition_offset);
}
void java_lang_Thread::set_is_in_VTMS_transition(oop java_thread, bool val) {
+ assert(is_in_VTMS_transition(java_thread) != val, "already %s transition", val ? "inside" : "outside");
java_thread->bool_field_put_volatile(_jvmti_is_in_VTMS_transition_offset, val);
}
int java_lang_Thread::is_in_VTMS_transition_offset() {
return _jvmti_is_in_VTMS_transition_offset;
int java_lang_VirtualThread::static_vthread_scope_offset;
int java_lang_VirtualThread::_carrierThread_offset;
int java_lang_VirtualThread::_continuation_offset;
int java_lang_VirtualThread::_state_offset;
#define VTHREAD_FIELDS_DO(macro) \
macro(static_vthread_scope_offset, k, "VTHREAD_SCOPE", continuationscope_signature, true); \
macro(_carrierThread_offset, k, "carrierThread", thread_signature, false); \
macro(_continuation_offset, k, "cont", continuation_signature, false); \
! macro(_state_offset, k, "state", int_signature, false)
void java_lang_VirtualThread::compute_offsets() {
InstanceKlass* k = vmClasses::VirtualThread_klass();
VTHREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
int java_lang_VirtualThread::static_vthread_scope_offset;
int java_lang_VirtualThread::_carrierThread_offset;
int java_lang_VirtualThread::_continuation_offset;
int java_lang_VirtualThread::_state_offset;
+ int java_lang_VirtualThread::_next_offset;
+ int java_lang_VirtualThread::_onWaitingList_offset;
+ int java_lang_VirtualThread::_notified_offset;
+ int java_lang_VirtualThread::_recheckInterval_offset;
+ int java_lang_VirtualThread::_waitTimeout_offset;
#define VTHREAD_FIELDS_DO(macro) \
macro(static_vthread_scope_offset, k, "VTHREAD_SCOPE", continuationscope_signature, true); \
macro(_carrierThread_offset, k, "carrierThread", thread_signature, false); \
macro(_continuation_offset, k, "cont", continuation_signature, false); \
! macro(_state_offset, k, "state", int_signature, false); \
+ macro(_next_offset, k, "next", vthread_signature, false); \
+ macro(_onWaitingList_offset, k, "onWaitingList", byte_signature, false); \
+ macro(_notified_offset, k, "notified", bool_signature, false); \
+ macro(_recheckInterval_offset, k, "recheckInterval", byte_signature, false); \
+ macro(_waitTimeout_offset, k, "waitTimeout", long_signature, false);
void java_lang_VirtualThread::compute_offsets() {
InstanceKlass* k = vmClasses::VirtualThread_klass();
VTHREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
int java_lang_VirtualThread::state(oop vthread) {
return vthread->int_field_acquire(_state_offset);
}
+ void java_lang_VirtualThread::set_state(oop vthread, int state) {
+ vthread->release_int_field_put(_state_offset, state);
+ }
+
+ int java_lang_VirtualThread::cmpxchg_state(oop vthread, int old_state, int new_state) {
+ jint* addr = vthread->field_addr<jint>(_state_offset);
+ int res = Atomic::cmpxchg(addr, old_state, new_state);
+ return res;
+ }
+
+ oop java_lang_VirtualThread::next(oop vthread) {
+ return vthread->obj_field(_next_offset);
+ }
+
+ void java_lang_VirtualThread::set_next(oop vthread, oop next_vthread) {
+ vthread->obj_field_put(_next_offset, next_vthread);
+ }
+
+ bool java_lang_VirtualThread::set_onWaitingList(oop vthread, OopHandle& list_head) {
+ uint8_t* addr = vthread->field_addr<uint8_t>(_onWaitingList_offset);
+ uint8_t value = Atomic::load(addr);
+ assert(value == 0x00 || value == 0x01, "invariant");
+ if (value == 0x00) {
+ value = Atomic::cmpxchg(addr, (uint8_t)0x00, (uint8_t)0x01);
+ if (value == 0x00) {
+ for (;;) {
+ oop head = list_head.resolve();
+ java_lang_VirtualThread::set_next(vthread, head);
+ if (list_head.cmpxchg(head, vthread) == head) return true;
+ }
+ }
+ }
+ return false; // already on waiting list
+ }
+
+ void java_lang_VirtualThread::set_notified(oop vthread, jboolean value) {
+ vthread->bool_field_put_volatile(_notified_offset, value);
+ }
+
+ jbyte java_lang_VirtualThread::recheckInterval(oop vthread) {
+ return vthread->byte_field(_recheckInterval_offset);
+ }
+
+ void java_lang_VirtualThread::set_recheckInterval(oop vthread, jbyte value) {
+ vthread->release_byte_field_put(_recheckInterval_offset, value);
+ }
+
+ jlong java_lang_VirtualThread::waitTimeout(oop vthread) {
+ return vthread->long_field(_waitTimeout_offset);
+ }
+
+ void java_lang_VirtualThread::set_waitTimeout(oop vthread, jlong value) {
+ vthread->long_field_put(_waitTimeout_offset, value);
+ }
+
JavaThreadStatus java_lang_VirtualThread::map_state_to_thread_status(int state) {
JavaThreadStatus status = JavaThreadStatus::NEW;
switch (state & ~SUSPENDED) {
case NEW:
status = JavaThreadStatus::NEW;
case PARKING:
case TIMED_PARKING:
case UNPARKED:
case YIELDING:
case YIELDED:
+ case BLOCKING:
+ case UNBLOCKED:
+ case WAITING:
+ case TIMED_WAITING:
status = JavaThreadStatus::RUNNABLE;
break;
case PARKED:
case PINNED:
status = JavaThreadStatus::PARKED;
break;
case TIMED_PARKED:
case TIMED_PINNED:
status = JavaThreadStatus::PARKED_TIMED;
break;
+ case BLOCKED:
+ status = JavaThreadStatus::BLOCKED_ON_MONITOR_ENTER;
+ break;
+ case WAIT:
+ status = JavaThreadStatus::IN_OBJECT_WAIT;
+ break;
+ case TIMED_WAIT:
+ status = JavaThreadStatus::IN_OBJECT_WAIT_TIMED;
+ break;
case TERMINATED:
status = JavaThreadStatus::TERMINATED;
break;
default:
ShouldNotReachHere();
}
return status;
}
+ bool java_lang_VirtualThread::is_preempted(oop vthread) {
+ oop continuation = java_lang_VirtualThread::continuation(vthread);
+ return jdk_internal_vm_Continuation::is_preempted(continuation);
+ }
+
#if INCLUDE_CDS
void java_lang_VirtualThread::serialize_offsets(SerializeClosure* f) {
VTHREAD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
}
#endif
< prev index next >