15 #include "rclcpp/wait_set_policies/detail/write_preferring_read_write_lock.hpp"
19 namespace wait_set_policies
24 WritePreferringReadWriteLock::WritePreferringReadWriteLock(
25 std::function<
void()> enter_waiting_function)
26 : read_mutex_(*this), write_mutex_(*this), enter_waiting_function_(enter_waiting_function)
29 WritePreferringReadWriteLock::ReadMutex &
30 WritePreferringReadWriteLock::get_read_mutex()
36 WritePreferringReadWriteLock::get_write_mutex()
42 : parent_lock_(parent_lock)
46 WritePreferringReadWriteLock::ReadMutex::lock()
48 std::unique_lock<std::mutex> lock(parent_lock_.mutex_);
50 parent_lock_.number_of_writers_waiting_ > 0 ||
51 parent_lock_.writer_active_ ||
52 parent_lock_.reader_active_)
54 parent_lock_.condition_variable_.wait(lock);
56 parent_lock_.reader_active_ =
true;
61 WritePreferringReadWriteLock::ReadMutex::unlock()
63 std::unique_lock<std::mutex> lock(parent_lock_.mutex_);
64 parent_lock_.reader_active_ =
false;
65 parent_lock_.condition_variable_.notify_all();
69 WritePreferringReadWriteLock::WriteMutex::WriteMutex(WritePreferringReadWriteLock & parent_lock)
70 : parent_lock_(parent_lock)
74 WritePreferringReadWriteLock::WriteMutex::lock()
76 std::unique_lock<std::mutex> lock(parent_lock_.mutex_);
77 parent_lock_.number_of_writers_waiting_ += 1;
78 if (
nullptr != parent_lock_.enter_waiting_function_) {
79 parent_lock_.enter_waiting_function_();
81 while (parent_lock_.reader_active_ || parent_lock_.writer_active_) {
82 parent_lock_.condition_variable_.wait(lock);
84 parent_lock_.number_of_writers_waiting_ -= 1;
85 parent_lock_.writer_active_ =
true;
90 WritePreferringReadWriteLock::WriteMutex::unlock()
92 std::unique_lock<std::mutex> lock(parent_lock_.mutex_);
93 parent_lock_.writer_active_ =
false;
94 parent_lock_.condition_variable_.notify_all();
Write mutex for the WritePreferringReadWriteLock.
Writer-perferring read-write lock.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.