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

Commit 5e2ba1b7 authored by Chris Thornton's avatar Chris Thornton Committed by Android (Google) Code Review
Browse files

Merge "Fix race when handling callback in SoundTrigger Module"

parents 248c9ee9 02b7421d
Loading
Loading
Loading
Loading
+27 −26
Original line number Diff line number Diff line
@@ -750,11 +750,12 @@ void SoundTriggerHwService::Module::onCallbackEvent(const sp<CallbackEvent>& eve
        return;
    }

    Vector< sp<ModuleClient> > clients;

    switch (event->mType) {
    case CallbackEvent::TYPE_RECOGNITION: {
        struct sound_trigger_recognition_event *recognitionEvent =
                (struct sound_trigger_recognition_event *)eventMemory->pointer();
        sp<ISoundTriggerClient> client;
        {
            AutoMutex lock(mLock);
            sp<Model> model = getModel(recognitionEvent->model);
@@ -769,16 +770,12 @@ void SoundTriggerHwService::Module::onCallbackEvent(const sp<CallbackEvent>& eve

            recognitionEvent->capture_session = model->mCaptureSession;
            model->mState = Model::STATE_IDLE;
            client = model->mModuleClient->client();
        }
        if (client != 0) {
            client->onRecognitionEvent(eventMemory);
            clients.add(model->mModuleClient);
        }
    } break;
    case CallbackEvent::TYPE_SOUNDMODEL: {
        struct sound_trigger_model_event *soundmodelEvent =
                (struct sound_trigger_model_event *)eventMemory->pointer();
        sp<ISoundTriggerClient> client;
        {
            AutoMutex lock(mLock);
            sp<Model> model = getModel(soundmodelEvent->model);
@@ -786,29 +783,26 @@ void SoundTriggerHwService::Module::onCallbackEvent(const sp<CallbackEvent>& eve
                ALOGW("%s model == 0", __func__);
                return;
            }
            client = model->mModuleClient->client();
        }
        if (client != 0) {
            client->onSoundModelEvent(eventMemory);
            clients.add(model->mModuleClient);
        }
    } break;
    case CallbackEvent::TYPE_SERVICE_STATE: {
        Vector< sp<ISoundTriggerClient> > clients;
        {
            AutoMutex lock(mLock);
            for (size_t i = 0; i < mModuleClients.size(); i++) {
                if (mModuleClients[i] != 0) {
                    clients.add(mModuleClients[i]->client());
                    clients.add(mModuleClients[i]);
                }
            }
        }
        for (size_t i = 0; i < clients.size(); i++) {
            clients[i]->onServiceStateChange(eventMemory);
        }
    } break;
    default:
        LOG_ALWAYS_FATAL("onCallbackEvent unknown event type %d", event->mType);
    }

    for (size_t i = 0; i < clients.size(); i++) {
        clients[i]->onCallbackEvent(event);
    }
}

sp<SoundTriggerHwService::Model> SoundTriggerHwService::Module::getModel(
@@ -1070,21 +1064,28 @@ void SoundTriggerHwService::ModuleClient::onCallbackEvent(const sp<CallbackEvent
        return;
    }

    switch (event->mType) {
    case CallbackEvent::TYPE_SERVICE_STATE: {
    sp<ISoundTriggerClient> client;
    {
        AutoMutex lock(mLock);
        client = mClient;
    }

    if (client != 0) {
        switch (event->mType) {
        case CallbackEvent::TYPE_RECOGNITION: {
            client->onRecognitionEvent(eventMemory);
        } break;
        case CallbackEvent::TYPE_SOUNDMODEL: {
            client->onSoundModelEvent(eventMemory);
        } break;
        case CallbackEvent::TYPE_SERVICE_STATE: {
            client->onServiceStateChange(eventMemory);
        }
        } break;
        default:
            LOG_ALWAYS_FATAL("onCallbackEvent unknown event type %d", event->mType);
        }
    }
}

void SoundTriggerHwService::ModuleClient::binderDied(
    const wp<IBinder> &who __unused) {