diff --git a/include/libcamera/base/thread.h b/include/libcamera/base/thread.h index eb1a52ab..dc1aca27 100644 --- a/include/libcamera/base/thread.h +++ b/include/libcamera/base/thread.h @@ -75,7 +75,7 @@ private: ThreadData *targetData); std::thread thread_; - ThreadData *data_; + std::unique_ptr data_; }; } /* namespace libcamera */ diff --git a/src/libcamera/base/thread.cpp b/src/libcamera/base/thread.cpp index ba3caf6f..338cbcc2 100644 --- a/src/libcamera/base/thread.cpp +++ b/src/libcamera/base/thread.cpp @@ -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(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);