Perform monitoring after service termination
authorChanggyu Choi <changyu.choi@samsung.com>
Tue, 22 Apr 2025 07:17:40 +0000 (16:17 +0900)
committerChanggyu Choi <changyu.choi@samsung.com>
Wed, 14 May 2025 09:02:19 +0000 (18:02 +0900)
Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
include/service_loader.h
src/service_loader.cc
src/service_loader.hh
src/stub_service_loader.cc

index 2e34a381b59f6fe9ffa96fb3cbba81575fddc916..55040b8ea5ade3052498507c23bbcc0de72586cd 100644 (file)
@@ -108,7 +108,7 @@ typedef struct {
  * @see service_loader_message_cb()
  * @see service_loader_quit()
  * @see #service_loader_lifecycle_callback_s
- * 
+ *
  * @code
 #include <service_loader.h>
 
index a61e2d6cab51c3fac8c692edcefae72e8d575522..5601b817f592a116bdca953bbffd4737ca83ef2a 100755 (executable)
@@ -248,21 +248,22 @@ void ServiceLoader::RunService(const std::string& name) {
     THROW(SERVICE_ERROR_INVALID_CONTEXT);
   }
 
-  if (service == nullptr)
+  if (service == nullptr) {
     service = std::make_shared<Service>(std::move(info), std::move(listener));
+    if (service == nullptr) {
+      _E("Out of memory. name=%s", name.c_str());
+      THROW(SERVICE_ERROR_OUT_OF_MEMORY);
+    }
+
+    services_[name] = service;
+  }
 
   if (service->IsMonitoring())
     service->StopMonitoring();
 
-  if (service == nullptr) {
-    _E("Out of memory. name=%s", name.c_str());
-    THROW(SERVICE_ERROR_OUT_OF_MEMORY);
-  }
-
   service->SetStateChangedCb(std::bind(&ServiceLoader::ServiceStateChangedCb,
                                        this, std::placeholders::_1,
                                        std::placeholders::_2));
-  services_[name] = service;
   service->Run();
 }
 
@@ -333,9 +334,6 @@ void ServiceLoader::ListenService(const std::string& name) {
     THROW(SERVICE_ERROR_OUT_OF_MEMORY);
   }
 
-  service->SetStateChangedCb(std::bind(&ServiceLoader::ServiceStateChangedCb,
-                                       this, std::placeholders::_1,
-                                       std::placeholders::_2));
   services_[name] = service;
   service->StartMonitoring(this);
 }
@@ -407,7 +405,7 @@ void ServiceLoader::OnEvent(const std::string& name) {
     _I("%s on-demand launch", name.c_str());
     auto& service = it->second;
     service->StopMonitoring();
-    service->Run();
+    RunService(service->GetName());
   }
 }
 
@@ -455,10 +453,11 @@ void ServiceLoader::ServiceStateChangedCb(const Service* service,
     }
   }
 
-  OnServiceStateChanged(service, state);
-  if (state == Service::State::Destroyed) {
+  _W("Service state changed. name=%s, state=%d", service->GetName().c_str(), static_cast<int>(state));
+  if (state == Service::State::Destroyed)
     services_.erase(service->GetName());
-  }
+
+  OnServiceStateChanged(service, state);
 }
 
 }  // namespace tizen_base
index 54379c9c56f601d4bb691a1aeeed4930e9044671..5f826cda0695b2fd5c51e87fe71b4b4da28bb582 100644 (file)
@@ -38,7 +38,7 @@
 
 namespace tizen_base {
 
-class ServiceLoader : IEventListener {
+class ServiceLoader : public IEventListener {
  public:
   ServiceLoader(int argc, char** argv, std::string name);
   ~ServiceLoader();
index cffe52ffa691bb453239b402113dba85409d6ede..bd4405d643e1269eb0a227a36e296be9b94566df 100644 (file)
@@ -64,12 +64,20 @@ class ServiceLoaderExt : public tizen_base::ServiceLoader {
 
   void OnMessageReceived(const std::string& sender,
                          const tizen_base::Bundle& envelope) override {
+    ServiceLoader::OnMessageReceived(sender, envelope);
     if (callback_.message)
       callback_.message(sender.c_str(), envelope.GetHandle(), user_data_);
   }
 
   void OnServiceStateChanged(const tizen_base::Service* service,
-                             tizen_base::Service::State state) {}
+                             tizen_base::Service::State state) {
+    _W("state: %d, mode: %s", static_cast<int>(state), service->GetServiceInfo()->GetMode().c_str());
+    if (state == tizen_base::Service::State::Destroyed &&
+        service->GetServiceInfo()->GetMode() == "on-demand") {
+      _W("monitoring start");
+      context->ListenService(service->GetName());
+    }
+  }
 
  private:
   service_loader_lifecycle_callback_s callback_;