IAudioFlinger: create Audio Policy Service before calling AudioFlinger
Make sure we connect to Audio Policy Service before calling into AudioFlinger
implementation to avoid the following deadlock
1) AudioFlinger locks its global mutex and calls into Audio Policy Service
2) If this is the first time Audio Policy Service is queried from inside
audioserver process this will trigger Audio Policy Manager initialization.
3) Audio Policy Manager initialization calls into AudioFlinger which will
try to lock its global mutex
=> Deadlock
Bug: 167155843
Test: manual audioserver crash test
Change-Id: Ic30fc4dd460f4a3ce64bc43c5aa58cddff3bd707
diff --git a/media/libaudioclient/IAudioFlinger.cpp b/media/libaudioclient/IAudioFlinger.cpp
index 225713a..b4e07e0 100644
--- a/media/libaudioclient/IAudioFlinger.cpp
+++ b/media/libaudioclient/IAudioFlinger.cpp
@@ -24,6 +24,7 @@
#include <binder/IPCThreadState.h>
#include <binder/Parcel.h>
+#include <media/IAudioPolicyService.h>
#include <mediautils/ServiceUtilities.h>
#include <mediautils/TimeCheck.h>
#include "IAudioFlinger.h"
@@ -1024,6 +1025,16 @@
std::string tag("IAudioFlinger command " + std::to_string(code));
TimeCheck check(tag.c_str());
+ // Make sure we connect to Audio Policy Service before calling into AudioFlinger:
+ // - AudioFlinger can call into Audio Policy Service with its global mutex held
+ // - If this is the first time Audio Policy Service is queried from inside audioserver process
+ // this will trigger Audio Policy Manager initialization.
+ // - Audio Policy Manager initialization calls into AudioFlinger which will try to lock
+ // its global mutex and a deadlock will occur.
+ if (IPCThreadState::self()->getCallingPid() != getpid()) {
+ AudioSystem::get_audio_policy_service();
+ }
+
switch (code) {
case CREATE_TRACK: {
CHECK_INTERFACE(IAudioFlinger, data, reply);