Skip to content

Commit

Permalink
Add unique_lock implementation with clang thread safety annotations (#…
Browse files Browse the repository at this point in the history
…180)

* Add unique_lock implementation with clang thread safety annotations

Signed-off-by: Emerson Knapp <[email protected]>
Co-authored-by: Chris Lalancette <[email protected]>
  • Loading branch information
emersonknapp and clalancette authored Sep 6, 2023
1 parent 47ad866 commit a0fa6e3
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
43 changes: 43 additions & 0 deletions include/rcpputils/unique_lock.hpp
Original file line number Diff line number Diff line change
@@ -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 <mutex>

#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<typename MutexT>
class RCPPUTILS_TSA_SCOPED_CAPABILITY unique_lock : public std::unique_lock<MutexT>
{
public:
explicit unique_lock(MutexT & mu) RCPPUTILS_TSA_ACQUIRE(mu)
: std::unique_lock<MutexT>(mu)
{}

~unique_lock() RCPPUTILS_TSA_RELEASE() {}
};

} // namespace rcpputils

#endif // RCPPUTILS__UNIQUE_LOCK_HPP_
26 changes: 26 additions & 0 deletions test/test_unique_lock.cpp
Original file line number Diff line number Diff line change
@@ -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 <gtest/gtest.h>

#include <rcpputils/unique_lock.hpp>

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<std::mutex> lock1(regular_mutex);

std::recursive_mutex recursive_mutex;
rcpputils::unique_lock<std::recursive_mutex> lock2(recursive_mutex);
}

0 comments on commit a0fa6e3

Please sign in to comment.