mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-23 00:25:07 +03:00
libcamera: base: Add mutex classes with thread safety annotations
This replaces Mutex and MutexLocker with our own defined classes. The classes are annotated by clang thread safety annotations. So we can add annotation to code where the classes are used. v4l2 code needs to be annotated, which violates Mutex capability. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
16efd83f5d
commit
c17f172842
7 changed files with 192 additions and 23 deletions
|
@ -13,6 +13,7 @@ libcamera_base_headers = files([
|
|||
'flags.h',
|
||||
'log.h',
|
||||
'message.h',
|
||||
'mutex.h',
|
||||
'object.h',
|
||||
'private.h',
|
||||
'semaphore.h',
|
||||
|
|
132
include/libcamera/base/mutex.h
Normal file
132
include/libcamera/base/mutex.h
Normal file
|
@ -0,0 +1,132 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* Copyright (C) 2021, Google Inc.
|
||||
*
|
||||
* mutex.h - Mutex classes with clang thread safety annotation
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
|
||||
#include <libcamera/base/thread_annotations.h>
|
||||
|
||||
namespace libcamera {
|
||||
|
||||
/* \todo using Mutex = std::mutex if libc++ is used. */
|
||||
|
||||
#ifndef __DOXYGEN__
|
||||
|
||||
class LIBCAMERA_TSA_CAPABILITY("mutex") Mutex final
|
||||
{
|
||||
public:
|
||||
constexpr Mutex()
|
||||
{
|
||||
}
|
||||
|
||||
void lock() LIBCAMERA_TSA_ACQUIRE()
|
||||
{
|
||||
mutex_.lock();
|
||||
}
|
||||
|
||||
void unlock() LIBCAMERA_TSA_RELEASE()
|
||||
{
|
||||
mutex_.unlock();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class MutexLocker;
|
||||
|
||||
std::mutex mutex_;
|
||||
};
|
||||
|
||||
class LIBCAMERA_TSA_SCOPED_CAPABILITY MutexLocker final
|
||||
{
|
||||
public:
|
||||
explicit MutexLocker(Mutex &mutex) LIBCAMERA_TSA_ACQUIRE(mutex)
|
||||
: lock_(mutex.mutex_)
|
||||
{
|
||||
}
|
||||
|
||||
MutexLocker(Mutex &mutex, std::defer_lock_t t) noexcept LIBCAMERA_TSA_EXCLUDES(mutex)
|
||||
: lock_(mutex.mutex_, t)
|
||||
{
|
||||
}
|
||||
|
||||
~MutexLocker() LIBCAMERA_TSA_RELEASE()
|
||||
{
|
||||
}
|
||||
|
||||
void lock() LIBCAMERA_TSA_ACQUIRE()
|
||||
{
|
||||
lock_.lock();
|
||||
}
|
||||
|
||||
bool try_lock() LIBCAMERA_TSA_TRY_ACQUIRE(true)
|
||||
{
|
||||
return lock_.try_lock();
|
||||
}
|
||||
|
||||
void unlock() LIBCAMERA_TSA_RELEASE()
|
||||
{
|
||||
lock_.unlock();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class ConditionVariable;
|
||||
|
||||
std::unique_lock<std::mutex> lock_;
|
||||
};
|
||||
|
||||
class ConditionVariable final
|
||||
{
|
||||
public:
|
||||
ConditionVariable()
|
||||
{
|
||||
}
|
||||
|
||||
void notify_one() noexcept
|
||||
{
|
||||
cv_.notify_one();
|
||||
}
|
||||
|
||||
void notify_all() noexcept
|
||||
{
|
||||
cv_.notify_all();
|
||||
}
|
||||
|
||||
template<class Predicate>
|
||||
void wait(MutexLocker &locker, Predicate stopWaiting)
|
||||
{
|
||||
cv_.wait(locker.lock_, stopWaiting);
|
||||
}
|
||||
|
||||
template<class Rep, class Period, class Predicate>
|
||||
bool wait_for(MutexLocker &locker,
|
||||
const std::chrono::duration<Rep, Period> &relTime,
|
||||
Predicate stopWaiting)
|
||||
{
|
||||
return cv_.wait_for(locker.lock_, relTime, stopWaiting);
|
||||
}
|
||||
|
||||
private:
|
||||
std::condition_variable cv_;
|
||||
};
|
||||
|
||||
#else /* __DOXYGEN__ */
|
||||
|
||||
class Mutex final
|
||||
{
|
||||
};
|
||||
|
||||
class MutexLocker final
|
||||
{
|
||||
};
|
||||
|
||||
class ConditionVariable final
|
||||
{
|
||||
};
|
||||
|
||||
#endif /* __DOXYGEN__ */
|
||||
} /* namespace libcamera */
|
|
@ -7,15 +7,14 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <condition_variable>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <sys/types.h>
|
||||
#include <thread>
|
||||
|
||||
#include <libcamera/base/private.h>
|
||||
|
||||
#include <libcamera/base/message.h>
|
||||
#include <libcamera/base/mutex.h>
|
||||
#include <libcamera/base/signal.h>
|
||||
#include <libcamera/base/utils.h>
|
||||
|
||||
|
@ -27,10 +26,6 @@ class Object;
|
|||
class ThreadData;
|
||||
class ThreadMain;
|
||||
|
||||
using ConditionVariable = std::condition_variable;
|
||||
using Mutex = std::mutex;
|
||||
using MutexLocker = std::unique_lock<std::mutex>;
|
||||
|
||||
class Thread
|
||||
{
|
||||
public:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue