Handle loader termination request 61/296361/4
authorHwankyu Jhun <h.jhun@samsung.com>
Wed, 26 Jul 2023 06:12:47 +0000 (15:12 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 27 Jul 2023 01:31:51 +0000 (10:31 +0900)
Some developers want to send the kill request to the running loader process.
This patch adds a new handler to handle the kill request.

Change-Id: Iad92282db51f60a8bb420739f406e1a426bb203e
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/launchpad-process-pool/launchpad.cc
src/launchpad-process-pool/launchpad.hh
src/launchpad-process-pool/loader_manager.hh
src/lib/launchpad-common/types.hh

index 1ffb1ecf85a9e1d828bdf0346205abe5e65f3c02..69ddf1ab7612c7f1c75ea75f391bbf8ac753b296 100644 (file)
@@ -191,6 +191,9 @@ Launchpad::Launchpad(int argc, char** argv)
     { PadCmd::Launch,
       std::bind(&Launchpad::HandleLaunchRequest, this,
           std::placeholders::_1) },
+    { PadCmd::KillLoader,
+      std::bind(&Launchpad::HandleKillLoaderRequest, this,
+          std::placeholders::_1) },
   };
 
   CPUBoostController::DoBoost(getpid(), CPUBoostController::Level::Strong,
@@ -558,6 +561,22 @@ void Launchpad::HandleLaunchRequest(std::shared_ptr<Request> request) {
       request->GetAppInfo()->GetAppId().c_str(), request->GetPid());
 }
 
+void Launchpad::HandleKillLoaderRequest(std::shared_ptr<Request> request) {
+  auto& b = request->GetBundle();
+  auto loader_name = b.GetString(kAulLoaderName);
+  auto loader_context =
+      LoaderManager::GetInst().FindLoaderContextFromName(loader_name);
+  if (loader_context == nullptr) {
+    _E("Failed to find loader context. loader_name(%s)", loader_name.c_str());
+    return;
+  }
+
+  if (loader_context->RefCount() == 0)
+    loader_context->Dispose();
+
+  _D("[PAD_CMD_KILL_LOADER] loader_name: %s", loader_name.c_str());
+}
+
 void Launchpad::OnIOEventReceived(int fd, int condition) {
   auto client_socket = socket_->Accept();
   if (!client_socket) {
index 5300f311029ddb37d4fe236e365af6a63d423901..b287375d60c4f67bc5977b15c8d1ad343465c65c 100644 (file)
@@ -76,6 +76,7 @@ class Launchpad : public IOChannel::IEvent,
   void HandleUpdateAppTypeRequest(std::shared_ptr<Request> request);
   void HandleConnectRequest(std::shared_ptr<Request> request);
   void HandleLaunchRequest(std::shared_ptr<Request> request);
+  void HandleKillLoaderRequest(std::shared_ptr<Request> request);
 
   bool CanUseLoaderContext(const std::shared_ptr<LoaderContext>& context);
   LaunchResult ForkProcessing(std::shared_ptr<Request> request);
index 31e4ba09463b9a96207ca352e9cb9ee2dd25452d..76825ad877c1fe1bc0c58e6450233f331280d48b 100644 (file)
@@ -76,6 +76,8 @@ class LoaderManager : public AppDefinedLoaderInfoManager::IEvent,
       const std::string& loader_name);
   std::shared_ptr<LoaderContext> FindAlternativeLoaderContext(LoaderType type);
   void RemoveLoaderContext(LoaderType type, int loader_id);
+  std::shared_ptr<LoaderContext> FindLoaderContextFromName(
+      const std::string& loader_name);
 
  private:
   LoaderManager();
@@ -84,8 +86,6 @@ class LoaderManager : public AppDefinedLoaderInfoManager::IEvent,
   void Init();
   std::shared_ptr<LoaderContext> FindLoaderContextFromPid(pid_t pid);
   std::shared_ptr<HydraLoaderContext> FindHydraLoaderContextFromPid(pid_t pid);
-  std::shared_ptr<LoaderContext> FindLoaderContextFromName(
-      const std::string& loader_name);
   std::shared_ptr<LoaderContext> FindLoaderContextFromLoaderId(int loader_id);
   std::shared_ptr<LoaderContext> FindLoaderContextFromType(LoaderType type);
   void RemoveLoaderContextsByCallerPid(pid_t caller_pid);
index e19b5b32af36ad2a5eb04a81736190a8f15ac855..dca55f492a30624563d55abac6e151a591f0b17c 100644 (file)
@@ -57,6 +57,7 @@ enum PadCmd {
   UpdateAppType = 16,
   PrepareAppDefinedLoader = 17,
   Connect = 18,
+  KillLoader = 19,
 };
 
 enum PadLoaderId {