< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page

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:
< prev index next >