[FMRadio] Fix multiple crashes
authorPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Tue, 19 May 2015 10:47:07 +0000 (12:47 +0200)
committerPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Wed, 20 May 2015 09:39:45 +0000 (11:39 +0200)
Callbacks from radio api aren't called in main thread.
Added TaskQueue.

[Verification]
No crashes during tct.

Change-Id: Ib03c2a7c9137f4cfd24511a9608a49e6581668aa
Signed-off-by: Przemyslaw Ciezkowski <p.ciezkowski@samsung.com>
src/radio/radio_manager.cc
src/radio/radio_manager.h

index aca429e6f59b8a7adad62d5d9342c0927c3f3900..ffe2fbe4d83d25fbc0a58737f91f6af82cb80a58 100755 (executable)
@@ -13,6 +13,7 @@
 
 #include "common/logger.h"
 #include "common/extension.h"
+#include "common/task-queue.h"
 
 #include "radio/radio_instance.h"
 
@@ -115,9 +116,13 @@ void RadioSeekCallback(int frequency, void* user_data) {
   PlatformResult result = data->manager_.SetFrequency(ToMHz(frequency));
 
   if (result) {
-    data->manager_.PostResultSuccess(data->callback_id_);
+    common::TaskQueue::GetInstance().Async(std::bind(
+      &FMRadioManager::PostResultCallbackSuccess, &data->manager_,
+      data->callback_id_));
   } else {
-    data->manager_.PostResultFailure(data->callback_id_, result);
+    common::TaskQueue::GetInstance().Async(std::bind(
+      &FMRadioManager::PostResultFailure, &data->manager_,
+      data->callback_id_, result));
   }
 
   delete data;
@@ -133,7 +138,13 @@ void ScanStartCallback(int frequency, void* user_data) {
   auto& obj = event.get<picojson::object>();
   obj.insert(std::make_pair("frequency", picojson::value(ToMHz(frequency))));
   obj.insert(std::make_pair("listenerId", picojson::value("FMRadio_Onfrequencyfound")));
-  data->manager_.PostMessage(event.serialize());
+  common::TaskQueue::GetInstance().Async(std::bind(
+    &FMRadioManager::PostMessage, &data->manager_, event.serialize()));
+}
+
+void PostAsyncSuccess(FMRadioManager& manager, double callbackId, picojson::value* event) {
+  manager.PostResultSuccess(callbackId, event);
+  delete event;
 }
 
 void ScanCompleteCallback(void* user_data) {
@@ -141,8 +152,8 @@ void ScanCompleteCallback(void* user_data) {
 
   RadioScanData* data = static_cast<RadioScanData*>(user_data);
 
-  picojson::value event{picojson::object()};
-  auto& obj = event.get<picojson::object>();
+  picojson::value* event = new picojson::value(picojson::object());
+  auto& obj = event->get<picojson::object>();
   obj.insert(std::make_pair("name", picojson::value("onfinished")));
 
   picojson::array frequencies;
@@ -151,7 +162,8 @@ void ScanCompleteCallback(void* user_data) {
   }
 
   obj.insert(std::make_pair("frequencies", picojson::value(frequencies)));
-  data->manager_.PostResultSuccess(data->callback_id_, &event);
+  common::TaskQueue::GetInstance().Async(std::bind(&PostAsyncSuccess,
+    data->manager_, data->callback_id_, event));
 
   delete data;
 }
@@ -160,7 +172,8 @@ void ScanStopCallback(void *user_data) {
   LoggerD("Enter");
   RadioData* data = static_cast<RadioData*>(user_data);
 
-  data->manager_.PostResultSuccess(data->callback_id_);
+  common::TaskQueue::GetInstance().Async(std::bind(
+    &FMRadioManager::PostResultCallbackSuccess, &data->manager_, data->callback_id_));
   delete data;
 }
 
@@ -181,7 +194,8 @@ void RadioInterruptedCallback(radio_interrupted_code_e code, void *user_data) {
   }
 
   FMRadioManager* manager = static_cast<FMRadioManager*>(user_data);
-  manager->PostMessage(event.serialize());
+  common::TaskQueue::GetInstance().Async(std::bind(
+    &FMRadioManager::PostMessage, manager, event.serialize()));
 }
 
 
@@ -201,7 +215,8 @@ void RadioAntennaCallback(runtime_info_key_e key, void* user_data) {
   obj.insert(std::make_pair("listenerId", picojson::value("FMRadio_Antenna")));
 
   FMRadioManager* manager = static_cast<FMRadioManager*>(user_data);
-  manager->PostMessage(event.serialize());
+  common::TaskQueue::GetInstance().Async(std::bind(
+    &FMRadioManager::PostMessage, manager, event.serialize()));
 }
 
 } // namespace
@@ -461,7 +476,7 @@ void FMRadioManager::PostResultSuccess(double callbackId, picojson::value* event
   PostMessage(event->serialize());
 }
 
-void FMRadioManager::PostResultSuccess(double callbackId) const {
+void FMRadioManager::PostResultCallbackSuccess(double callbackId) const {
   picojson::value event{picojson::object()};
 
   PostResultSuccess(callbackId, &event);
index ecf16522c562f81a8c6a64a862880fb4d23530f0..916c4d7232bfc7bebe49174d20c104bdb48cfd53 100755 (executable)
@@ -46,7 +46,7 @@ class FMRadioManager {
 
   void PostMessage(const std::string& msg) const;
   void PostResultSuccess(double callbackId, picojson::value* event) const;
-  void PostResultSuccess(double callbackId) const;
+  void PostResultCallbackSuccess(double callbackId) const;
   void PostResultFailure(double callbackId, const common::PlatformResult& result) const;
 
  private: