116 return _list;
117 }
118
119 template <class T>
120 void threads_do(T *cl) const {
121 return _list->threads_do(cl);
122 }
123
124 bool cv_internal_thread_to_JavaThread(jobject jthread, JavaThread ** jt_pp, oop * thread_oop_p);
125
126 bool includes(JavaThread* p) {
127 return _list->includes(p);
128 }
129
130 uint length() const {
131 return _list->length();
132 }
133 };
134
135 // This stack allocated JavaThreadIterator is used to walk the
136 // specified ThreadsList.
137 //
138 class JavaThreadIterator : public StackObj {
139 ThreadsList * _list;
140 uint _index;
141
142 public:
143 JavaThreadIterator(ThreadsList *list) : _list(list), _index(0) {
144 assert(list != NULL, "ThreadsList must not be NULL.");
145 }
146
147 JavaThread *first() {
148 _index = 0;
149 return _list->thread_at(_index);
150 }
151
152 uint length() const {
153 return _list->length();
154 }
155
156 ThreadsList *list() const {
157 return _list;
158 }
159
160 JavaThread *next() {
161 if (++_index >= length()) {
162 return NULL;
163 }
164 return _list->thread_at(_index);
165 }
166 };
167
168 #endif // SHARE_VM_RUNTIME_THREADSMR_HPP
|
116 return _list;
117 }
118
119 template <class T>
120 void threads_do(T *cl) const {
121 return _list->threads_do(cl);
122 }
123
124 bool cv_internal_thread_to_JavaThread(jobject jthread, JavaThread ** jt_pp, oop * thread_oop_p);
125
126 bool includes(JavaThread* p) {
127 return _list->includes(p);
128 }
129
130 uint length() const {
131 return _list->length();
132 }
133 };
134
135 // This stack allocated JavaThreadIterator is used to walk the
136 // specified ThreadsList using the following style:
137 //
138 // JavaThreadIterator jti(t_list);
139 // for (JavaThread *jt = jti.first(); jt != NULL; jt = jti.next()) {
140 // ...
141 // }
142 //
143 class JavaThreadIterator : public StackObj {
144 ThreadsList * _list;
145 uint _index;
146
147 public:
148 JavaThreadIterator(ThreadsList *list) : _list(list), _index(0) {
149 assert(list != NULL, "ThreadsList must not be NULL.");
150 }
151
152 JavaThread *first() {
153 _index = 0;
154 return _list->thread_at(_index);
155 }
156
157 uint length() const {
158 return _list->length();
159 }
160
161 ThreadsList *list() const {
162 return _list;
163 }
164
165 JavaThread *next() {
166 if (++_index >= length()) {
167 return NULL;
168 }
169 return _list->thread_at(_index);
170 }
171 };
172
173 // This stack allocated ThreadsListHandle and JavaThreadIterator combo
174 // is used to walk the ThreadsList in the included ThreadsListHandle
175 // using the following style:
176 //
177 // for (JavaThreadIteratorWithHandle jtiwh; JavaThread *jt = jtiwh.next(); ) {
178 // ...
179 // }
180 //
181 class JavaThreadIteratorWithHandle : public StackObj {
182 ThreadsListHandle _tlh;
183 uint _index;
184
185 public:
186 JavaThreadIteratorWithHandle() : _tlh(), _index(0) {}
187
188 uint length() const {
189 return _tlh.length();
190 }
191
192 ThreadsList *list() const {
193 return _tlh.list();
194 }
195
196 JavaThread *next() {
197 if (_index >= length()) {
198 return NULL;
199 }
200 return _tlh.list()->thread_at(_index++);
201 }
202
203 void rewind() {
204 _index = 0;
205 }
206 };
207
208 #endif // SHARE_VM_RUNTIME_THREADSMR_HPP
|