X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fpthread-lock.hpp;fp=src%2Fcommon%2Fpthread-lock.hpp;h=35fde097cadbf92ea6f6744bc236272c2120c5e7;hb=0a325f4dec3f6d553dad5d2c26ebfdc78201c363;hp=0000000000000000000000000000000000000000;hpb=332a2147fece4548eac38a0929b208230a8da31f;p=lttng-tools.git diff --git a/src/common/pthread-lock.hpp b/src/common/pthread-lock.hpp new file mode 100644 index 000000000..35fde097c --- /dev/null +++ b/src/common/pthread-lock.hpp @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2022 Jérémie Galarneau + * + * SPDX-License-Identifier: LGPL-2.1-only + * + */ + +#ifndef LTTNG_PTHREAD_LOCK_H +#define LTTNG_PTHREAD_LOCK_H + +#include + +#include +#include + +namespace lttng { +namespace pthread { + +namespace details { +/* + * Class wrapping pthread mutexes and satisfying the Mutex named requirements, except + * for the "Default Constructible" requirement. The class is not default-constructible since the + * intention is to ease the transition of existing C-code using pthread mutexes to idiomatic C++. + * + * New code should use std::mutex. + */ +class mutex { +public: + mutex(pthread_mutex_t& mutex_p) : _mutex{mutex_p} + { + } + + /* "Not copyable" and "not moveable" Mutex requirements. */ + mutex(mutex const &) = delete; + mutex &operator=(mutex const &) = delete; + + void lock() + { + if (pthread_mutex_lock(&_mutex) != 0) { + LTTNG_THROW_POSIX("Failed to lock mutex", errno); + } + } + + bool try_lock() + { + const auto ret = pthread_mutex_trylock(&_mutex); + + if (ret == 0) { + return true; + } else if (errno == EBUSY || errno == EAGAIN) { + return false; + } else { + LTTNG_THROW_POSIX("Failed to try to lock mutex", errno); + } + } + + void unlock() + { + if (pthread_mutex_unlock(&_mutex) != 0) { + LTTNG_THROW_POSIX("Failed to unlock mutex", errno); + } + } + +private: + pthread_mutex_t& _mutex; +}; +} /* namespace details */ + +/* + * Provides the basic concept of std::lock_guard for posix mutexes. + * + * `lock` is held for the duration of lock_guard's lifetime. + */ +class lock_guard { +public: + lock_guard(pthread_mutex_t& mutex) : _mutex{mutex}, _guard(_mutex) + { + } + + lock_guard(const lock_guard &) = delete; + +private: + details::mutex _mutex; + std::lock_guard _guard; +}; + +} /* namespace pthread */ +} /* namespace lttng */ + +#endif /* LTTNG_PTHREAD_LOCK_H */