[FMRadio] fix for FMRadio (fix crash)
authorLukasz Bardeli <l.bardeli@samsung.com>
Wed, 29 Jul 2015 13:04:41 +0000 (15:04 +0200)
committerLukasz Bardeli <l.bardeli@samsung.com>
Wed, 29 Jul 2015 13:18:21 +0000 (15:18 +0200)
[Verification] Code copmiles without error.

Change-Id: I8be428a353b074e24e8a8b8b292e12aee81321df
Signed-off-by: Lukasz Bardeli <l.bardeli@samsung.com>
src/radio/radio_manager.cc
src/radio/radio_manager.h

index aa7d14a319971ba6799d1ad1882bd53cc4015a79..72cfa5dca36bea276c411df04e46a6bdc1b80ecc 100755 (executable)
@@ -35,6 +35,9 @@ using namespace std;
 namespace extension {
 namespace radio {
 
+std::vector<FMRadioManager*> FMRadioManager::managers_;
+std::mutex FMRadioManager::managers_mutex_;
+
 namespace {
 
 const int kLowestFrequency = 87500;
@@ -338,7 +341,11 @@ FMRadioManager::FMRadioManager(RadioInstance& instance)
   if (RADIO_ERROR_NONE != err) {
     LoggerE("radio_create() failed: %d", err);
     radio_instance_ = nullptr;
+  } else {
+    std::lock_guard<std::mutex> lock(managers_mutex_);
+    managers_.push_back(this);
   }
+
 }
 
 FMRadioManager::~FMRadioManager() {
@@ -353,6 +360,23 @@ FMRadioManager::~FMRadioManager() {
 
     radio_instance_ = nullptr;
   }
+  std::lock_guard<std::mutex> lock(managers_mutex_);
+  for (auto it = managers_.begin(); it != managers_.end(); it++) {
+    if (*it == this) {
+      managers_.erase(it);
+      break;
+    }
+  }
+}
+
+bool FMRadioManager::CheckInstance(const FMRadioManager* manager) {
+  LoggerD("Entered");
+  for (auto vec_manager : managers_) {
+    if (vec_manager == manager) {
+      return true;
+    }
+  }
+  return false;
 }
 
 PlatformResult FMRadioManager::Start(double frequency) {
@@ -483,9 +507,13 @@ common::PlatformResult FMRadioManager::UnsetAntennaChangeListener() {
 }
 
 void FMRadioManager::PostMessage(const std::string& msg) const {
+  LoggerD("Enter");
+
+  if (!CheckInstance(this)) {
+    return;
+  }
   instance_.PostMessage(msg.c_str());
 }
-
 void FMRadioManager::PostResultSuccess(double callbackId, picojson::value* event) const {
   auto& obj = event->get<picojson::object>();
 
index b047a3d9775639574b9117b446c73ab50647de08..75aad27c75fdad72847867019bf52efcfba374e9 100755 (executable)
@@ -20,6 +20,7 @@
 #include <list>
 #include <string>
 #include <vector>
+#include <mutex>
 
 #include <radio.h>
 #include <runtime_info.h>
@@ -63,9 +64,13 @@ class FMRadioManager {
   void PostResultCallbackSuccess(double callbackId) const;
   void PostResultFailure(double callbackId, const common::PlatformResult& result) const;
 
+  static bool CheckInstance(const FMRadioManager* instance);
  private:
   RadioInstance& instance_;
   radio_h radio_instance_;
+
+  static std::mutex managers_mutex_;
+  static std::vector<FMRadioManager*> managers_;
 };
 
 } // namespace radio