2
3
6
7
8
9
10
11
13#include <so_5/disp/mpmc_queue_traits/pub.hpp>
15#include <so_5/spinlocks.hpp>
18#include <condition_variable>
29using spinlock_t =
so_5::default_spinlock_t;
35
36
37
38
39
59 spinlock_t & spinlock,
61 std::chrono::high_resolution_clock::duration waiting_time )
69 using hrc = std::chrono::high_resolution_clock;
72
73
74
82 const auto stop_point = hrc::now() + m_waiting_time;
88 std::this_thread::yield();
95 while( stop_point > hrc::now() );
108 std::unique_lock< std::mutex > mutex_lock{ m_mutex };
113 m_condition.wait( mutex_lock, [
this]{
return m_signaled; } );
123 std::lock_guard< std::mutex > mutex_lock{ m_mutex };
127 m_condition.notify_one();
135
136
137
138
139
151 std::chrono::high_resolution_clock::duration waiting_time )
170 return condition_unique_ptr_t{
171 new actual_cond_t{ m_spinlock, m_waiting_time } };
184
185
186
187
188
189
214 std::unique_lock< std::mutex > mutex_lock{ m_mutex, std::adopt_lock };
215 m_condition.wait( mutex_lock, [
this]{
return m_signaled; } );
218 mutex_lock.release();
226 m_condition.notify_one();
234
235
236
237
238
239
264 return condition_unique_ptr_t{
new actual_cond_t{ m_mutex } };
277 return [waiting_time] {
278 return lock_unique_ptr_t{
new combined_lock::actual_lock_t{
279 std::move(waiting_time) } };
290 return lock_unique_ptr_t{
new simple_lock::actual_lock_t{} };
Impementation of condition object for the case of combined lock.
virtual void notify() noexcept override
Notification for waiting customer.
actual_cond_t(spinlock_t &spinlock, std::chrono::high_resolution_clock::duration waiting_time)
Initializing constructor.
virtual void wait() noexcept override
Waiting on condition.
std::mutex m_mutex
Personal mutex to be used with condition variable.
const std::chrono::high_resolution_clock::duration m_waiting_time
Max waiting time for busy waiting stage.
std::condition_variable m_condition
Condition variable for long-time waiting.
bool m_signaled
An indicator of notification for condition object.
spinlock_t & m_spinlock
Spinlock from parent lock object.
Actual implementation of combined lock object.
const std::chrono::high_resolution_clock::duration m_waiting_time
Max waiting time for busy waiting stage.
actual_lock_t(std::chrono::high_resolution_clock::duration waiting_time)
Initializing constructor.
spinlock_t m_spinlock
Common spinlock for locking of producers and consumers.
virtual condition_unique_ptr_t allocate_condition() override
Create condition object for another MPMC queue's customer.
virtual void unlock() noexcept override
Unlock object locked in exclusive mode.
virtual void lock() noexcept override
Lock object in exclusive mode.
An interface for somethine like condition variable for waiting on MPMC queue lock.
An interface for lock for MPMC queue.
Actual implementation of condition object for the case of simple locking on mutex and condition_varia...
virtual void notify() noexcept override
Notification for waiting customer.
virtual void wait() noexcept override
Waiting on condition.
std::condition_variable m_condition
Personal condition_variable object for condition object owner.
std::mutex & m_mutex
Common mutex from the parent lock.
actual_cond_t(std::mutex &mutex)
Initializing constructor.
bool m_signaled
An indicator of notification for condition object.
Actual implementation of lock object for simple locking on mutex and condition variables.
std::mutex m_mutex
Common mutex for all producers and consumers.
virtual void unlock() noexcept override
Unlock object locked in exclusive mode.
virtual void lock() noexcept override
Lock object in exclusive mode.
virtual condition_unique_ptr_t allocate_condition() override
Create condition object for another MPMC queue's customer.
Implementation of combined lock for MPMC event queue.
Implementation of simple lock for MPMC event queue.
Various stuff related to MPMC event queue implementation and tuning.
SO_5_FUNC lock_factory_t combined_lock_factory(std::chrono::high_resolution_clock::duration waiting_time)
Factory for creation of combined queue lock with the specified waiting time.
SO_5_FUNC lock_factory_t simple_lock_factory()
Factory for creation of very simple implementation based on usage of mutex and condition_variable onl...
Private part of message limit implementation.