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