jobber: active_wait_one

This commit is contained in:
2018-12-22 02:25:38 +07:00
parent e865f3d679
commit ff6f80a5ef
2 changed files with 35 additions and 0 deletions

View File

@@ -72,6 +72,7 @@ namespace jobber_hpp
jobber_wait_status wait_all() const noexcept;
jobber_wait_status active_wait_all() noexcept;
jobber_wait_status active_wait_one() noexcept;
template < typename Rep, typename Period >
jobber_wait_status wait_all_for(
@@ -225,6 +226,17 @@ namespace jobber_hpp
: jobber_wait_status::no_timeout;
}
inline jobber_wait_status jobber::active_wait_one() noexcept {
std::unique_lock<std::mutex> lock(tasks_mutex_);
if ( cancelled_ ) {
return jobber_wait_status::cancelled;
}
if ( !tasks_.empty() ) {
process_task_(std::move(lock));
}
return jobber_wait_status::no_timeout;
}
template < typename Rep, typename Period >
jobber_wait_status jobber::wait_all_for(
const std::chrono::duration<Rep, Period>& timeout_duration) const

View File

@@ -117,6 +117,29 @@ TEST_CASE("jobber") {
j.active_wait_all();
REQUIRE(counter == 10);
}
{
jb::jobber j(1);
std::atomic<int> counter = ATOMIC_VAR_INIT(0);
j.pause();
for ( std::size_t i = 0; i < 3; ++i ) {
j.async([&counter](){
++counter;
});
}
REQUIRE(counter == 0);
REQUIRE(j.active_wait_one() == jb::jobber_wait_status::no_timeout);
REQUIRE(counter == 1);
REQUIRE(j.active_wait_one() == jb::jobber_wait_status::no_timeout);
REQUIRE(counter == 2);
REQUIRE(j.active_wait_one() == jb::jobber_wait_status::no_timeout);
REQUIRE(counter == 3);
REQUIRE(j.active_wait_one() == jb::jobber_wait_status::no_timeout);
REQUIRE(counter == 3);
j.resume();
REQUIRE(j.wait_all() == jb::jobber_wait_status::no_timeout);
REQUIRE(j.active_wait_one() == jb::jobber_wait_status::no_timeout);
REQUIRE(counter == 3);
}
{
jb::jobber j(1);