libcamera: base: thread: Use std::unique_ptr instead of raw pointer
An `std::unique_ptr` is safer and expresses the intent better, so use that. Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
This commit is contained in:
@@ -75,7 +75,7 @@ private:
|
||||
ThreadData *targetData);
|
||||
|
||||
std::thread thread_;
|
||||
ThreadData *data_;
|
||||
std::unique_ptr<ThreadData> data_;
|
||||
};
|
||||
|
||||
} /* namespace libcamera */
|
||||
|
||||
@@ -105,8 +105,12 @@ public:
|
||||
class ThreadData
|
||||
{
|
||||
public:
|
||||
ThreadData()
|
||||
: thread_(nullptr), running_(false), dispatcher_(nullptr)
|
||||
/**
|
||||
* \brief Constructor for internal thread data
|
||||
* \param[in] thread The associated thread
|
||||
*/
|
||||
ThreadData(Thread *thread)
|
||||
: thread_(thread), running_(false), dispatcher_(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -167,7 +171,7 @@ ThreadData *ThreadData::current()
|
||||
* The main thread doesn't receive thread-local data when it is
|
||||
* started, set it here.
|
||||
*/
|
||||
ThreadData *data = mainThread.data_;
|
||||
ThreadData *data = mainThread.data_.get();
|
||||
data->tid_ = syscall(SYS_gettid);
|
||||
currentThreadData = data;
|
||||
return data;
|
||||
@@ -231,15 +235,13 @@ ThreadData *ThreadData::current()
|
||||
* \brief Create a thread
|
||||
*/
|
||||
Thread::Thread()
|
||||
: data_(std::make_unique<ThreadData>(this))
|
||||
{
|
||||
data_ = new ThreadData;
|
||||
data_->thread_ = this;
|
||||
}
|
||||
|
||||
Thread::~Thread()
|
||||
{
|
||||
delete data_->dispatcher_.load(std::memory_order_relaxed);
|
||||
delete data_;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -284,7 +286,7 @@ void Thread::startThread()
|
||||
thread_local ThreadCleaner cleaner(this, &Thread::finishThread);
|
||||
|
||||
data_->tid_ = syscall(SYS_gettid);
|
||||
currentThreadData = data_;
|
||||
currentThreadData = data_.get();
|
||||
|
||||
run();
|
||||
}
|
||||
@@ -516,7 +518,7 @@ pid_t Thread::currentId()
|
||||
*/
|
||||
EventDispatcher *Thread::eventDispatcher()
|
||||
{
|
||||
ASSERT(data_ == ThreadData::current());
|
||||
ASSERT(data_.get() == ThreadData::current());
|
||||
|
||||
if (!data_->dispatcher_.load(std::memory_order_relaxed))
|
||||
data_->dispatcher_.store(new EventDispatcherPoll(),
|
||||
@@ -621,7 +623,7 @@ void Thread::removeMessages(Object *receiver)
|
||||
*/
|
||||
void Thread::dispatchMessages(Message::Type type, Object *receiver)
|
||||
{
|
||||
ASSERT(data_ == ThreadData::current());
|
||||
ASSERT(data_.get() == ThreadData::current());
|
||||
|
||||
++data_->messages_.recursion_;
|
||||
|
||||
@@ -677,8 +679,8 @@ void Thread::dispatchMessages(Message::Type type, Object *receiver)
|
||||
*/
|
||||
void Thread::moveObject(Object *object)
|
||||
{
|
||||
ThreadData *currentData = object->thread_->data_;
|
||||
ThreadData *targetData = data_;
|
||||
ThreadData *currentData = object->thread_->data_.get();
|
||||
ThreadData *targetData = data_.get();
|
||||
|
||||
MutexLocker lockerFrom(currentData->messages_.mutex_, std::defer_lock);
|
||||
MutexLocker lockerTo(targetData->messages_.mutex_, std::defer_lock);
|
||||
|
||||
Reference in New Issue
Block a user