From a0fa6e31d8141ab920176832bca205ef33a6072c Mon Sep 17 00:00:00 2001 From: Emerson Knapp <537409+emersonknapp@users.noreply.github.com> Date: Wed, 6 Sep 2023 04:56:45 -0700 Subject: [PATCH] Add unique_lock implementation with clang thread safety annotations (#180) * Add unique_lock implementation with clang thread safety annotations Signed-off-by: Emerson Knapp Co-authored-by: Chris Lalancette --- CMakeLists.txt | 3 +++ include/rcpputils/unique_lock.hpp | 43 +++++++++++++++++++++++++++++++ test/test_unique_lock.cpp | 26 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 include/rcpputils/unique_lock.hpp create mode 100644 test/test_unique_lock.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b2a6772..d2d51b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,6 +140,9 @@ if(BUILD_TESTING) ament_add_gtest(test_accumulator test/test_accumulator.cpp) target_link_libraries(test_accumulator ${PROJECT_NAME}) + + ament_add_gtest(test_unique_lock test/test_unique_lock.cpp) + target_link_libraries(test_unique_lock ${PROJECT_NAME}) endif() ament_package() diff --git a/include/rcpputils/unique_lock.hpp b/include/rcpputils/unique_lock.hpp new file mode 100644 index 0000000..121b8b6 --- /dev/null +++ b/include/rcpputils/unique_lock.hpp @@ -0,0 +1,43 @@ +// Copyright 2023 Open Source Robotics Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef RCPPUTILS__UNIQUE_LOCK_HPP_ +#define RCPPUTILS__UNIQUE_LOCK_HPP_ + +#include + +#include "rcpputils/thread_safety_annotations.hpp" + +namespace rcpputils +{ + +/** + * @brief Trivial std::unique_lock wrapper providing constructor that allows Clang's + * Thread Safety Analysis. + * The libc++ std::unique_lock does not have these annotations. + */ +template +class RCPPUTILS_TSA_SCOPED_CAPABILITY unique_lock : public std::unique_lock +{ +public: + explicit unique_lock(MutexT & mu) RCPPUTILS_TSA_ACQUIRE(mu) + : std::unique_lock(mu) + {} + + ~unique_lock() RCPPUTILS_TSA_RELEASE() {} +}; + +} // namespace rcpputils + +#endif // RCPPUTILS__UNIQUE_LOCK_HPP_ diff --git a/test/test_unique_lock.cpp b/test/test_unique_lock.cpp new file mode 100644 index 0000000..36c8c4d --- /dev/null +++ b/test/test_unique_lock.cpp @@ -0,0 +1,26 @@ +// Copyright 2023 Open Source Robotics Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include + +TEST(test_time, test_compile_multiple_mutex_types) { + // Very simple check that this compiles with different mutex types + std::mutex regular_mutex; + rcpputils::unique_lock lock1(regular_mutex); + + std::recursive_mutex recursive_mutex; + rcpputils::unique_lock lock2(recursive_mutex); +}