2064 InstanceKlass* k = vmClasses::ThreadGroup_klass();
2065 THREADGROUP_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2066 }
2067
2068 #if INCLUDE_CDS
2069 void java_lang_ThreadGroup::serialize_offsets(SerializeClosure* f) {
2070 THREADGROUP_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2071 }
2072 #endif
2073
2074
2075 // java_lang_VirtualThread
2076
2077 int java_lang_VirtualThread::static_vthread_scope_offset;
2078 int java_lang_VirtualThread::_carrierThread_offset;
2079 int java_lang_VirtualThread::_continuation_offset;
2080 int java_lang_VirtualThread::_state_offset;
2081 int java_lang_VirtualThread::_next_offset;
2082 int java_lang_VirtualThread::_onWaitingList_offset;
2083 int java_lang_VirtualThread::_notified_offset;
2084 int java_lang_VirtualThread::_timeout_offset;
2085 int java_lang_VirtualThread::_objectWaiter_offset;
2086
2087 #define VTHREAD_FIELDS_DO(macro) \
2088 macro(static_vthread_scope_offset, k, "VTHREAD_SCOPE", continuationscope_signature, true); \
2089 macro(_carrierThread_offset, k, "carrierThread", thread_signature, false); \
2090 macro(_continuation_offset, k, "cont", continuation_signature, false); \
2091 macro(_state_offset, k, "state", int_signature, false); \
2092 macro(_next_offset, k, "next", vthread_signature, false); \
2093 macro(_onWaitingList_offset, k, "onWaitingList", bool_signature, false); \
2094 macro(_notified_offset, k, "notified", bool_signature, false); \
2095 macro(_timeout_offset, k, "timeout", long_signature, false);
2096
2097
2098 void java_lang_VirtualThread::compute_offsets() {
2099 InstanceKlass* k = vmClasses::VirtualThread_klass();
2100 VTHREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2101 VTHREAD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2102 }
2103
2104 bool java_lang_VirtualThread::is_instance(oop obj) {
2105 return obj != nullptr && is_subclass(obj->klass());
2106 }
2107
2108 oop java_lang_VirtualThread::carrier_thread(oop vthread) {
2109 oop thread = vthread->obj_field(_carrierThread_offset);
2110 return thread;
2111 }
2112
2113 oop java_lang_VirtualThread::continuation(oop vthread) {
2114 oop cont = vthread->obj_field(_continuation_offset);
2144 bool java_lang_VirtualThread::set_onWaitingList(oop vthread, OopHandle& list_head) {
2145 jboolean* addr = vthread->field_addr<jboolean>(_onWaitingList_offset);
2146 jboolean vthread_on_list = Atomic::load(addr);
2147 if (!vthread_on_list) {
2148 vthread_on_list = Atomic::cmpxchg(addr, (jboolean)JNI_FALSE, (jboolean)JNI_TRUE);
2149 if (!vthread_on_list) {
2150 for (;;) {
2151 oop head = list_head.resolve();
2152 java_lang_VirtualThread::set_next(vthread, head);
2153 if (list_head.cmpxchg(head, vthread) == head) return true;
2154 }
2155 }
2156 }
2157 return false; // already on waiting list
2158 }
2159
2160 void java_lang_VirtualThread::set_notified(oop vthread, jboolean value) {
2161 vthread->bool_field_put_volatile(_notified_offset, value);
2162 }
2163
2164 jlong java_lang_VirtualThread::timeout(oop vthread) {
2165 return vthread->long_field(_timeout_offset);
2166 }
2167
2168 void java_lang_VirtualThread::set_timeout(oop vthread, jlong value) {
2169 vthread->long_field_put(_timeout_offset, value);
2170 }
2171
2172 JavaThreadStatus java_lang_VirtualThread::map_state_to_thread_status(int state) {
2173 JavaThreadStatus status = JavaThreadStatus::NEW;
2174 switch (state & ~SUSPENDED) {
2175 case NEW:
2176 status = JavaThreadStatus::NEW;
2177 break;
2178 case STARTED:
2179 case RUNNING:
2180 case PARKING:
2181 case TIMED_PARKING:
2182 case UNPARKED:
2183 case YIELDING:
|
2064 InstanceKlass* k = vmClasses::ThreadGroup_klass();
2065 THREADGROUP_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2066 }
2067
2068 #if INCLUDE_CDS
2069 void java_lang_ThreadGroup::serialize_offsets(SerializeClosure* f) {
2070 THREADGROUP_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2071 }
2072 #endif
2073
2074
2075 // java_lang_VirtualThread
2076
2077 int java_lang_VirtualThread::static_vthread_scope_offset;
2078 int java_lang_VirtualThread::_carrierThread_offset;
2079 int java_lang_VirtualThread::_continuation_offset;
2080 int java_lang_VirtualThread::_state_offset;
2081 int java_lang_VirtualThread::_next_offset;
2082 int java_lang_VirtualThread::_onWaitingList_offset;
2083 int java_lang_VirtualThread::_notified_offset;
2084 int java_lang_VirtualThread::_interruptible_wait_offset;
2085 int java_lang_VirtualThread::_timeout_offset;
2086 int java_lang_VirtualThread::_objectWaiter_offset;
2087
2088 #define VTHREAD_FIELDS_DO(macro) \
2089 macro(static_vthread_scope_offset, k, "VTHREAD_SCOPE", continuationscope_signature, true); \
2090 macro(_carrierThread_offset, k, "carrierThread", thread_signature, false); \
2091 macro(_continuation_offset, k, "cont", continuation_signature, false); \
2092 macro(_state_offset, k, "state", int_signature, false); \
2093 macro(_next_offset, k, "next", vthread_signature, false); \
2094 macro(_onWaitingList_offset, k, "onWaitingList", bool_signature, false); \
2095 macro(_notified_offset, k, "notified", bool_signature, false); \
2096 macro(_interruptible_wait_offset, k, "interruptableWait", bool_signature, false); \
2097 macro(_timeout_offset, k, "timeout", long_signature, false);
2098
2099
2100 void java_lang_VirtualThread::compute_offsets() {
2101 InstanceKlass* k = vmClasses::VirtualThread_klass();
2102 VTHREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2103 VTHREAD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2104 }
2105
2106 bool java_lang_VirtualThread::is_instance(oop obj) {
2107 return obj != nullptr && is_subclass(obj->klass());
2108 }
2109
2110 oop java_lang_VirtualThread::carrier_thread(oop vthread) {
2111 oop thread = vthread->obj_field(_carrierThread_offset);
2112 return thread;
2113 }
2114
2115 oop java_lang_VirtualThread::continuation(oop vthread) {
2116 oop cont = vthread->obj_field(_continuation_offset);
2146 bool java_lang_VirtualThread::set_onWaitingList(oop vthread, OopHandle& list_head) {
2147 jboolean* addr = vthread->field_addr<jboolean>(_onWaitingList_offset);
2148 jboolean vthread_on_list = Atomic::load(addr);
2149 if (!vthread_on_list) {
2150 vthread_on_list = Atomic::cmpxchg(addr, (jboolean)JNI_FALSE, (jboolean)JNI_TRUE);
2151 if (!vthread_on_list) {
2152 for (;;) {
2153 oop head = list_head.resolve();
2154 java_lang_VirtualThread::set_next(vthread, head);
2155 if (list_head.cmpxchg(head, vthread) == head) return true;
2156 }
2157 }
2158 }
2159 return false; // already on waiting list
2160 }
2161
2162 void java_lang_VirtualThread::set_notified(oop vthread, jboolean value) {
2163 vthread->bool_field_put_volatile(_notified_offset, value);
2164 }
2165
2166 void java_lang_VirtualThread::set_interruptible_wait(oop vthread, jboolean value) {
2167 vthread->bool_field_put_volatile(_interruptible_wait_offset, value);
2168 }
2169
2170 jlong java_lang_VirtualThread::timeout(oop vthread) {
2171 return vthread->long_field(_timeout_offset);
2172 }
2173
2174 void java_lang_VirtualThread::set_timeout(oop vthread, jlong value) {
2175 vthread->long_field_put(_timeout_offset, value);
2176 }
2177
2178 JavaThreadStatus java_lang_VirtualThread::map_state_to_thread_status(int state) {
2179 JavaThreadStatus status = JavaThreadStatus::NEW;
2180 switch (state & ~SUSPENDED) {
2181 case NEW:
2182 status = JavaThreadStatus::NEW;
2183 break;
2184 case STARTED:
2185 case RUNNING:
2186 case PARKING:
2187 case TIMED_PARKING:
2188 case UNPARKED:
2189 case YIELDING:
|