25 #include "precompiled.hpp" |
25 #include "precompiled.hpp" |
26 #include "runtime/os.hpp" |
26 #include "runtime/os.hpp" |
27 #include "utilities/ostream.hpp" |
27 #include "utilities/ostream.hpp" |
28 #include "utilities/spinYield.hpp" |
28 #include "utilities/spinYield.hpp" |
29 |
29 |
30 SpinYield::SpinYield(uint spin_limit, uint yield_limit) : |
30 SpinYield::SpinYield(uint spin_limit, uint yield_limit, uint sleep_ns) : |
31 _sleep_time(), |
31 _sleep_time(), |
32 _spins(0), |
32 _spins(0), |
33 _yields(0), |
33 _yields(0), |
34 _spin_limit(os::is_MP() ? spin_limit : 0), |
34 _spin_limit(os::is_MP() ? spin_limit : 0), |
35 _yield_limit(yield_limit) |
35 _yield_limit(yield_limit), |
|
36 _sleep_ns(sleep_ns) |
36 {} |
37 {} |
37 |
38 |
38 void SpinYield::yield_or_sleep() { |
39 void SpinYield::yield_or_sleep() { |
39 if (_yields < _yield_limit) { |
40 if (_yields < _yield_limit) { |
40 ++_yields; |
41 ++_yields; |
41 os::naked_yield(); |
42 os::naked_yield(); |
42 } else { |
43 } else { |
43 Ticks sleep_start = Ticks::now(); |
44 Ticks sleep_start = Ticks::now(); |
44 os::naked_short_sleep(1); |
45 os::naked_short_nanosleep(_sleep_ns); |
45 _sleep_time += Ticks::now() - sleep_start; |
46 _sleep_time += Ticks::now() - sleep_start; |
46 } |
47 } |
47 } |
48 } |
48 |
49 |
49 static const char* print_separator(outputStream* s, const char* separator) { |
50 static const char* print_separator(outputStream* s, const char* separator) { |