mirror of
https://github.com/BlackMATov/promise.hpp.git
synced 2025-12-15 12:29:50 +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 wait_all() const noexcept;
|
||||||
jobber_wait_status active_wait_all() noexcept;
|
jobber_wait_status active_wait_all() noexcept;
|
||||||
|
jobber_wait_status active_wait_one() noexcept;
|
||||||
|
|
||||||
template < typename Rep, typename Period >
|
template < typename Rep, typename Period >
|
||||||
jobber_wait_status wait_all_for(
|
jobber_wait_status wait_all_for(
|
||||||
@@ -225,6 +226,17 @@ namespace jobber_hpp
|
|||||||
: jobber_wait_status::no_timeout;
|
: 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 >
|
template < typename Rep, typename Period >
|
||||||
jobber_wait_status jobber::wait_all_for(
|
jobber_wait_status jobber::wait_all_for(
|
||||||
const std::chrono::duration<Rep, Period>& timeout_duration) const
|
const std::chrono::duration<Rep, Period>& timeout_duration) const
|
||||||
|
|||||||
@@ -117,6 +117,29 @@ TEST_CASE("jobber") {
|
|||||||
j.active_wait_all();
|
j.active_wait_all();
|
||||||
REQUIRE(counter == 10);
|
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);
|
jb::jobber j(1);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user