2098 InstanceKlass* k = vmClasses::ThreadGroup_klass();
2099 THREADGROUP_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2100 }
2101
2102 #if INCLUDE_CDS
2103 void java_lang_ThreadGroup::serialize_offsets(SerializeClosure* f) {
2104 THREADGROUP_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2105 }
2106 #endif
2107
2108
2109 // java_lang_VirtualThread
2110
2111 int java_lang_VirtualThread::static_vthread_scope_offset;
2112 int java_lang_VirtualThread::_carrierThread_offset;
2113 int java_lang_VirtualThread::_continuation_offset;
2114 int java_lang_VirtualThread::_state_offset;
2115 int java_lang_VirtualThread::_next_offset;
2116 int java_lang_VirtualThread::_onWaitingList_offset;
2117 int java_lang_VirtualThread::_notified_offset;
2118 int java_lang_VirtualThread::_timeout_offset;
2119 int java_lang_VirtualThread::_objectWaiter_offset;
2120
2121 #define VTHREAD_FIELDS_DO(macro) \
2122 macro(static_vthread_scope_offset, k, "VTHREAD_SCOPE", continuationscope_signature, true); \
2123 macro(_carrierThread_offset, k, "carrierThread", thread_signature, false); \
2124 macro(_continuation_offset, k, "cont", continuation_signature, false); \
2125 macro(_state_offset, k, "state", int_signature, false); \
2126 macro(_next_offset, k, "next", vthread_signature, false); \
2127 macro(_onWaitingList_offset, k, "onWaitingList", bool_signature, false); \
2128 macro(_notified_offset, k, "notified", bool_signature, false); \
2129 macro(_timeout_offset, k, "timeout", long_signature, false);
2130
2131
2132 void java_lang_VirtualThread::compute_offsets() {
2133 InstanceKlass* k = vmClasses::VirtualThread_klass();
2134 VTHREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2135 VTHREAD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2136 }
2137
2138 bool java_lang_VirtualThread::is_instance(oop obj) {
2139 return obj != nullptr && is_subclass(obj->klass());
2140 }
2141
2142 oop java_lang_VirtualThread::carrier_thread(oop vthread) {
2143 oop thread = vthread->obj_field(_carrierThread_offset);
2144 return thread;
2145 }
2146
2147 oop java_lang_VirtualThread::continuation(oop vthread) {
2148 oop cont = vthread->obj_field(_continuation_offset);
2149 return cont;
2150 }
2151
2152 int java_lang_VirtualThread::state(oop vthread) {
2153 return vthread->int_field_acquire(_state_offset);
2154 }
2155
2156 void java_lang_VirtualThread::set_state(oop vthread, int state) {
2157 vthread->release_int_field_put(_state_offset, state);
2158 }
2159
2160 int java_lang_VirtualThread::cmpxchg_state(oop vthread, int old_state, int new_state) {
2161 jint* addr = vthread->field_addr<jint>(_state_offset);
2162 int res = AtomicAccess::cmpxchg(addr, old_state, new_state);
2163 return res;
2178 bool java_lang_VirtualThread::set_onWaitingList(oop vthread, OopHandle& list_head) {
2179 jboolean* addr = vthread->field_addr<jboolean>(_onWaitingList_offset);
2180 jboolean vthread_on_list = AtomicAccess::load(addr);
2181 if (!vthread_on_list) {
2182 vthread_on_list = AtomicAccess::cmpxchg(addr, (jboolean)JNI_FALSE, (jboolean)JNI_TRUE);
2183 if (!vthread_on_list) {
2184 for (;;) {
2185 oop head = list_head.resolve();
2186 java_lang_VirtualThread::set_next(vthread, head);
2187 if (list_head.cmpxchg(head, vthread) == head) return true;
2188 }
2189 }
2190 }
2191 return false; // already on waiting list
2192 }
2193
2194 void java_lang_VirtualThread::set_notified(oop vthread, jboolean value) {
2195 vthread->bool_field_put_volatile(_notified_offset, value);
2196 }
2197
2198 jlong java_lang_VirtualThread::timeout(oop vthread) {
2199 return vthread->long_field(_timeout_offset);
2200 }
2201
2202 void java_lang_VirtualThread::set_timeout(oop vthread, jlong value) {
2203 vthread->long_field_put(_timeout_offset, value);
2204 }
2205
2206 JavaThreadStatus java_lang_VirtualThread::map_state_to_thread_status(int state) {
2207 JavaThreadStatus status = JavaThreadStatus::NEW;
2208 switch (state & ~SUSPENDED) {
2209 case NEW:
2210 status = JavaThreadStatus::NEW;
2211 break;
2212 case STARTED:
2213 case RUNNING:
2214 case PARKING:
2215 case TIMED_PARKING:
2216 case UNPARKED:
2217 case YIELDING:
|
2098 InstanceKlass* k = vmClasses::ThreadGroup_klass();
2099 THREADGROUP_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2100 }
2101
2102 #if INCLUDE_CDS
2103 void java_lang_ThreadGroup::serialize_offsets(SerializeClosure* f) {
2104 THREADGROUP_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
2105 }
2106 #endif
2107
2108
2109 // java_lang_VirtualThread
2110
2111 int java_lang_VirtualThread::static_vthread_scope_offset;
2112 int java_lang_VirtualThread::_carrierThread_offset;
2113 int java_lang_VirtualThread::_continuation_offset;
2114 int java_lang_VirtualThread::_state_offset;
2115 int java_lang_VirtualThread::_next_offset;
2116 int java_lang_VirtualThread::_onWaitingList_offset;
2117 int java_lang_VirtualThread::_notified_offset;
2118 int java_lang_VirtualThread::_interruptible_wait_offset;
2119 int java_lang_VirtualThread::_timeout_offset;
2120 int java_lang_VirtualThread::_objectWaiter_offset;
2121
2122 #define VTHREAD_FIELDS_DO(macro) \
2123 macro(static_vthread_scope_offset, k, "VTHREAD_SCOPE", continuationscope_signature, true); \
2124 macro(_carrierThread_offset, k, "carrierThread", thread_signature, false); \
2125 macro(_continuation_offset, k, "cont", continuation_signature, false); \
2126 macro(_state_offset, k, "state", int_signature, false); \
2127 macro(_next_offset, k, "next", vthread_signature, false); \
2128 macro(_onWaitingList_offset, k, "onWaitingList", bool_signature, false); \
2129 macro(_notified_offset, k, "notified", bool_signature, false); \
2130 macro(_interruptible_wait_offset, k, "interruptableWait", bool_signature, false); \
2131 macro(_timeout_offset, k, "timeout", long_signature, false);
2132
2133
2134 void java_lang_VirtualThread::compute_offsets() {
2135 InstanceKlass* k = vmClasses::VirtualThread_klass();
2136 VTHREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
2137 VTHREAD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
2138 }
2139
2140 bool java_lang_VirtualThread::is_instance(oop obj) {
2141 return obj != nullptr && is_subclass(obj->klass());
2142 }
2143
2144 oop java_lang_VirtualThread::carrier_thread(oop vthread) {
2145 oop thread = vthread->obj_field_acquire(_carrierThread_offset);
2146 return thread;
2147 }
2148
2149 oop java_lang_VirtualThread::continuation(oop vthread) {
2150 oop cont = vthread->obj_field(_continuation_offset);
2151 return cont;
2152 }
2153
2154 int java_lang_VirtualThread::state(oop vthread) {
2155 return vthread->int_field_acquire(_state_offset);
2156 }
2157
2158 void java_lang_VirtualThread::set_state(oop vthread, int state) {
2159 vthread->release_int_field_put(_state_offset, state);
2160 }
2161
2162 int java_lang_VirtualThread::cmpxchg_state(oop vthread, int old_state, int new_state) {
2163 jint* addr = vthread->field_addr<jint>(_state_offset);
2164 int res = AtomicAccess::cmpxchg(addr, old_state, new_state);
2165 return res;
2180 bool java_lang_VirtualThread::set_onWaitingList(oop vthread, OopHandle& list_head) {
2181 jboolean* addr = vthread->field_addr<jboolean>(_onWaitingList_offset);
2182 jboolean vthread_on_list = AtomicAccess::load(addr);
2183 if (!vthread_on_list) {
2184 vthread_on_list = AtomicAccess::cmpxchg(addr, (jboolean)JNI_FALSE, (jboolean)JNI_TRUE);
2185 if (!vthread_on_list) {
2186 for (;;) {
2187 oop head = list_head.resolve();
2188 java_lang_VirtualThread::set_next(vthread, head);
2189 if (list_head.cmpxchg(head, vthread) == head) return true;
2190 }
2191 }
2192 }
2193 return false; // already on waiting list
2194 }
2195
2196 void java_lang_VirtualThread::set_notified(oop vthread, jboolean value) {
2197 vthread->bool_field_put_volatile(_notified_offset, value);
2198 }
2199
2200 void java_lang_VirtualThread::set_interruptible_wait(oop vthread, jboolean value) {
2201 vthread->bool_field_put_volatile(_interruptible_wait_offset, value);
2202 }
2203
2204 jlong java_lang_VirtualThread::timeout(oop vthread) {
2205 return vthread->long_field(_timeout_offset);
2206 }
2207
2208 void java_lang_VirtualThread::set_timeout(oop vthread, jlong value) {
2209 vthread->long_field_put(_timeout_offset, value);
2210 }
2211
2212 JavaThreadStatus java_lang_VirtualThread::map_state_to_thread_status(int state) {
2213 JavaThreadStatus status = JavaThreadStatus::NEW;
2214 switch (state & ~SUSPENDED) {
2215 case NEW:
2216 status = JavaThreadStatus::NEW;
2217 break;
2218 case STARTED:
2219 case RUNNING:
2220 case PARKING:
2221 case TIMED_PARKING:
2222 case UNPARKED:
2223 case YIELDING:
|