20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "oops/oop.inline.hpp"
27 #include "runtime/os.hpp"
28 #include "utilities/debug.hpp"
29 #include "utilities/stack.inline.hpp"
30 #include "utilities/taskqueue.hpp"
31 #ifdef TARGET_OS_FAMILY_linux
32 # include "thread_linux.inline.hpp"
33 #endif
34 #ifdef TARGET_OS_FAMILY_solaris
35 # include "thread_solaris.inline.hpp"
36 #endif
37 #ifdef TARGET_OS_FAMILY_windows
38 # include "thread_windows.inline.hpp"
39 #endif
40
41 #ifdef TRACESPINNING
42 uint ParallelTaskTerminator::_total_yields = 0;
43 uint ParallelTaskTerminator::_total_spins = 0;
44 uint ParallelTaskTerminator::_total_peeks = 0;
45 #endif
46
47 #if TASKQUEUE_STATS
48 const char * const TaskQueueStats::_names[last_stat_id] = {
49 "qpush", "qpop", "qpop-s", "qattempt", "qsteal", "opush", "omax"
50 };
51
52 TaskQueueStats & TaskQueueStats::operator +=(const TaskQueueStats & addend)
53 {
54 for (unsigned int i = 0; i < last_stat_id; ++i) {
55 _stats[i] += addend._stats[i];
56 }
57 return *this;
58 }
59
257
258 void ParallelTaskTerminator::reset_for_reuse() {
259 if (_offered_termination != 0) {
260 assert(_offered_termination == _n_threads,
261 "Terminator may still be in use");
262 _offered_termination = 0;
263 }
264 }
265
266 #ifdef ASSERT
267 bool ObjArrayTask::is_valid() const {
268 return _obj != NULL && _obj->is_objArray() && _index > 0 &&
269 _index < objArrayOop(_obj)->length();
270 }
271 #endif // ASSERT
272
273 void ParallelTaskTerminator::reset_for_reuse(int n_threads) {
274 reset_for_reuse();
275 _n_threads = n_threads;
276 }
277
|
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "oops/oop.inline.hpp"
27 #include "runtime/os.hpp"
28 #include "utilities/debug.hpp"
29 #include "utilities/stack.inline.hpp"
30 #include "utilities/taskqueue.hpp"
31 #ifdef TARGET_OS_FAMILY_linux
32 # include "thread_linux.inline.hpp"
33 #endif
34 #ifdef TARGET_OS_FAMILY_solaris
35 # include "thread_solaris.inline.hpp"
36 #endif
37 #ifdef TARGET_OS_FAMILY_windows
38 # include "thread_windows.inline.hpp"
39 #endif
40 #ifdef TARGET_OS_FAMILY_bsd
41 # include "thread_bsd.inline.hpp"
42 #endif
43
44 #ifdef TRACESPINNING
45 uint ParallelTaskTerminator::_total_yields = 0;
46 uint ParallelTaskTerminator::_total_spins = 0;
47 uint ParallelTaskTerminator::_total_peeks = 0;
48 #endif
49
50 #if TASKQUEUE_STATS
51 const char * const TaskQueueStats::_names[last_stat_id] = {
52 "qpush", "qpop", "qpop-s", "qattempt", "qsteal", "opush", "omax"
53 };
54
55 TaskQueueStats & TaskQueueStats::operator +=(const TaskQueueStats & addend)
56 {
57 for (unsigned int i = 0; i < last_stat_id; ++i) {
58 _stats[i] += addend._stats[i];
59 }
60 return *this;
61 }
62
260
261 void ParallelTaskTerminator::reset_for_reuse() {
262 if (_offered_termination != 0) {
263 assert(_offered_termination == _n_threads,
264 "Terminator may still be in use");
265 _offered_termination = 0;
266 }
267 }
268
269 #ifdef ASSERT
270 bool ObjArrayTask::is_valid() const {
271 return _obj != NULL && _obj->is_objArray() && _index > 0 &&
272 _index < objArrayOop(_obj)->length();
273 }
274 #endif // ASSERT
275
276 void ParallelTaskTerminator::reset_for_reuse(int n_threads) {
277 reset_for_reuse();
278 _n_threads = n_threads;
279 }
|