From cf20e6da0c3050064617eb80f23ed001a101d032 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Mon, 27 Mar 2023 05:53:06 +0000 Subject: [PATCH] Fix child process deadlock issue When a child process accesses the destructor of std::condition_variable, it can potentially go to the deadlock state. To avoid the deadlock issue of the child process, the launchpad allocates the condition variables using new keyword. Change-Id: Icc5709671cb9a54557fc6a78ccb9f416c2e3d114 Signed-off-by: Hwankyu Jhun --- src/launchpad-process-pool/dbus.cc | 11 +++++++---- src/launchpad-process-pool/worker.cc | 6 ++++-- src/launchpad-process-pool/worker.hh | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/launchpad-process-pool/dbus.cc b/src/launchpad-process-pool/dbus.cc index 5fcd93a..3cf6571 100644 --- a/src/launchpad-process-pool/dbus.cc +++ b/src/launchpad-process-pool/dbus.cc @@ -97,20 +97,22 @@ class DBusManager { return; if (getpid() == pid_) { - queue_.Push(std::make_shared(true)); + queue_->Push(std::make_shared(true)); thread_.join(); if (conn_ != nullptr) { g_object_unref(conn_); conn_ = nullptr; } + + delete queue_; } disposed_ = true; } void Send(std::shared_ptr message) { - queue_.Push(std::move(message)); + queue_->Push(std::move(message)); } private: @@ -122,6 +124,7 @@ class DBusManager { return; thread_ = std::thread([&]() -> void { WorkerThread(); }); + queue_ = new tizen_base::SharedQueue>(); disposed_ = false; } @@ -177,7 +180,7 @@ class DBusManager { continue; } - auto message = queue_.WaitAndPop(); + auto message = queue_->WaitAndPop(); if (message->IsDone()) break; @@ -192,7 +195,7 @@ class DBusManager { GDBusConnection* conn_ = nullptr; uint32_t error_count_ = 0; std::thread thread_; - tizen_base::SharedQueue> queue_; + tizen_base::SharedQueue>* queue_; }; } // namespace diff --git a/src/launchpad-process-pool/worker.cc b/src/launchpad-process-pool/worker.cc index 28e3596..9b261b4 100644 --- a/src/launchpad-process-pool/worker.cc +++ b/src/launchpad-process-pool/worker.cc @@ -39,17 +39,19 @@ class Ender : public Worker::Job { Worker::Worker(std::string name) : name_(std::move(name)) { thread_ = std::thread([&]() -> void { RunThread(); }); + queue_ = new tizen_base::SharedQueue>(); } Worker::~Worker() { if (getpid() == current_pid) { Add(std::make_shared()); thread_.join(); + delete queue_; } } void Worker::Add(std::shared_ptrjob) { - queue_.Push(std::move(job)); + queue_->Push(std::move(job)); } void Worker::SetComm() { @@ -69,7 +71,7 @@ void Worker::RunThread() { _W("BEGIN"); SetComm(); while (true) { - auto job = queue_.WaitAndPop(); + auto job = queue_->WaitAndPop(); job->Do(); if (job->IsDone()) break; diff --git a/src/launchpad-process-pool/worker.hh b/src/launchpad-process-pool/worker.hh index ed12083..32afdaf 100644 --- a/src/launchpad-process-pool/worker.hh +++ b/src/launchpad-process-pool/worker.hh @@ -47,7 +47,7 @@ class Worker { private: std::string name_; std::thread thread_; - tizen_base::SharedQueue> queue_; + tizen_base::SharedQueue>* queue_; }; } // namespace launchpad -- 2.7.4