diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java index 4bc774413ac02..f4c77a0b88ca8 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java @@ -783,15 +783,17 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware @Override public void onModuleDied() { synchronized (SoundTriggerMiddlewareValidation.this) { - try { - mState = ModuleStatus.DEAD; - mCallback.onModuleDied(); - } catch (RemoteException e) { - // Dead client will be handled by binderDied() - no need to handle here. - // In any case, client callbacks are considered best effort. - Log.e(TAG, "Client callback exception.", e); - } + mState = ModuleStatus.DEAD; } + // Trigger the callback outside of the lock to avoid deadlocks. + try { + mCallback.onModuleDied(); + } catch (RemoteException e) { + // Dead client will be handled by binderDied() - no need to handle here. + // In any case, client callbacks are considered best effort. + Log.e(TAG, "Client callback exception.", e); + } + } @Override diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java index d6390184e3bd8..49c7819058982 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java @@ -35,8 +35,10 @@ import android.os.RemoteException; import android.os.ServiceSpecificException; import android.util.Log; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -166,12 +168,23 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { } @Override - public synchronized void serviceDied(long cookie) { + public void serviceDied(long cookie) { Log.w(TAG, String.format("Underlying HAL driver died.")); - for (Session session : mActiveSessions) { - session.moduleDied(); + List callbacks = new ArrayList<>(mActiveSessions.size()); + synchronized (this) { + for (Session session : mActiveSessions) { + callbacks.add(session.moduleDied()); + } + reset(); + } + // Trigger the callbacks outside of the lock to avoid deadlocks. + for (ISoundTriggerCallback callback : callbacks) { + try { + callback.onModuleDied(); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } } - reset(); } /** @@ -379,15 +392,13 @@ class SoundTriggerModule implements IHwBinder.DeathRecipient { /** * The underlying module HAL is dead. + * @return The client callback that needs to be invoked to notify the client. */ - private void moduleDied() { - try { - mCallback.onModuleDied(); - removeSession(this); - mCallback = null; - } catch (RemoteException e) { - e.rethrowAsRuntimeException(); - } + private ISoundTriggerCallback moduleDied() { + ISoundTriggerCallback callback = mCallback; + removeSession(this); + mCallback = null; + return callback; } private void checkValid() {