The message.h and mutex.h headers are not used in the libcamera public API. Make them private to avoid there usage in applications, and to prevent having to maintain them with a stable ABI. As mutex.h is used by libcamerasrc, the GStreamer element must switch from the libcamera_public to the libcamera_private dependency. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
135 lines
2.0 KiB
C++
135 lines
2.0 KiB
C++
/* 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/private.h>
|
|
|
|
#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 */
|