< prev index next >
src/hotspot/share/gc/shared/taskTerminator.cpp
Print this page
rev 57840 : imported patch 8215297-remove-ptt
rev 57841 : [mq]: 8215297-some-cleanup
rev 57842 : [mq]: 8238220-rename-owsttaskterminator
*** 23,100 ****
*
*/
#include "precompiled.hpp"
! #include "gc/shared/owstTaskTerminator.hpp"
#include "gc/shared/taskqueue.hpp"
#include "logging/log.hpp"
#ifdef TRACESPINNING
! uint OWSTTaskTerminator::_total_yields = 0;
! uint OWSTTaskTerminator::_total_spins = 0;
! uint OWSTTaskTerminator::_total_peeks = 0;
#endif
! OWSTTaskTerminator::OWSTTaskTerminator(uint n_threads, TaskQueueSetSuper* queue_set) :
_n_threads(n_threads),
_queue_set(queue_set),
_offered_termination(0),
_spin_master(NULL) {
! _blocker = new Monitor(Mutex::leaf, "OWSTTaskTerminator", false, Monitor::_safepoint_check_never);
}
! OWSTTaskTerminator::~OWSTTaskTerminator() {
assert(_offered_termination == 0 || !peek_in_queue_set(), "Precondition");
assert(_offered_termination == 0 || _offered_termination == _n_threads, "Terminated or aborted" );
assert(_spin_master == NULL, "Should have been reset");
assert(_blocker != NULL, "Can not be NULL");
delete _blocker;
}
#ifdef ASSERT
! bool OWSTTaskTerminator::peek_in_queue_set() {
return _queue_set->peek();
}
#endif
! void OWSTTaskTerminator::yield() {
assert(_offered_termination <= _n_threads, "Invariant");
os::naked_yield();
}
#ifdef TRACESPINNING
! void OWSTTaskTerminator::print_termination_counts() {
log_trace(gc, task)("TaskTerminator Yields: %u Spins: %u Peeks: %u",
total_yields(), total_spins(), total_peeks());
}
#endif
! void OWSTTaskTerminator::reset_for_reuse() {
if (_offered_termination != 0) {
assert(_offered_termination == _n_threads,
"Terminator may still be in use");
_offered_termination = 0;
}
}
! void OWSTTaskTerminator::reset_for_reuse(uint n_threads) {
reset_for_reuse();
_n_threads = n_threads;
}
! bool OWSTTaskTerminator::exit_termination(size_t tasks, TerminatorTerminator* terminator) {
return tasks > 0 || (terminator != NULL && terminator->should_exit_termination());
}
! size_t OWSTTaskTerminator::tasks_in_queue_set() const {
return _queue_set->tasks();
}
! bool OWSTTaskTerminator::offer_termination(TerminatorTerminator* terminator) {
assert(_n_threads > 0, "Initialization is incorrect");
assert(_offered_termination < _n_threads, "Invariant");
assert(_blocker != NULL, "Invariant");
// Single worker, done
--- 23,100 ----
*
*/
#include "precompiled.hpp"
! #include "gc/shared/taskTerminator.hpp"
#include "gc/shared/taskqueue.hpp"
#include "logging/log.hpp"
#ifdef TRACESPINNING
! uint TaskTerminator::_total_yields = 0;
! uint TaskTerminator::_total_spins = 0;
! uint TaskTerminator::_total_peeks = 0;
#endif
! TaskTerminator::TaskTerminator(uint n_threads, TaskQueueSetSuper* queue_set) :
_n_threads(n_threads),
_queue_set(queue_set),
_offered_termination(0),
_spin_master(NULL) {
! _blocker = new Monitor(Mutex::leaf, "TaskTerminator", false, Monitor::_safepoint_check_never);
}
! TaskTerminator::~TaskTerminator() {
assert(_offered_termination == 0 || !peek_in_queue_set(), "Precondition");
assert(_offered_termination == 0 || _offered_termination == _n_threads, "Terminated or aborted" );
assert(_spin_master == NULL, "Should have been reset");
assert(_blocker != NULL, "Can not be NULL");
delete _blocker;
}
#ifdef ASSERT
! bool TaskTerminator::peek_in_queue_set() {
return _queue_set->peek();
}
#endif
! void TaskTerminator::yield() {
assert(_offered_termination <= _n_threads, "Invariant");
os::naked_yield();
}
#ifdef TRACESPINNING
! void TaskTerminator::print_termination_counts() {
log_trace(gc, task)("TaskTerminator Yields: %u Spins: %u Peeks: %u",
total_yields(), total_spins(), total_peeks());
}
#endif
! void TaskTerminator::reset_for_reuse() {
if (_offered_termination != 0) {
assert(_offered_termination == _n_threads,
"Terminator may still be in use");
_offered_termination = 0;
}
}
! void TaskTerminator::reset_for_reuse(uint n_threads) {
reset_for_reuse();
_n_threads = n_threads;
}
! bool TaskTerminator::exit_termination(size_t tasks, TerminatorTerminator* terminator) {
return tasks > 0 || (terminator != NULL && terminator->should_exit_termination());
}
! size_t TaskTerminator::tasks_in_queue_set() const {
return _queue_set->tasks();
}
! bool TaskTerminator::offer_termination(TerminatorTerminator* terminator) {
assert(_n_threads > 0, "Initialization is incorrect");
assert(_offered_termination < _n_threads, "Invariant");
assert(_blocker != NULL, "Invariant");
// Single worker, done
*** 153,163 ****
return false;
}
}
}
! bool OWSTTaskTerminator::do_spin_master_work(TerminatorTerminator* terminator) {
uint yield_count = 0;
// Number of hard spin loops done since last yield
uint hard_spin_count = 0;
// Number of iterations in the hard spin loop.
uint hard_spin_limit = WorkStealingHardSpins;
--- 153,163 ----
return false;
}
}
}
! bool TaskTerminator::do_spin_master_work(TerminatorTerminator* terminator) {
uint yield_count = 0;
// Number of hard spin loops done since last yield
uint hard_spin_count = 0;
// Number of iterations in the hard spin loop.
uint hard_spin_limit = WorkStealingHardSpins;
*** 207,217 ****
#ifdef TRACESPINNING
_total_spins++;
#endif
}
} else {
! log_develop_trace(gc, task)("OWSTTaskTerminator::do_spin_master_work() thread " PTR_FORMAT " sleeps after %u yields",
p2i(Thread::current()), yield_count);
yield_count = 0;
MonitorLocker locker(_blocker, Mutex::_no_safepoint_check_flag);
_spin_master = NULL;
--- 207,217 ----
#ifdef TRACESPINNING
_total_spins++;
#endif
}
} else {
! log_develop_trace(gc, task)("TaskTerminator::do_spin_master_work() thread " PTR_FORMAT " sleeps after %u yields",
p2i(Thread::current()), yield_count);
yield_count = 0;
MonitorLocker locker(_blocker, Mutex::_no_safepoint_check_flag);
_spin_master = NULL;
< prev index next >