LCOV - code coverage report
Current view: top level - corosio/detail - conditionally_enabled_mutex.hpp (source / functions) Coverage Total Hit Missed
Test: coverage_remapped.info Lines: 92.3 % 26 24 2
Test Date: 2026-03-27 21:00:37 Functions: 88.9 % 9 8 1

           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_MUTEX_HPP
      11                 : #define BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_MUTEX_HPP
      12                 : 
      13                 : #include <mutex>
      14                 : 
      15                 : namespace boost::corosio::detail {
      16                 : 
      17                 : /* Mutex wrapper that becomes a no-op when disabled.
      18                 : 
      19                 :    When enabled (the default), lock/unlock delegate to an
      20                 :    underlying std::mutex. When disabled, all operations are
      21                 :    no-ops. The enabled flag is fixed after construction.
      22                 : 
      23                 :    scoped_lock wraps std::unique_lock<std::mutex> internally
      24                 :    so that condvar wait paths (which require the real lock
      25                 :    type) compile and work in multi-threaded mode.
      26                 : */
      27                 : class conditionally_enabled_mutex
      28                 : {
      29                 :     std::mutex mutex_;
      30                 :     bool enabled_;
      31                 : 
      32                 : public:
      33 HIT       25883 :     explicit conditionally_enabled_mutex(bool enabled = true) noexcept
      34           25883 :         : enabled_(enabled)
      35                 :     {
      36           25883 :     }
      37                 : 
      38                 :     conditionally_enabled_mutex(conditionally_enabled_mutex const&)            = delete;
      39                 :     conditionally_enabled_mutex& operator=(conditionally_enabled_mutex const&) = delete;
      40                 : 
      41                 :     bool enabled() const noexcept
      42                 :     {
      43                 :         return enabled_;
      44                 :     }
      45                 : 
      46           16947 :     void set_enabled(bool v) noexcept
      47                 :     {
      48           16947 :         enabled_ = v;
      49           16947 :     }
      50                 : 
      51                 :     // Lockable interface — allows std::lock_guard<conditionally_enabled_mutex>
      52          110756 :     void lock() { if (enabled_) mutex_.lock(); }
      53          110756 :     void unlock() { if (enabled_) mutex_.unlock(); }
      54                 :     bool try_lock() { return !enabled_ || mutex_.try_lock(); }
      55                 : 
      56                 :     class scoped_lock
      57                 :     {
      58                 :         std::unique_lock<std::mutex> lock_;
      59                 :         bool enabled_;
      60                 : 
      61                 :     public:
      62          502291 :         explicit scoped_lock(conditionally_enabled_mutex& m)
      63          502291 :             : lock_(m.mutex_, std::defer_lock)
      64          502291 :             , enabled_(m.enabled_)
      65                 :         {
      66          502291 :             if (enabled_)
      67          502291 :                 lock_.lock();
      68          502291 :         }
      69                 : 
      70                 :         scoped_lock(scoped_lock const&)            = delete;
      71                 :         scoped_lock& operator=(scoped_lock const&) = delete;
      72                 : 
      73          465851 :         void lock()
      74                 :         {
      75          465851 :             if (enabled_)
      76          465851 :                 lock_.lock();
      77          465851 :         }
      78                 : 
      79          468167 :         void unlock()
      80                 :         {
      81          468167 :             if (enabled_)
      82          468167 :                 lock_.unlock();
      83          468167 :         }
      84                 : 
      85          474518 :         bool owns_lock() const noexcept
      86                 :         {
      87          474518 :             return enabled_ && lock_.owns_lock();
      88                 :         }
      89                 : 
      90                 :         // Access the underlying unique_lock for condvar wait().
      91                 :         // Only called when locking is enabled.
      92 MIS           0 :         std::unique_lock<std::mutex>& underlying() noexcept
      93                 :         {
      94               0 :             return lock_;
      95                 :         }
      96                 :     };
      97                 : };
      98                 : 
      99                 : } // namespace boost::corosio::detail
     100                 : 
     101                 : #endif // BOOST_COROSIO_DETAIL_CONDITIONALLY_ENABLED_MUTEX_HPP
        

Generated by: LCOV version 2.3