[SystemInfo] Wait for all existing asynchronous operations.
authorPawel Andruszkiewicz <p.andruszkie@samsung.com>
Fri, 1 Apr 2016 12:05:22 +0000 (14:05 +0200)
committerHyunJin Park <hj.na.park@samsung.com>
Mon, 9 May 2016 01:42:05 +0000 (10:42 +0900)
Running cordova test with WiFi disabled and mobile data enabled caused segmentation fault.
This commit fixed that issue.

[Verification] TCT pass rate: 100% (297/297/0/0/0)

Change-Id: Ibdc42f439f878605c7edc0e5a9c2084d8528226d
Signed-off-by: Pawel Andruszkiewicz <p.andruszkie@samsung.com>
src/systeminfo/systeminfo_manager.cc
src/systeminfo/systeminfo_manager.h

index 35c2c2f8721acb7f5da4699e404340aab2410743..c33238314b7d9c39965c25de98521be8fd6e33bd 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "systeminfo/systeminfo_manager.h"
 
+#include <condition_variable>
 #include <functional>
 #include <memory>
 
@@ -423,6 +424,38 @@ class SysteminfoManager::TapiManager {
   SimDetailsManager sim_manager_;
 };
 
+class SysteminfoManager::AsynchronousOperation {
+ public:
+  AsynchronousOperation(int count_ = 0)
+      : count_(count_) {
+  }
+
+  ~AsynchronousOperation() {
+    std::unique_lock<std::mutex> lock(mutex_);
+
+    while (0 != count_) {
+      cv_.wait(lock);
+    }
+  }
+
+  inline void start() {
+    std::unique_lock<std::mutex> lock(mutex_);
+    ++count_;
+    cv_.notify_one();
+  }
+
+  inline void finish() {
+    std::unique_lock<std::mutex> lock(mutex_);
+    --count_;
+    cv_.notify_one();
+  }
+
+ private:
+  std::mutex mutex_;
+  std::condition_variable cv_;
+  int count_;
+};
+
 SysteminfoManager::SysteminfoManager(SysteminfoInstance* instance)
     : instance_(instance),
       prop_manager_(*this),
@@ -437,7 +470,8 @@ SysteminfoManager::SysteminfoManager(SysteminfoInstance* instance)
       tapi_manager_(new TapiManager()),
       cpu_event_id_(0),
       storage_event_id_(0),
-      connection_handle_(nullptr) {
+      connection_handle_(nullptr),
+      async_op_(new AsynchronousOperation()) {
         LoggerD("Entered");
         int error = wifi_initialize();
         if (WIFI_ERROR_NONE != error) {
@@ -601,6 +635,8 @@ void SysteminfoManager::GetPropertyValue(const picojson::value& args, picojson::
       return;
     }
     ReportSuccess(result, response->get<picojson::object>());
+
+    async_op_->finish();
   };
 
   auto get_response = [this, callback_id](const std::shared_ptr<picojson::value>& response) -> void {
@@ -614,6 +650,8 @@ void SysteminfoManager::GetPropertyValue(const picojson::value& args, picojson::
   auto data = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
 
   TaskQueue::GetInstance().Queue<picojson::value>(get, get_response, data);
+
+  async_op_->start();
 }
 
 void SysteminfoManager::GetPropertyValueArray(const picojson::value& args, picojson::object* out) {
@@ -636,6 +674,8 @@ void SysteminfoManager::GetPropertyValueArray(const picojson::value& args, picoj
       return;
     }
     ReportSuccess(result, response->get<picojson::object>());
+
+    async_op_->finish();
   };
 
   auto get_response = [this, callback_id](const std::shared_ptr<picojson::value>& response) -> void {
@@ -648,6 +688,8 @@ void SysteminfoManager::GetPropertyValueArray(const picojson::value& args, picoj
   auto data = std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
 
   TaskQueue::GetInstance().Queue<picojson::value>(get, get_response, data);
+
+  async_op_->start();
 }
 
 void SysteminfoManager::GetTotalMemory(const picojson::value& args, picojson::object* out) {
index 5251633cdc3a7d5f635718442d52478085e7b723..c34dd4e2e667882a31110971db0fdfbf14df1068 100644 (file)
@@ -86,6 +86,7 @@ class SysteminfoManager {
   void CallStorageListenerCallback();
  private:
   class TapiManager;
+  class AsynchronousOperation;
 
   void PostListenerResponse(const std::string& property_id, const picojson::value& result,
                             int property_index = 0);
@@ -150,6 +151,7 @@ class SysteminfoManager {
   connection_h connection_handle_;
   std::mutex connection_mutex_;
 
+  std::unique_ptr<AsynchronousOperation> async_op_;
 };
 } // namespace systeminfo
 } // namespace webapi