diff --git a/jobber.hpp b/jobber.hpp index db4341e..2bcbc15 100644 --- a/jobber.hpp +++ b/jobber.hpp @@ -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 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& timeout_duration) const diff --git a/jobber_tests.cpp b/jobber_tests.cpp index a279bb9..02d934a 100644 --- a/jobber_tests.cpp +++ b/jobber_tests.cpp @@ -117,6 +117,29 @@ TEST_CASE("jobber") { j.active_wait_all(); REQUIRE(counter == 10); } + { + jb::jobber j(1); + std::atomic 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);