mirror of
https://github.com/BlackMATov/promise.hpp.git
synced 2025-12-13 03:46:29 +07:00
jobber: active_wait_one
This commit is contained in:
12
jobber.hpp
12
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<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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user