Dispose candidate process of process pool 44/292144/1
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 27 Apr 2023 23:43:39 +0000 (23:43 +0000)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 27 Apr 2023 23:43:39 +0000 (23:43 +0000)
When the app label changed event is received, the launchpad has to terminate
all candidate processes. If it's not, calling the security_manager_prepare_app2()
will be failed when executing an application.

Change-Id: I730bfc0fa5126743d2bd80c541d131ae581ad931
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/launchpad-process-pool/loader_executor.cc
src/launchpad-process-pool/loader_executor.hh
src/launchpad-process-pool/loader_manager.cc
src/launchpad-process-pool/process_pool.cc
src/launchpad-process-pool/process_pool.hh

index 1be888e..7184d99 100644 (file)
@@ -73,6 +73,11 @@ bool LoaderExecutor::HasCandidateProcess() const {
   return process_pool_->IsPrepared();
 }
 
+void LoaderExecutor::DisposeCandidateProcess() {
+  process_pool_->Dispose();
+  process_pool_->SetTimer();
+}
+
 void LoaderExecutor::OnExecution() {
   std::vector<char*> loader_argv(loader_argv_.size() + 1);
   int loader_argc = loader_argv_.size();
index a55ca30..c3b2664 100644 (file)
@@ -40,6 +40,7 @@ class LoaderExecutor : public Executor::Delegator,
 
   pid_t Execute(const LoaderContext* loader_context, int priority);
   bool HasCandidateProcess() const;
+  void DisposeCandidateProcess();
 
  private:
   LoaderExecutor();
index 7d88860..46620ef 100644 (file)
@@ -20,6 +20,7 @@
 #include <utility>
 
 #include "launchpad-process-pool/config.hh"
+#include "launchpad-process-pool/loader_executor.hh"
 #include "launchpad-process-pool/loader_factory.hh"
 #include "launchpad-process-pool/log_private.hh"
 
@@ -457,6 +458,8 @@ void LoaderManager::OnAppLabelsChanged() {
       context->Prepare();
     }
   }
+
+  LoaderExecutor::GetInst().DisposeCandidateProcess();
 }
 
 void LoaderManager::OnMemoryStatusChanged(bool low_memory,
index cec1c39..19fbcc6 100644 (file)
@@ -40,11 +40,7 @@ ProcessPool::ProcessPool(int num_processes, IEvent* event_listener = nullptr)
 }
 
 ProcessPool::~ProcessPool() {
-  while (!queue_.empty()) {
-    auto process = std::move(queue_.front());
-    queue_.pop();
-    process->Kill();
-  }
+  Dispose();
 }
 
 bool ProcessPool::IsPrepared() const {
@@ -62,6 +58,17 @@ pid_t ProcessPool::Execute(std::shared_ptr<AppPacket> app_packet) {
   return process->GetPid();
 }
 
+void ProcessPool::Dispose() {
+  while (!queue_.empty()) {
+    auto process = std::move(queue_.front());
+    queue_.pop();
+    process->Kill();
+    _D("Kill process(%d)", process->GetPid());
+  }
+
+  UnsetTimer();
+}
+
 ProcessPool::Process::Process(pid_t pid, int fd)
     : pid_(pid), socket_(new Socket(fd)) {
 }
@@ -162,6 +169,13 @@ void ProcessPool::SetTimer() {
   timer_ = g_timeout_add(1000, OnTimeout, this);
 }
 
+void ProcessPool::UnsetTimer() {
+  if (timer_ != 0) {
+    g_source_remove(timer_);
+    timer_ = 0;
+  }
+}
+
 gboolean ProcessPool::OnTimeout(gpointer user_data) {
   auto* process_pool = static_cast<ProcessPool*>(user_data);
   process_pool->PrepareProcess();
index 302a826..85b87fa 100644 (file)
@@ -45,6 +45,8 @@ class ProcessPool : public Executor::Delegator,
 
   bool IsPrepared() const;
   pid_t Execute(std::shared_ptr<AppPacket> app_packet);
+  void Dispose();
+  void SetTimer();
 
  private:
   class Process {
@@ -61,10 +63,9 @@ class ProcessPool : public Executor::Delegator,
   };
 
   void OnExecution() override;
-
+  void UnsetTimer();
   void PrepareProcess();
   int WaitForRequest(std::unique_ptr<Socket> socket);
-  void SetTimer();
   static gboolean OnTimeout(gpointer user_data);
 
  private: