From: Przemyslaw Ciezkowski Date: Mon, 16 Feb 2015 11:35:29 +0000 (+0100) Subject: [TV Audio] Remove deadlock X-Git-Tag: submit/tizen_tv/20150603.064601~1^2~416 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e7d4fb932f63f5346e31480a58da7b30b68b2c67;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [TV Audio] Remove deadlock When JS tries to call unsetVolumeChangeListener() in VolumeChangeListener callback, deadlock appears in sound manager. Solution: call JS callback not from sound_manager callback, but from g_idle_add() callback. [Verification] TCT AudioControlManager_setVolumeChangeListener now doesn't block Change-Id: I0c1f2b1d0a77b440aa60c376b69daafd9e1be50a Signed-off-by: Przemyslaw Ciezkowski --- diff --git a/src/tvaudio/tvaudio_manager.cc b/src/tvaudio/tvaudio_manager.cc index 63764ef2..bec083aa 100755 --- a/src/tvaudio/tvaudio_manager.cc +++ b/src/tvaudio/tvaudio_manager.cc @@ -10,8 +10,6 @@ #include #include -#include - #include // NOLINT (readability/streams) // this flag is no longer enforced in the newest cpplint.py @@ -175,10 +173,17 @@ void AudioControlManager::volumeChangeCallback( unsigned int /*volume*/, void* /*user_data*/) { LOGD("Enter"); + if (!g_idle_add(onVolumeChange, NULL)) { + LOGW("Failed to add to g_idle"); + } +} + +gboolean AudioControlManager::onVolumeChange(gpointer /*user_data*/) { + LOGD("Enter"); try { if (!getInstance().m_volume_change_listener) { LOGD("Listener is null. Ignoring"); - return; + return G_SOURCE_REMOVE; } u_int16_t val; try { @@ -190,6 +195,7 @@ void AudioControlManager::volumeChangeCallback( } catch (...) { LOGE("Failed to call callback"); } + return G_SOURCE_REMOVE; } /** diff --git a/src/tvaudio/tvaudio_manager.h b/src/tvaudio/tvaudio_manager.h index 38161e1d..2ba27c9d 100755 --- a/src/tvaudio/tvaudio_manager.h +++ b/src/tvaudio/tvaudio_manager.h @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include #include #include #include @@ -43,6 +44,7 @@ class AudioControlManager { void registerVolumeChangeListener(VolumeChangeListener* listener); void unregisterVolumeChangeListener(); static void volumeChangeCallback(unsigned int volume, void* user_data); + static gboolean onVolumeChange(gpointer user_data); // Non-copyable, -assignable, -movable AudioControlManager(const AudioControlManager &) = delete;