Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a188af07 authored by Eric Laurent's avatar Eric Laurent
Browse files

Soundtrigger service: fix cross deadlock with audio policy service

Do not hold Module mutex when calling into audio policy manager to
avoid cross deadlock with audio poicy service mutex: Audio policy manager
can call into sound trigger service with its mutex held in methods like
stopInput().

Regression introduced by fix for b/64340921 commit f759b8c4

Bug: 64340921
Bug: 67310830
Test: repro steps in b/67310830
Merged-In: Ie50b2e7c55fe9828a3fd8de6b31eb4a492791583

Change-Id: Ie50b2e7c55fe9828a3fd8de6b31eb4a492791583
parent c41471f6
Loading
Loading
Loading
Loading
+48 −25
Original line number Diff line number Diff line
@@ -497,6 +497,8 @@ void SoundTriggerHwService::Module::detach() {
    if (!captureHotwordAllowed()) {
        return;
    }
    Vector<audio_session_t> releasedSessions;

    {
        AutoMutex lock(mLock);
        for (size_t i = 0; i < mModels.size(); i++) {
@@ -506,9 +508,16 @@ void SoundTriggerHwService::Module::detach() {
                mHwDevice->stop_recognition(mHwDevice, model->mHandle);
            }
            mHwDevice->unload_sound_model(mHwDevice, model->mHandle);
            releasedSessions.add(model->mCaptureSession);
        }
        mModels.clear();
    }

    for (size_t i = 0; i < releasedSessions.size(); i++) {
        // do not call AudioSystem methods with mLock held
        AudioSystem::releaseSoundTriggerSession(releasedSessions[i]);
    }

    if (mClient != 0) {
        mClient->asBinder()->unlinkToDeath(this);
    }
@@ -550,6 +559,16 @@ status_t SoundTriggerHwService::Module::loadSoundModel(const sp<IMemory>& modelM
        return BAD_VALUE;
    }

    audio_session_t session;
    audio_io_handle_t ioHandle;
    audio_devices_t device;
    // do not call AudioSystem methods with mLock held
    status_t status = AudioSystem::acquireSoundTriggerSession(&session, &ioHandle, &device);
    if (status != NO_ERROR) {
        return status;
    }

    {
        AutoMutex lock(mLock);
        status_t status = mHwDevice->load_sound_model(mHwDevice,
                                                      sound_model,
@@ -557,20 +576,18 @@ status_t SoundTriggerHwService::Module::loadSoundModel(const sp<IMemory>& modelM
                                                      this,
                                                      handle);
        if (status != NO_ERROR) {
        return status;
    }
    audio_session_t session;
    audio_io_handle_t ioHandle;
    audio_devices_t device;

    status = AudioSystem::acquireSoundTriggerSession(&session, &ioHandle, &device);
    if (status != NO_ERROR) {
        return status;
            goto exit;
        }

        sp<Model> model = new Model(*handle, session, ioHandle, device, sound_model->type);
        mModels.replaceValueFor(*handle, model);
    }

exit:
    if (status != NO_ERROR) {
        // do not call AudioSystem methods with mLock held
        AudioSystem::releaseSoundTriggerSession(session);
    }
    return status;
}

@@ -580,7 +597,10 @@ status_t SoundTriggerHwService::Module::unloadSoundModel(sound_model_handle_t ha
    if (!captureHotwordAllowed()) {
        return PERMISSION_DENIED;
    }
    status_t status;
    audio_session_t session;

    {
      AutoMutex lock(mLock);
      ssize_t index = mModels.indexOfKey(handle);
      if (index < 0) {
@@ -591,8 +611,11 @@ status_t SoundTriggerHwService::Module::unloadSoundModel(sound_model_handle_t ha
      if (model->mState == Model::STATE_ACTIVE) {
          mHwDevice->stop_recognition(mHwDevice, model->mHandle);
      }
    AudioSystem::releaseSoundTriggerSession(model->mCaptureSession);
    return mHwDevice->unload_sound_model(mHwDevice, handle);
      status = mHwDevice->unload_sound_model(mHwDevice, handle);
      session = model->mCaptureSession;
    }
    AudioSystem::releaseSoundTriggerSession(session);
    return status;
}

status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t handle,