[M120 Migration][WRTjs][Service] Separate service app datas from WRTServiceManager 80/307480/2 accepted/tizen/unified/20240315.032948 submit/tizen/20240312.160013
authorChunling Ye <chunling.ye@samsung.com>
Mon, 4 Mar 2024 10:05:13 +0000 (18:05 +0800)
committerDongHyun Song <dh81.song@samsung.com>
Tue, 12 Mar 2024 03:53:59 +0000 (03:53 +0000)
If many service apps been launched in same time, some abnormal
crash happen for multithread visit map safe issue.

To avoid this issue, now separate service app data maps from
WRTServiceManager.

Reference:
https://review.tizen.org/gerrit/307066/

Change-Id: I9aa04dfe1cc301f8ed1154e01e8604d4bceed42d
Signed-off-by: Chunling Ye <chunling.ye@samsung.com>
wrt/filenames.gni
wrt/src/browser/api/tv/wrt_api_tv_extension.cc
wrt/src/browser/api/wrt_api_web_runtime.cc [changed mode: 0755->0644]
wrt/src/service/wrt_service.cc
wrt/src/service/wrt_service.h [changed mode: 0755->0644]
wrt/src/service/wrt_service_app_data.cc [new file with mode: 0644]
wrt/src/service/wrt_service_app_data.h [new file with mode: 0644]
wrt/src/service/wrt_service_manager.cc
wrt/src/service/wrt_service_manager.h

