1  
//
1  
//
2  
// Copyright (c) 2026 Michael Vandeberg
2  
// Copyright (c) 2026 Michael Vandeberg
3  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/cppalliance/corosio
7  
// Official repository: https://github.com/cppalliance/corosio
8  
//
8  
//
9  

9  

10  
#ifndef BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
10  
#ifndef BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
11  
#define BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
11  
#define BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
12  

12  

13  
#include <boost/corosio/detail/conditionally_enabled_mutex.hpp>
13  
#include <boost/corosio/detail/conditionally_enabled_mutex.hpp>
14  

14  

15  
#include <chrono>
15  
#include <chrono>
16  
#include <condition_variable>
16  
#include <condition_variable>
17  

17  

18  
namespace boost::corosio::detail {
18  
namespace boost::corosio::detail {
19  

19  

20  
/* Condition variable wrapper that becomes a no-op when disabled.
20  
/* Condition variable wrapper that becomes a no-op when disabled.
21  

21  

22  
   When enabled, notify/wait delegate to an underlying
22  
   When enabled, notify/wait delegate to an underlying
23  
   std::condition_variable. When disabled, all operations
23  
   std::condition_variable. When disabled, all operations
24  
   are no-ops. The wait paths are unreachable in
24  
   are no-ops. The wait paths are unreachable in
25  
   single-threaded mode because the task sentinel prevents
25  
   single-threaded mode because the task sentinel prevents
26  
   the empty-queue state in do_one().
26  
   the empty-queue state in do_one().
27  
*/
27  
*/
28  
class conditionally_enabled_event
28  
class conditionally_enabled_event
29  
{
29  
{
30  
    std::condition_variable cond_;
30  
    std::condition_variable cond_;
31  
    bool enabled_;
31  
    bool enabled_;
32  

32  

33  
public:
33  
public:
34  
    explicit conditionally_enabled_event(bool enabled = true) noexcept
34  
    explicit conditionally_enabled_event(bool enabled = true) noexcept
35  
        : enabled_(enabled)
35  
        : enabled_(enabled)
36  
    {
36  
    {
37  
    }
37  
    }
38  

38  

39  
    conditionally_enabled_event(conditionally_enabled_event const&)            = delete;
39  
    conditionally_enabled_event(conditionally_enabled_event const&)            = delete;
40  
    conditionally_enabled_event& operator=(conditionally_enabled_event const&) = delete;
40  
    conditionally_enabled_event& operator=(conditionally_enabled_event const&) = delete;
41  

41  

42  
    void set_enabled(bool v) noexcept
42  
    void set_enabled(bool v) noexcept
43  
    {
43  
    {
44  
        enabled_ = v;
44  
        enabled_ = v;
45  
    }
45  
    }
46  

46  

47  
    void notify_one()
47  
    void notify_one()
48  
    {
48  
    {
49  
        if (enabled_)
49  
        if (enabled_)
50  
            cond_.notify_one();
50  
            cond_.notify_one();
51  
    }
51  
    }
52  

52  

53  
    void notify_all()
53  
    void notify_all()
54  
    {
54  
    {
55  
        if (enabled_)
55  
        if (enabled_)
56  
            cond_.notify_all();
56  
            cond_.notify_all();
57  
    }
57  
    }
58  

58  

59  
    void wait(conditionally_enabled_mutex::scoped_lock& lock)
59  
    void wait(conditionally_enabled_mutex::scoped_lock& lock)
60  
    {
60  
    {
61  
        if (enabled_)
61  
        if (enabled_)
62  
            cond_.wait(lock.underlying());
62  
            cond_.wait(lock.underlying());
63  
    }
63  
    }
64  

64  

65  
    template<class Rep, class Period>
65  
    template<class Rep, class Period>
66  
    void wait_for(
66  
    void wait_for(
67  
        conditionally_enabled_mutex::scoped_lock& lock,
67  
        conditionally_enabled_mutex::scoped_lock& lock,
68  
        std::chrono::duration<Rep, Period> const& d)
68  
        std::chrono::duration<Rep, Period> const& d)
69  
    {
69  
    {
70  
        if (enabled_)
70  
        if (enabled_)
71  
            cond_.wait_for(lock.underlying(), d);
71  
            cond_.wait_for(lock.underlying(), d);
72  
    }
72  
    }
73  
};
73  
};
74  

74  

75  
} // namespace boost::corosio::detail
75  
} // namespace boost::corosio::detail
76  

76  

77  
#endif // BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
77  
#endif // BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP