Unregister extensions and instances when application exits
authorWonYoung Choi <wy80.choi@samsung.com>
Wed, 1 Jun 2016 07:55:32 +0000 (16:55 +0900)
committerWonYoung Choi <wy80.choi@samsung.com>
Wed, 1 Jun 2016 08:18:38 +0000 (17:18 +0900)
In single process model, the extension server is running in the mainloop
of the browser thread. So the extension server can't receive ewk_ipc message
after the mainloop is terminated. WebApplication calls the Shutdown() method
of ExtensionServer explicitly now.

extensions/common/xwalk_extension.cc
extensions/common/xwalk_extension_adapter.cc
extensions/common/xwalk_extension_manager.cc
extensions/common/xwalk_extension_manager.h
extensions/common/xwalk_extension_server.cc
extensions/common/xwalk_extension_server.h
runtime/browser/web_application.cc

index 0110bb2..5cb8bc7 100644 (file)
@@ -49,7 +49,6 @@ XWalkExtension::XWalkExtension(const std::string& path,
 XWalkExtension::~XWalkExtension() {
   if (!initialized_)
     return;
-
   if (shutdown_callback_)
     shutdown_callback_(xw_extension_);
   XWalkExtensionAdapter::GetInstance()->UnregisterExtension(this);
index 391a130..86df5b5 100644 (file)
@@ -48,8 +48,10 @@ void XWalkExtensionAdapter::UnregisterExtension(XWalkExtension* extension) {
     LOGGER(WARN) << "xw_extension (" << xw_extension << ") is invalid.";
     return;
   }
-  if (extension_map_.find(xw_extension) != extension_map_.end())
-    extension_map_.erase(xw_extension);
+  auto it = extension_map_.find(xw_extension);
+  if (it != extension_map_.end()) {
+    extension_map_.erase(it);
+  }
 }
 
 void XWalkExtensionAdapter::RegisterInstance(
@@ -70,8 +72,10 @@ void XWalkExtensionAdapter::UnregisterInstance(
     LOGGER(WARN) << "xw_instance (" << xw_instance << ") is invalid.";
     return;
   }
-  if (instance_map_.find(xw_instance) != instance_map_.end())
-    instance_map_.erase(xw_instance);
+  auto it = instance_map_.find(xw_instance);
+  if (it != instance_map_.end()) {
+    instance_map_.erase(it);
+  }
 }
 
 const void* XWalkExtensionAdapter::GetInterface(const char* name) {
index 962c0ae..e654550 100644 (file)
@@ -108,6 +108,13 @@ void XWalkExtensionManager::LoadExtensions(bool meta_only) {
   }
 }
 
+void XWalkExtensionManager::UnloadExtensions() {
+  for (auto it = extensions_.begin(); it != extensions_.end(); ++it) {
+    delete it->second;
+  }
+  extensions_.clear();
+}
+
 bool XWalkExtensionManager::RegisterSymbols(XWalkExtension* extension) {
   std::string name = extension->name();
 
index 71c6575..7bfd611 100644 (file)
@@ -26,6 +26,8 @@ class XWalkExtensionManager : public XWalkExtension::XWalkExtensionDelegate {
   void LoadExtensions(bool meta_only = true);
   void PreloadExtensions();
 
+  void UnloadExtensions();
+
  private:
   // override
   void GetRuntimeVariable(const char* key, char* value, size_t value_len);
index 5009af1..d0faec7 100644 (file)
@@ -37,6 +37,14 @@ void XWalkExtensionServer::Preload() {
   manager_.PreloadExtensions();
 }
 
+void XWalkExtensionServer::Shutdown() {
+  for (auto it = instances_.begin(); it != instances_.end(); ++it) {
+    delete it->second;
+  }
+  instances_.clear();
+  manager_.UnloadExtensions();
+}
+
 Json::Value XWalkExtensionServer::GetExtensions() {
   Json::Value out;
   auto extensions = manager_.extensions();
index fd6cce1..186fb98 100644 (file)
@@ -28,6 +28,8 @@ class XWalkExtensionServer {
 
   void HandleIPCMessage(Ewk_IPC_Wrt_Message_Data* data);
 
+  void Shutdown();
+
  private:
   XWalkExtensionServer();
   virtual ~XWalkExtensionServer();
index dd3afac..bd39f6d 100644 (file)
@@ -496,6 +496,8 @@ void WebApplication::Terminate() {
   } else {
     elm_exit();
   }
+  auto extension_server = extensions::XWalkExtensionServer::GetInstance();
+  extension_server->Shutdown();
 }
 
 void WebApplication::OnCreatedNewWebView(WebView* /*view*/, WebView* new_view) {
@@ -542,7 +544,6 @@ void WebApplication::OnClosedWebView(WebView* view) {
 
 void WebApplication::OnReceivedWrtMessage(WebView* /*view*/,
                                           Ewk_IPC_Wrt_Message_Data* msg) {
-  SCOPE_PROFILE();
   Eina_Stringshare* msg_type = ewk_ipc_wrt_message_data_type_get(msg);
 
 #define TYPE_BEGIN(x) (!strncmp(msg_type, x, strlen(x)))