Add check before thread wake up
This commit is contained in:
parent
c71f14fc00
commit
2b0c6648fd
1 changed files with 28 additions and 26 deletions
|
|
@ -51,9 +51,13 @@ void nano::scheduler::optimistic::stop ()
|
||||||
}
|
}
|
||||||
|
|
||||||
void nano::scheduler::optimistic::notify ()
|
void nano::scheduler::optimistic::notify ()
|
||||||
|
{
|
||||||
|
// Only wake up the thread if there is space inside AEC for optimistic elections
|
||||||
|
if (active.vacancy (nano::election_behavior::optimistic) > 0)
|
||||||
{
|
{
|
||||||
condition.notify_all ();
|
condition.notify_all ();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool nano::scheduler::optimistic::activate_predicate (const nano::account_info & account_info, const nano::confirmation_height_info & conf_info) const
|
bool nano::scheduler::optimistic::activate_predicate (const nano::account_info & account_info, const nano::confirmation_height_info & conf_info) const
|
||||||
{
|
{
|
||||||
|
|
@ -79,8 +83,6 @@ bool nano::scheduler::optimistic::activate (const nano::account & account, const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool activated = false;
|
|
||||||
|
|
||||||
if (activate_predicate (account_info, conf_info))
|
if (activate_predicate (account_info, conf_info))
|
||||||
{
|
{
|
||||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||||
|
|
@ -99,15 +101,12 @@ bool nano::scheduler::optimistic::activate (const nano::account & account, const
|
||||||
candidates.pop_front ();
|
candidates.pop_front ();
|
||||||
}
|
}
|
||||||
|
|
||||||
activated = inserted;
|
// Not notifying the thread immediately here, since we need to wait for activation_delay to elapse
|
||||||
|
|
||||||
|
return inserted;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activated)
|
return false; // Not activated
|
||||||
{
|
|
||||||
condition.notify_all ();
|
|
||||||
}
|
|
||||||
|
|
||||||
return activated;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool nano::scheduler::optimistic::predicate () const
|
bool nano::scheduler::optimistic::predicate () const
|
||||||
|
|
@ -134,8 +133,6 @@ void nano::scheduler::optimistic::run ()
|
||||||
nano::unique_lock<nano::mutex> lock{ mutex };
|
nano::unique_lock<nano::mutex> lock{ mutex };
|
||||||
while (!stopped)
|
while (!stopped)
|
||||||
{
|
{
|
||||||
stats.inc (nano::stat::type::optimistic_scheduler, nano::stat::detail::loop);
|
|
||||||
|
|
||||||
condition.wait_for (lock, config.activation_delay / 2, [this] () {
|
condition.wait_for (lock, config.activation_delay / 2, [this] () {
|
||||||
return stopped || predicate ();
|
return stopped || predicate ();
|
||||||
});
|
});
|
||||||
|
|
@ -145,6 +142,10 @@ void nano::scheduler::optimistic::run ()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (predicate ())
|
||||||
|
{
|
||||||
|
stats.inc (nano::stat::type::optimistic_scheduler, nano::stat::detail::loop);
|
||||||
|
|
||||||
lock.unlock ();
|
lock.unlock ();
|
||||||
|
|
||||||
// Acquire transaction outside of the lock
|
// Acquire transaction outside of the lock
|
||||||
|
|
@ -168,6 +169,7 @@ void nano::scheduler::optimistic::run ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void nano::scheduler::optimistic::run_one (secure::transaction const & transaction, entry const & candidate)
|
void nano::scheduler::optimistic::run_one (secure::transaction const & transaction, entry const & candidate)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue