50.00% Lines (11/22)
50.00% Functions (3/6)
| TLA | Baseline | Branch | ||||||
|---|---|---|---|---|---|---|---|---|
| Line | Hits | Code | Line | Hits | Code | |||
| 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: | |||||
| HITCBC | 34 | 605 | explicit conditionally_enabled_event(bool enabled = true) noexcept | 34 | 605 | explicit conditionally_enabled_event(bool enabled = true) noexcept | ||
| HITCBC | 35 | 605 | : enabled_(enabled) | 35 | 605 | : enabled_(enabled) | ||
| 36 | { | 36 | { | |||||
| HITCBC | 37 | 605 | } | 37 | 605 | } | ||
| 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 | |||||||
| MISUBC | 42 | ✗ | void set_enabled(bool v) noexcept | 42 | ✗ | void set_enabled(bool v) noexcept | ||
| 43 | { | 43 | { | |||||
| MISUBC | 44 | ✗ | enabled_ = v; | 44 | ✗ | enabled_ = v; | ||
| MISUBC | 45 | ✗ | } | 45 | ✗ | } | ||
| 46 | 46 | |||||||
| MISUBC | 47 | ✗ | void notify_one() | 47 | ✗ | void notify_one() | ||
| 48 | { | 48 | { | |||||
| MISUBC | 49 | ✗ | if (enabled_) | 49 | ✗ | if (enabled_) | ||
| MISUBC | 50 | ✗ | cond_.notify_one(); | 50 | ✗ | cond_.notify_one(); | ||
| MISUBC | 51 | ✗ | } | 51 | ✗ | } | ||
| 52 | 52 | |||||||
| HITCBC | 53 | 1025 | void notify_all() | 53 | 1025 | void notify_all() | ||
| 54 | { | 54 | { | |||||
| HITCBC | 55 | 1025 | if (enabled_) | 55 | 1025 | if (enabled_) | ||
| HITCBC | 56 | 1025 | cond_.notify_all(); | 56 | 1025 | cond_.notify_all(); | ||
| HITCBC | 57 | 1025 | } | 57 | 1025 | } | ||
| 58 | 58 | |||||||
| HITGBC | 59 | ✗ | void wait(conditionally_enabled_mutex::scoped_lock& lock) | 59 | 1 | void wait(conditionally_enabled_mutex::scoped_lock& lock) | ||
| 60 | { | 60 | { | |||||
| HITGBC | 61 | ✗ | if (enabled_) | 61 | 1 | if (enabled_) | ||
| HITGBC | 62 | ✗ | cond_.wait(lock.underlying()); | 62 | 1 | cond_.wait(lock.underlying()); | ||
| HITGBC | 63 | ✗ | } | 63 | 1 | } | ||
| 64 | 64 | |||||||
| 65 | template<class Rep, class Period> | 65 | template<class Rep, class Period> | |||||
| MISUBC | 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 | { | |||||
| MISUBC | 70 | ✗ | if (enabled_) | 70 | ✗ | if (enabled_) | ||
| MISUBC | 71 | ✗ | cond_.wait_for(lock.underlying(), d); | 71 | ✗ | cond_.wait_for(lock.underlying(), d); | ||
| MISUBC | 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 | |||||