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 <p.ciezkowski@samsung.com>
#include <sound_manager.h>
#include <sound_manager_product.h>
-#include <glib.h>
-
#include <fstream> // NOLINT (readability/streams)
// this flag is no longer enforced in the newest cpplint.py
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 {
} catch (...) {
LOGE("Failed to call callback");
}
+ return G_SOURCE_REMOVE;
}
/**
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <glib.h>
#include <atomic>
#include <map>
#include <memory>
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;