index 015e3ec..a97eb3c 100644 (file)
@@ -159,6 +159,8 @@ wrt_lib_sources = [
   "src/service/wrt_service_lifecycle_file.h",
   "src/service/wrt_service_manager.cc",
   "src/service/wrt_service_manager.h",
+  "src/service/wrt_service_app_data.cc",
+  "src/service/wrt_service_app_data.h",
 ]
 
 wrt_lib_sources_mde = [
index 692c50c..5306357 100644 (file)
@@ -30,6 +30,7 @@
 #include "wrt/src/common/constants.h"
 #include "wrt/src/common/tv/wrt_lib_wrapper.h"
 #include "wrt/src/service/wrt_service.h"
+#include "wrt/src/service/wrt_service_app_data.h"
 #include "wrt/src/service/wrt_service_manager.h"
 
 namespace wrt {
@@ -186,7 +187,7 @@ std::string TVExtension::DecryptFile(
     const std::string& internal_id, const std::string& file_path) const {
   if (WRTServiceManager::Get()->IsStandaloneService()) {
     auto service_id = ApplicationData::GetServiceID(internal_id);
-    auto pkg_path = WRTService::GetAppPkgPath(internal_id);
+    auto pkg_path = WRTServiceAppData::GetInstance().GetAppPkgPath(internal_id);
 
     auto decrypted_src = EncryptedFileHandler::DecryptFile(
         service_id, pkg_path, base::FilePath(file_path));
@@ -209,7 +210,7 @@ void TVExtension::SetDiskCache(const std::string& app_id) const {
 
 std::vector<std::string> TVExtension::GetWasmFiles(
     const std::string& app_id) const {
-  auto pkg_path = WRTService::GetAppPkgPath(app_id);
+  auto pkg_path = WRTServiceAppData::GetInstance().GetAppPkgPath(app_id);
   auto res_path = base::FilePath(pkg_path).Append("res");
   LOG(INFO) << "App's res path : " << res_path;
   base::FileEnumerator enumerator(res_path, true /* recursive */,
@@ -280,7 +281,7 @@ std::string TVExtension::QueryProductValue(const std::string& query) const {
 }
 
 void TVExtension::ServiceMount(const std::string& internal_id) const {
-  auto pkg_path = WRTService::GetAppPkgPath(internal_id);
+  auto pkg_path = WRTServiceAppData::GetInstance().GetAppPkgPath(internal_id);
   auto tmg_path = GetTmgPath(pkg_path);
   if (!base::PathExists(tmg_path) ||
       tmg_mounter.find(internal_id) != tmg_mounter.end()) {
@@ -371,7 +372,7 @@ void TVExtension::GetOspAccessToken(
                 return 0;
               }
               LOG(INFO) << "token : " << token;
-              WRTServiceManager::Get()->SendOspAccessToken(token);
+              WRTServiceAppData::GetInstance().SetOspAccessToken(token);
               return 0;
             };
             if (SSO_TRUE !=
@@ -379,7 +380,8 @@ void TVExtension::GetOspAccessToken(
                                          callback,
                                          nullptr)) {
               LOG(ERROR) << "sso_request_access_token() has failed";
-              WRTServiceManager::Get()->SendOspAccessToken(kDefaultSsoError);
+              WRTServiceAppData::GetInstance().SetOspAccessToken(
+                  kDefaultSsoError);
             }
           }, client_id, secret));
 }
old mode 100755 (executable)
new mode 100644 (file)
index b5f79b4..beebf02
@@ -34,6 +34,7 @@
 #include "wrt/src/common/privilege.h"
 #include "wrt/src/common/wrt_service_message_channel.h"
 #include "wrt/src/service/wrt_service.h"
+#include "wrt/src/service/wrt_service_app_data.h"
 #include "wrt/src/service/wrt_service_lifecycle_file.h"
 #include "wrt/src/service/wrt_service_manager.h"
 
@@ -194,14 +195,16 @@ bool WebRuntime::HideSplashScreen(int reason) {
 std::string WebRuntime::GetStartServiceFile(
     const std::string& internal_id) const {
   base::AutoLock lock(service_lock);
-  auto app_data = WRTServiceManager::Get()->GetApplicationData(internal_id);
+  auto app_data =
+      WRTServiceAppData::GetInstance().GetApplicationData(internal_id);
   return app_data->GetStartServiceFile();
 }
 
 std::vector<std::string> WebRuntime::GetPrivileges(
     const std::string& internal_id) const {
   base::AutoLock lock(service_lock);
-  auto app_data = WRTServiceManager::Get()->GetApplicationData(internal_id);
+  auto app_data =
+      WRTServiceAppData::GetInstance().GetApplicationData(internal_id);
   auto& info = app_data->permissions_info().GetAPIPermissions();
   return std::vector<std::string>(info.begin(), info.end());
 }
@@ -554,7 +557,8 @@ void WebRuntime::ShowPermissionPopup(const int id,
 std::string WebRuntime::ResolveVirtualRoot(const std::string& internal_id,
                                            const std::string& alias) const {
   base::AutoLock lock(service_lock);
-  auto app_data = WRTServiceManager::Get()->GetApplicationData(internal_id);
+  auto app_data =
+      WRTServiceAppData::GetInstance().GetApplicationData(internal_id);
   if (alias == kAliasWgtPackage) {
     return app_data->application_path();
   } else if (alias == kAliasWgtPrivate) {
@@ -573,7 +577,8 @@ std::string WebRuntime::ResolveVirtualRoot(const std::string& internal_id,
 
 std::string WebRuntime::GetPkgApiVersion(const std::string& internal_id) const {
   base::AutoLock lock(service_lock);
-  auto app_data = WRTServiceManager::Get()->GetApplicationData(internal_id);
+  auto app_data =
+      WRTServiceAppData::GetInstance().GetApplicationData(internal_id);
   return app_data->tizen_application_info().required_version();
 }
 
@@ -622,7 +627,7 @@ void WebRuntime::SetUvSpawnEnabled(const bool enable) const {
 void WebRuntime::SetServiceAppId(const std::string& internal_id) const {
   base::AutoLock lock(service_lock);
   thread_local static WRTServiceLifeCycleFile life_cycle_file(internal_id);
-  WRTServiceManager::Get()->SetAppIdByTid(
+  WRTServiceAppData::GetInstance().SetAppIdByTid(
       ApplicationData::GetServiceID(internal_id));
 }
 
@@ -632,12 +637,14 @@ bool WebRuntime::CheckLauncherAlive(const std::string& internal_id) const {
 
 std::string WebRuntime::GetPackageId(const std::string& internal_id) const {
   base::AutoLock lock(service_lock);
-  auto app_data = WRTServiceManager::Get()->GetApplicationData(internal_id);
+  auto app_data =
+      WRTServiceAppData::GetInstance().GetApplicationData(internal_id);
   return app_data->GetPackageID();
 }
 
 std::string WebRuntime::GetMainAppId(const std::string& internal_id) const {
-  auto app_data = WRTServiceManager::Get()->GetApplicationData(internal_id);
+  auto app_data =
+      WRTServiceAppData::GetInstance().GetApplicationData(internal_id);
   return app_data ? app_data->tizen_application_info().id() : std::string();
 }
 
index cd7961c..1916926 100644 (file)
@@ -34,11 +34,6 @@ bool WRTService::IsGlobalService() {
 }
 
 // static
-std::string WRTService::GetAppPkgPath(const std::string& internal_id) {
-  return WRTServiceManager::Get()->GetAppPkgPath(internal_id);
-}
-
-// static
 bool WRTService::StartService(const std::string internal_id) {
   InterProcessCommunication ipc;
   std::string content;
old mode 100755 (executable)
new mode 100644 (file)
index 2cf32c5..723342d
@@ -23,7 +23,6 @@ class WRTService {
   static void FinishStartingService(const std::string& internal_id);
 
   static ServiceType GetServiceModel();
-  static std::string GetAppPkgPath(const std::string& internal_id);
 
  private:
   static std::string current_application_;
diff --git a/wrt/src/service/wrt_service_app_data.cc b/wrt/src/service/wrt_service_app_data.cc
new file mode 100644 (file)
index 0000000..59bce3e
--- /dev/null
@@ -0,0 +1,145 @@
+// Copyright 2024 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "wrt/src/service/wrt_service_app_data.h"
+
+#include "base/synchronization/lock.h"
+#include "base/threading/platform_thread.h"
+#include "wrt/src/base/dlog_util.h"
+
+namespace wrt {
+
+static WRTServiceAppData* instance = nullptr;
+base::Lock service_app_data_lock;
+base::Lock application_data_lock;
+
+// static
+WRTServiceAppData& WRTServiceAppData::GetInstance() {
+  if (!instance) {
+    base::AutoLock lock(service_app_data_lock);
+    if (!instance)  // double check to avoid create instance again
+      instance = new WRTServiceAppData;
+  }
+  return *instance;
+}
+
+std::string WRTServiceAppData::GetAppIdByTid() {
+  auto tid = static_cast<int>(base::PlatformThread::CurrentId());
+  base::AutoLock lock(service_app_data_lock);
+  return app_tid_map_[tid];
+}
+
+void WRTServiceAppData::SetAppIdByTid(const std::string& app_id) {
+  auto tid = static_cast<int>(base::PlatformThread::CurrentId());
+  base::AutoLock lock(service_app_data_lock);
+  app_tid_map_[tid] = app_id;
+}
+
+std::string WRTServiceAppData::GetAppControlData(std::string& app_id) {
+  base::AutoLock lock(service_app_data_lock);
+  return app_control_data_[app_id];
+}
+
+void WRTServiceAppData::SetAppcontrolData(const std::string& app_id,
+                                          const std::string& encoded_data) {
+  base::AutoLock lock(service_app_data_lock);
+  app_control_data_[app_id] = encoded_data;
+}
+
+std::string WRTServiceAppData::GetBuiltinService(
+    const std::string& internal_id) {
+  base::AutoLock lock(service_app_data_lock);
+  return builtin_service_[internal_id];
+}
+
+void WRTServiceAppData::SetBuiltinService(const std::string& internal_id,
+                                          const std::string& service_name) {
+  base::AutoLock lock(service_app_data_lock);
+  builtin_service_[internal_id] = service_name;
+}
+
+std::string WRTServiceAppData::GetAppPkgPath(const std::string& internal_id) {
+  base::AutoLock lock(service_app_data_lock);
+  return pkg_path_[internal_id];
+}
+
+void WRTServiceAppData::SetAppPkgPath(const std::string& internal_id,
+                                      const std::string& pkg_path) {
+  base::AutoLock lock(service_app_data_lock);
+  pkg_path_[internal_id] = pkg_path;
+}
+
+std::string WRTServiceAppData::GetServiceStatus(
+    const std::string& internal_id) {
+  base::AutoLock lock(service_app_data_lock);
+  return status_services_[internal_id];
+}
+
+void WRTServiceAppData::SetServiceStatus(const std::string& internal_id,
+                                         const std::string& status) {
+  base::AutoLock lock(service_app_data_lock);
+  status_services_[internal_id] = status;
+}
+
+ApplicationData* WRTServiceAppData::GetApplicationData(
+    const std::string& internal_id) {
+  base::AutoLock lock(application_data_lock);
+  ApplicationData* app_data = nullptr;
+  if (!application_data_map_[internal_id]) {
+    auto service_id = ApplicationData::GetServiceID(internal_id);
+    auto pkg_path = GetAppPkgPath(internal_id);
+    app_data = ApplicationData::Create(service_id, pkg_path);
+    app_data->Initialize();
+    application_data_map_[internal_id] =
+        std::unique_ptr<ApplicationData>(app_data);
+  } else {
+    app_data = application_data_map_[internal_id].get();
+  }
+  return app_data;
+}
+
+void WRTServiceAppData::SetOspAccessToken(const std::string& token) {
+  base::AutoLock lock(service_app_data_lock);
+  message_queue_.push(std::make_pair("OspAccessToken", token));
+}
+
+std::pair<std::string, std::string> WRTServiceAppData::GetOspAccessToken() {
+  std::pair<std::string, std::string> message;
+  if (!message_queue_.empty()) {
+    base::AutoLock lock(service_app_data_lock);
+    message = message_queue_.front();
+    message_queue_.pop();
+  }
+  return message;
+}
+
+void WRTServiceAppData::EraseBuiltinServiceApp(const std::string& internal_id) {
+  base::AutoLock lock(service_app_data_lock);
+  builtin_service_.erase(internal_id);
+}
+
+void WRTServiceAppData::EraseApplicationData(const std::string& internal_id) {
+  base::AutoLock lock(application_data_lock);
+  application_data_map_.erase(internal_id);
+}
+
+void WRTServiceAppData::EraseServiceAppDataMaps(
+    const std::string& internal_id) {
+  base::AutoLock lock(service_app_data_lock);
+  status_services_.erase(internal_id);
+  app_control_data_.erase(internal_id);
+  pkg_path_.erase(internal_id);
+  EraseApplicationData(internal_id);
+
+  auto tid = static_cast<int>(base::PlatformThread::CurrentId());
+  app_tid_map_.erase(tid);
+}
+
+bool WRTServiceAppData::IsServiceAppEmpty() {
+  if (status_services_.empty() && builtin_service_.empty())
+    return true;
+  return false;
+}
+
+}  // namespace wrt
diff --git a/wrt/src/service/wrt_service_app_data.h b/wrt/src/service/wrt_service_app_data.h
new file mode 100644 (file)
index 0000000..cda48b4
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright 2024 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BROWSER_WRT_SERVICE_APP_DATA_H_
+#define BROWSER_WRT_SERVICE_APP_DATA_H_
+
+#include <map>
+#include <memory>
+#include <queue>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+#include "uv.h"
+#include "wrt/src/common/application_data.h"
+
+namespace wrt {
+
+class WRTServiceAppData {
+ public:
+  WRTServiceAppData() {}
+  ~WRTServiceAppData() {}
+
+  static WRTServiceAppData& GetInstance();
+  void EraseApplicationData(const std::string& internal_id);
+  void EraseBuiltinServiceApp(const std::string& internal_id);
+  void EraseServiceAppDataMaps(const std::string& internal_id);
+  std::string GetAppIdByTid();
+  void SetAppIdByTid(const std::string& app_id);
+  std::string GetAppControlData(std::string& app_id);
+  void SetAppcontrolData(const std::string& app_id,
+                         const std::string& encoded_bundle);
+  std::string GetBuiltinService(const std::string& internal_id);
+  void SetBuiltinService(const std::string& internal_id,
+                         const std::string& service_name);
+  std::string GetAppPkgPath(const std::string& internal_id);
+  void SetAppPkgPath(const std::string& internal_id,
+                     const std::string& pkg_path);
+  std::string GetServiceStatus(const std::string& internal_id);
+  void SetServiceStatus(const std::string& internal_id,
+                        const std::string& status);
+
+  ApplicationData* GetApplicationData(const std::string& internal_id);
+
+  void SetOspAccessToken(const std::string& token);
+  std::pair<std::string, std::string> GetOspAccessToken();
+  bool IsServiceAppEmpty();
+
+ private:
+  std::map<int, std::string> app_tid_map_;
+  std::unordered_map<std::string, std::string> app_control_data_;
+  std::unordered_map<std::string, std::string> builtin_service_;
+  std::unordered_map<std::string, std::string> pkg_path_;
+  std::unordered_map<std::string, std::string> status_services_;
+  std::unordered_map<std::string, std::unique_ptr<ApplicationData>>
+      application_data_map_;
+
+  std::queue<std::pair<std::string, std::string>> message_queue_;
+};
+
+}  // namespace wrt
+
+#endif  // BROWSER_WRT_SERVICE_MANAGER_H_
index 905d79c..86aeac5 100644 (file)
@@ -18,6 +18,7 @@
 #include "wrt/src/base/string_utils.h"
 #include "wrt/src/browser/api/wrt_api_web_runtime.h"
 #include "wrt/src/service/wrt_service.h"
+#include "wrt/src/service/wrt_service_app_data.h"
 
 #if BUILDFLAG(IS_TIZEN_TV)
 #if TIZEN_VERSION_AT_LEAST(7, 0, 0)
@@ -108,7 +109,8 @@ void DbusSetAppcontrolData(const char*,
     LOG(ERROR) << "Argument should be {app_id}:{app_control_data}";
     return;
   }
-  service_manager->SetAppcontrolData(appcontrol_argv[0], appcontrol_argv[1]);
+  WRTServiceAppData::GetInstance().SetAppcontrolData(appcontrol_argv[0],
+                                                     appcontrol_argv[1]);
 }
 
 void DbusBuiltinService(const char*,
@@ -180,7 +182,7 @@ void DbusDecryptFile(const char*,
   auto& file_path = service_argv[1];
 
   auto service_id = ApplicationData::GetServiceID(internal_id);
-  auto pkg_path = WRTService::GetAppPkgPath(internal_id);
+  auto pkg_path = WRTServiceAppData::GetInstance().GetAppPkgPath(internal_id);
 
   auto decrypted_src = EncryptedFileHandler::DecryptFile(
       service_id, pkg_path, base::FilePath(file_path));
@@ -274,7 +276,8 @@ void WRTServiceManager::CloseUvHandlers() {
 }
 
 bool WRTServiceManager::DidStartService(const std::string& internal_id) {
-  return (status_services_[internal_id] == "started");
+  return (WRTServiceAppData::GetInstance().GetServiceStatus(internal_id) ==
+          "started");
 }
 
 void WRTServiceManager::StartService(const std::string& internal_id,
@@ -283,12 +286,13 @@ void WRTServiceManager::StartService(const std::string& internal_id,
   internal_id_ = internal_id;
   uv_mutex_lock(&mutex_);
   if (!DidStartService(internal_id)) {
-    status_services_[internal_id] = "started";
+    WRTServiceAppData::GetInstance().SetServiceStatus(internal_id, "started");
   }
   prepared_to_start_services_.push_back(internal_id_);
   ui_source_names_[internal_id_] = source_name;
-  pkg_path_[internal_id_] = pkg_path;
+  WRTServiceAppData::GetInstance().SetAppPkgPath(internal_id, pkg_path);
   uv_mutex_unlock(&mutex_);
+
   uv_async_send(&handle_adder_);
 }
 
@@ -303,16 +307,7 @@ void WRTServiceManager::StopService(const std::string& internal_id) {
 }
 
 void WRTServiceManager::FinalizeService(const std::string& internal_id) {
-  uv_mutex_lock(&mutex_);
-  status_services_.erase(internal_id);
-  app_control_data_.erase(internal_id);
-  pkg_path_.erase(internal_id);
-  application_data_map_.erase(internal_id);
-
-  auto tid = static_cast<int>(base::PlatformThread::CurrentId());
-  app_tid_map_.erase(tid);
-  uv_mutex_unlock(&mutex_);
-
+  WRTServiceAppData::GetInstance().EraseServiceAppDataMaps(internal_id);
   SendMessage("KillLauncherProcess", internal_id.c_str());
 }
 
@@ -320,10 +315,8 @@ void WRTServiceManager::RunBuiltinService(const std::string& service_name,
                                           const std::string& internal_id,
                                           const std::string& pkg_path) {
   internal_id_ = internal_id;
-  uv_mutex_lock(&mutex_);
-  pkg_path_[internal_id_] = pkg_path;
-  builtin_service_[internal_id_] = service_name;
-  uv_mutex_unlock(&mutex_);
+  WRTServiceAppData::GetInstance().SetAppPkgPath(internal_id, pkg_path);
+  WRTServiceAppData::GetInstance().SetBuiltinService(internal_id, service_name);
   uv_async_send(&handle_builtin_);
 }
 
@@ -340,7 +333,8 @@ void WRTServiceManager::InitAulHandler(int argc, char** argv) {
         switch (type) {
           case AUL_START: {
             auto encoded_bundle = ConvertEncodedBundle(bundle_data);
-            Get()->SetAppcontrolData(app_id, encoded_bundle);
+            WRTServiceAppData::GetInstance().SetAppcontrolData(app_id,
+                                                               encoded_bundle);
             auto pkg_path = ApplicationData::GetPackagePath(app_id);
             Get()->StartService(app_id, app_id, pkg_path);
             break;
@@ -384,17 +378,9 @@ void WRTServiceManager::SetServiceModel(
 }
 
 std::string WRTServiceManager::GetAppControlData(std::string& app_id) {
-  return app_control_data_[app_id];
+  return WRTServiceAppData::GetInstance().GetAppControlData(app_id);
 }
 
-void WRTServiceManager::SetAppcontrolData(const std::string& app_id,
-    const std::string& encoded_data) {
-  app_control_data_[app_id] = encoded_data;
-}
-
-std::string WRTServiceManager::GetAppPkgPath(const std::string& internal_id) {
-  return pkg_path_[internal_id];
-}
 
 void WRTServiceManager::DelayShutdown(int exit_count) {
   // counter for terminating node process if no service
@@ -416,13 +402,9 @@ bool WRTServiceManager::HandleMessageQueue() {
   if (!wrt)
     return false;
 
-  uv_mutex_lock(&mutex_);
   std::pair<std::string, std::string> message;
-  if (!message_queue_.empty()) {
-    message = message_queue_.front();
-    message_queue_.pop();
-  }
-  uv_mutex_unlock(&mutex_);
+  message = WRTServiceAppData::GetInstance().GetOspAccessToken();
+
   if (message.first.empty())
     return false;
 
@@ -439,7 +421,7 @@ void WRTServiceManager::CheckTimeout() {
   if (HandleMessageQueue())
    return;
 
-  if (status_services_.empty() && builtin_service_.empty()) {
+  if (WRTServiceAppData::GetInstance().IsServiceAppEmpty()) {
     if (exit_count_) {
       exit_count_--;
     } else {
@@ -503,37 +485,9 @@ bool WRTServiceManager::CheckLauncherAlive(const std::string& internal_id) {
   return is_running;
 }
 
-std::string WRTServiceManager::GetAppIdByTid() {
-  auto tid = static_cast<int>(base::PlatformThread::CurrentId());
-  uv_mutex_lock(&mutex_);
-  auto app_id = app_tid_map_[tid];
-  uv_mutex_unlock(&mutex_);
-  return app_id;
-}
-
-void WRTServiceManager::SetAppIdByTid(const std::string& app_id) {
-  auto tid = static_cast<int>(base::PlatformThread::CurrentId());
-  uv_mutex_lock(&mutex_);
-  app_tid_map_[tid] = app_id;
-  uv_mutex_unlock(&mutex_);
-}
-
 ApplicationData* WRTServiceManager::GetApplicationData(
     const std::string& internal_id) {
-  uv_mutex_lock(&mutex_);
-  ApplicationData* app_data = nullptr;
-  if (!application_data_map_[internal_id]) {
-    auto service_id = ApplicationData::GetServiceID(internal_id);
-    auto pkg_path = GetAppPkgPath(internal_id);
-    app_data = ApplicationData::Create(service_id, pkg_path);
-    app_data->Initialize();
-    application_data_map_[internal_id] =
-        std::unique_ptr<ApplicationData>(app_data);
-  } else {
-    app_data = application_data_map_[internal_id].get();
-  }
-  uv_mutex_unlock(&mutex_);
-  return app_data;
+  return WRTServiceAppData::GetInstance().GetApplicationData(internal_id);
 }
 
 bool WRTServiceManager::IsStandaloneService() {
@@ -542,9 +496,9 @@ bool WRTServiceManager::IsStandaloneService() {
 
 std::string WRTServiceManager::GetRuntimeVariable(
     const std::string& runtime_key) {
-  auto app_id = GetAppIdByTid();
+  auto app_id = WRTServiceAppData::GetInstance().GetAppIdByTid();
   if (runtime_key == "encoded_bundle") {
-    return GetAppControlData(app_id);
+    return WRTServiceAppData::GetInstance().GetAppControlData(app_id);
   } else if (runtime_key == "package_id") {
     return GetApplicationData(app_id)->GetPackageID();
   } else if (runtime_key == "application_id") {
@@ -572,12 +526,6 @@ std::string WRTServiceManager::GetRuntimeVariable(
   }
 }
 
-void WRTServiceManager::SendOspAccessToken(const std::string& token) {
-  uv_mutex_lock(&mutex_);
-  message_queue_.push(std::make_pair("OspAccessToken", token));
-  uv_mutex_unlock(&mutex_);
-}
-
 // static
 void WRTServiceManager::OnServiceStarted(uv_async_t* handle) {
   auto service_manager = WRTServiceManager::Get();
@@ -639,9 +587,10 @@ void WRTServiceManager::OnBuiltinService(uv_async_t* handle) {
   uv_mutex_lock(&service_manager->mutex_);
 
   auto internal_id = service_manager->internal_id_;
-  auto service_name = service_manager->builtin_service_[internal_id];
+  auto service_name =
+      WRTServiceAppData::GetInstance().GetBuiltinService(internal_id);
   wrt->Emit("builtin-service", internal_id, service_name);
-  service_manager->builtin_service_.erase(internal_id);
+  WRTServiceAppData::GetInstance().EraseBuiltinServiceApp(internal_id);
   service_manager->DelayShutdown();
   uv_mutex_unlock(&service_manager->mutex_);
 }
index c29a365..3bb7378 100644 (file)
@@ -36,9 +36,7 @@ class WRTServiceManager {
   void RunBuiltinService(const std::string& service_name,
                          const std::string& internal_id,
                          const std::string& pkg_path);
-  void SendOspAccessToken(const std::string& token);
-  void SetAppcontrolData(const std::string& app_id,
-                         const std::string& encoded_bundle);
+
   void SetServiceModel(WRTService::ServiceType service_model);
   void Shutdown();
 
@@ -53,13 +51,9 @@ class WRTServiceManager {
   WRTService::ServiceType GetServiceModel();
 
   std::string GetAppControlData(std::string& app_id);
-  std::string GetAppPkgPath(const std::string& internal_id);
   std::string GetRuntimeVariable(const std::string& runtime_key);
   std::string SendMessageAndWaitReply(const char* type, const char* argument);
 
-  std::string GetAppIdByTid();
-  void SetAppIdByTid(const std::string& app_id);
-
   ApplicationData* GetApplicationData(const std::string& internal_id);
 
  private:
@@ -84,14 +78,7 @@ class WRTServiceManager {
 
   std::vector<std::string> prepared_to_start_services_;
   std::vector<std::string> prepared_to_stop_services_;
-  std::map<int, std::string> app_tid_map_;
-  std::unordered_map<std::string, std::string> app_control_data_;
-  std::unordered_map<std::string, std::string> pkg_path_;
-  std::unordered_map<std::string, std::string> builtin_service_;
   std::unordered_map<std::string, std::string> ui_source_names_;
-  std::unordered_map<std::string, std::string> status_services_;
-  std::unordered_map<std::string, std::unique_ptr<ApplicationData>>
-      application_data_map_;
 
   wrt::InterProcessCommunication ipc_;
   std::string internal_id_;
@@ -103,7 +90,6 @@ class WRTServiceManager {
   unsigned int exit_count_ = 120;
   bool quit_requested_ = false;
   int ppid_ = 0;
-  std::queue<std::pair<std::string, std::string>> message_queue_;
 };
 
 }  // namespace wrt