diff options
| author | 2020-05-05 17:13:58 +0000 | |
|---|---|---|
| committer | 2020-05-05 17:13:58 +0000 | |
| commit | 5c5a830c9ac1ff102433779e660f6e89832d0772 (patch) | |
| tree | 61f42eafaff213945bea59efa0c9ea5c38a3a721 | |
| parent | a131a0c64f6196e039044aa3afcd6a458b1db89e (diff) | |
| parent | 77c195d52bd688ac59f221c5d612d3f60525d2ab (diff) | |
Merge "Avoid deadlock on soundtrigger HAL death" into rvc-dev
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() { |