From 1d4ef70b38e9279d1933d8a8fc873a498e17c25c Mon Sep 17 00:00:00 2001 From: Szymon Jastrzebski Date: Mon, 10 Jul 2017 12:31:20 +0200 Subject: [PATCH] [FMRadio] Fixing memory leak There was a memory leak, which happened when user called tizen.fmradio.scanStop, after starting scanning. user_data was allocated in method FMRadioManager::ScanStart but it was lost when scanning was interrupted. FMRadio TCT passed 100%. Signed-off-by: Szymon Jastrzebski Change-Id: I2f4b8b74c8a7703dd9d31f5ca8e338caa5e90c45 --- src/radio/radio_manager.cc | 38 ++++++++++++++++++++------------------ src/radio/radio_manager.h | 19 +++++++++++++++++++ 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/radio/radio_manager.cc b/src/radio/radio_manager.cc index a6871a84..d94f4e98 100755 --- a/src/radio/radio_manager.cc +++ b/src/radio/radio_manager.cc @@ -111,21 +111,6 @@ double ToMHz(int frequency) { return static_cast(frequency) / 1000.0; } -struct RadioData { - explicit RadioData(FMRadioManager& manager) - : manager_(manager), - callback_id_(0.0) { - } - - FMRadioManager& manager_; - double callback_id_; -}; - -struct RadioScanData : public RadioData { - using RadioData::RadioData; - std::vector frequencies_; -}; - void RadioSeekCallback(int frequency, void* user_data) { LoggerD("Enter, freq: %d", frequency); @@ -181,6 +166,7 @@ void ScanCompleteCallback(void* user_data) { common::TaskQueue::GetInstance().Async(std::bind(&PostAsyncSuccess, &data->manager_, data->callback_id_, event)); + data->manager_.SetScanData(nullptr); delete data; } @@ -190,6 +176,8 @@ void ScanStopCallback(void *user_data) { common::TaskQueue::GetInstance().Async(std::bind( &FMRadioManager::PostResultCallbackSuccess, &data->manager_, data->callback_id_)); + delete data->manager_.GetScanData(); + data->manager_.SetScanData(nullptr); delete data; } @@ -250,6 +238,14 @@ bool FMRadioManager::IsMuted() { return muted; } +RadioScanData *FMRadioManager::GetScanData() { + return this->scan_data; +} + +void FMRadioManager::SetScanData(RadioScanData *scan_data) { + this->scan_data = scan_data; +} + void FMRadioManager::SetMute(bool mute) { LoggerD("Enter"); @@ -332,7 +328,8 @@ double FMRadioManager::GetSignalStrength() { FMRadioManager::FMRadioManager(RadioInstance& instance) : instance_(instance), - radio_instance_(nullptr) { + radio_instance_(nullptr), + scan_data(nullptr) { LoggerD("Enter"); const auto err = radio_create(&radio_instance_); @@ -352,9 +349,8 @@ FMRadioManager::~FMRadioManager() { if (RADIO_ERROR_NONE != err) { LoggerE("radio_destroy() failed: %d", err); } - - radio_instance_ = nullptr; } + delete scan_data; } PlatformResult FMRadioManager::Start(double frequency) { @@ -468,7 +464,9 @@ void FMRadioManager::ScanStart(double callback_id) { radio_unset_scan_completed_cb(radio_instance_); PostResultFailure(callback_id, GetPlatformResult("radio_scan_start", err)); delete user_data; + return; } + this->scan_data = user_data; } void FMRadioManager::ScanStop(double callback_id) { @@ -483,6 +481,8 @@ void FMRadioManager::ScanStop(double callback_id) { PostResultFailure(callback_id, GetPlatformResult("radio_unset_scan_completed_cb", err)); delete user_data; + delete this->scan_data; + this->scan_data = nullptr; return; } @@ -491,6 +491,8 @@ void FMRadioManager::ScanStop(double callback_id) { LoggerE("Failed"); PostResultFailure(callback_id, GetPlatformResult("radio_scan_stop", err)); delete user_data; + delete this->scan_data; + this->scan_data = nullptr; } } diff --git a/src/radio/radio_manager.h b/src/radio/radio_manager.h index 614f4154..fd9ea34f 100755 --- a/src/radio/radio_manager.h +++ b/src/radio/radio_manager.h @@ -32,6 +32,7 @@ namespace extension { namespace radio { class RadioInstance; +struct RadioScanData; class FMRadioManager { public: @@ -52,6 +53,8 @@ class FMRadioManager { common::PlatformResult UnsetAntennaChangeListener(); bool IsMuted(); + RadioScanData *GetScanData(); + void SetScanData(RadioScanData *scan_data); void SetMute(bool mute); common::PlatformResult SetFrequency(double frequency); double GetFrequency(); @@ -67,6 +70,22 @@ class FMRadioManager { private: RadioInstance& instance_; radio_h radio_instance_; + RadioScanData *scan_data; +}; + +struct RadioData { + explicit RadioData(FMRadioManager& manager) + : manager_(manager), + callback_id_(0.0) { + } + + FMRadioManager& manager_; + double callback_id_; +}; + +struct RadioScanData : public RadioData { + using RadioData::RadioData; + std::vector frequencies_; }; } // namespace radio -- 2.34.1