163 friend class SafeThreadsListPtr; // for {dec,inc}_nested_handle_cnt() access 164 friend class ThreadsSMRSupport; // for _nested_handle_cnt, {add,remove}_thread(), {,set_}next_list() access 165 166 const uint _length; 167 ThreadsList* _next_list; 168 JavaThread *const *const _threads; 169 volatile intx _nested_handle_cnt; 170 171 template <class T> 172 void threads_do_dispatch(T *cl, JavaThread *const thread) const; 173 174 ThreadsList *next_list() const { return _next_list; } 175 void set_next_list(ThreadsList *list) { _next_list = list; } 176 177 void inc_nested_handle_cnt(); 178 void dec_nested_handle_cnt(); 179 180 static ThreadsList* add_thread(ThreadsList* list, JavaThread* java_thread); 181 static ThreadsList* remove_thread(ThreadsList* list, JavaThread* java_thread); 182 183 public: 184 ThreadsList(int entries); 185 ~ThreadsList(); 186 187 template <class T> 188 void threads_do(T *cl) const; 189 190 uint length() const { return _length; } 191 192 JavaThread *const thread_at(uint i) const { return _threads[i]; } 193 194 JavaThread *const *threads() const { return _threads; } 195 196 // Returns -1 if target is not found. 197 int find_index_of_JavaThread(JavaThread* target); 198 JavaThread* find_JavaThread_from_java_tid(jlong java_tid) const; 199 bool includes(const JavaThread * const p) const; 200 }; 201 202 // An abstract safe ptr to a ThreadsList comprising either a stable hazard ptr | 163 friend class SafeThreadsListPtr; // for {dec,inc}_nested_handle_cnt() access 164 friend class ThreadsSMRSupport; // for _nested_handle_cnt, {add,remove}_thread(), {,set_}next_list() access 165 166 const uint _length; 167 ThreadsList* _next_list; 168 JavaThread *const *const _threads; 169 volatile intx _nested_handle_cnt; 170 171 template <class T> 172 void threads_do_dispatch(T *cl, JavaThread *const thread) const; 173 174 ThreadsList *next_list() const { return _next_list; } 175 void set_next_list(ThreadsList *list) { _next_list = list; } 176 177 void inc_nested_handle_cnt(); 178 void dec_nested_handle_cnt(); 179 180 static ThreadsList* add_thread(ThreadsList* list, JavaThread* java_thread); 181 static ThreadsList* remove_thread(ThreadsList* list, JavaThread* java_thread); 182 183 // Used by find_JavaThread_from_java_tid 184 static bool is_valid_java_thread(jlong java_tid, JavaThread* jt); 185 public: 186 ThreadsList(int entries); 187 ~ThreadsList(); 188 189 template <class T> 190 void threads_do(T *cl) const; 191 192 uint length() const { return _length; } 193 194 JavaThread *const thread_at(uint i) const { return _threads[i]; } 195 196 JavaThread *const *threads() const { return _threads; } 197 198 // Returns -1 if target is not found. 199 int find_index_of_JavaThread(JavaThread* target); 200 JavaThread* find_JavaThread_from_java_tid(jlong java_tid) const; 201 bool includes(const JavaThread * const p) const; 202 }; 203 204 // An abstract safe ptr to a ThreadsList comprising either a stable hazard ptr |