summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ytai Ben-tsvi <ytai@google.com> 2020-05-05 17:13:58 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-05-05 17:13:58 +0000
commit5c5a830c9ac1ff102433779e660f6e89832d0772 (patch)
tree61f42eafaff213945bea59efa0c9ea5c38a3a721
parenta131a0c64f6196e039044aa3afcd6a458b1db89e (diff)
parent77c195d52bd688ac59f221c5d612d3f60525d2ab (diff)
Merge "Avoid deadlock on soundtrigger HAL death" into rvc-dev
-rw-r--r--services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java18
-rw-r--r--services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerModule.java35
2 files changed, 33 insertions, 20 deletions
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 4bc774413ac0..f4c77a0b88ca 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 d6390184e3bd..49c781905898 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<ISoundTriggerCallback> 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() {