TLA Line data Source code
1 : //
2 : // Copyright (c) 2026 Michael Vandeberg
3 : //
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)
6 : //
7 : // Official repository: https://github.com/cppalliance/corosio
8 : //
9 :
10 : #ifndef BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
11 : #define BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
12 :
13 : #include <boost/corosio/detail/conditionally_enabled_mutex.hpp>
14 :
15 : #include <chrono>
16 : #include <condition_variable>
17 :
18 : namespace boost::corosio::detail {
19 :
20 : /* Condition variable wrapper that becomes a no-op when disabled.
21 :
22 : When enabled, notify/wait delegate to an underlying
23 : std::condition_variable. When disabled, all operations
24 : are no-ops. The wait paths are unreachable in
25 : single-threaded mode because the task sentinel prevents
26 : the empty-queue state in do_one().
27 : */
28 : class conditionally_enabled_event
29 : {
30 : std::condition_variable cond_;
31 : bool enabled_;
32 :
33 : public:
34 HIT 2118 : explicit conditionally_enabled_event(bool enabled = true) noexcept
35 2118 : : enabled_(enabled)
36 : {
37 2118 : }
38 :
39 : conditionally_enabled_event(conditionally_enabled_event const&) = delete;
40 : conditionally_enabled_event&
41 : operator=(conditionally_enabled_event const&) = delete;
42 :
43 2106 : void set_enabled(bool v) noexcept
44 : {
45 2106 : enabled_ = v;
46 2106 : }
47 :
48 44 : void notify_one()
49 : {
50 44 : if (enabled_)
51 44 : cond_.notify_one();
52 44 : }
53 :
54 3859 : void notify_all()
55 : {
56 3859 : if (enabled_)
57 3847 : cond_.notify_all();
58 3859 : }
59 :
60 9 : void wait(conditionally_enabled_mutex::scoped_lock& lock)
61 : {
62 9 : if (enabled_)
63 9 : cond_.wait(lock.underlying());
64 9 : }
65 :
66 : template<class Rep, class Period>
67 31 : void wait_for(
68 : conditionally_enabled_mutex::scoped_lock& lock,
69 : std::chrono::duration<Rep, Period> const& d)
70 : {
71 31 : if (enabled_)
72 31 : cond_.wait_for(lock.underlying(), d);
73 31 : }
74 : };
75 :
76 : } // namespace boost::corosio::detail
77 :
78 : #endif // BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
|