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 515 : explicit conditionally_enabled_event(bool enabled = true) noexcept
35 515 : : enabled_(enabled)
36 : {
37 515 : }
38 :
39 : conditionally_enabled_event(conditionally_enabled_event const&) = delete;
40 : conditionally_enabled_event& operator=(conditionally_enabled_event const&) = delete;
41 :
42 MIS 0 : void set_enabled(bool v) noexcept
43 : {
44 0 : enabled_ = v;
45 0 : }
46 :
47 0 : void notify_one()
48 : {
49 0 : if (enabled_)
50 0 : cond_.notify_one();
51 0 : }
52 :
53 HIT 889 : void notify_all()
54 : {
55 889 : if (enabled_)
56 889 : cond_.notify_all();
57 889 : }
58 :
59 MIS 0 : void wait(conditionally_enabled_mutex::scoped_lock& lock)
60 : {
61 0 : if (enabled_)
62 0 : cond_.wait(lock.underlying());
63 0 : }
64 :
65 : template<class Rep, class Period>
66 0 : void wait_for(
67 : conditionally_enabled_mutex::scoped_lock& lock,
68 : std::chrono::duration<Rep, Period> const& d)
69 : {
70 0 : if (enabled_)
71 0 : cond_.wait_for(lock.underlying(), d);
72 0 : }
73 : };
74 :
75 : } // namespace boost::corosio::detail
76 :
77 : #endif // BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP
|