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

Commit 6e3eeade authored by Ryan Bavetta's avatar Ryan Bavetta Committed by Android (Google) Code Review
Browse files

Merge "Fix unsynchronized access to model hashmap" into nyc-dev

parents 70612efe 79655ebf
Loading
Loading
Loading
Loading
+28 −32
Original line number Diff line number Diff line
@@ -171,7 +171,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {

            // Fetch a ModelData instance from the hash map. Creates a new one if none
            // exists.
            ModelData modelData = getOrCreateGenericModelData(modelId);
            ModelData modelData = getOrCreateGenericModelDataLocked(modelId);

            IRecognitionStatusCallback oldCallback = modelData.getCallback();
            if (oldCallback != null) {
@@ -373,7 +373,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
            // Also clear the internal state once the recognition has been stopped.
            modelData.setLoaded();
            modelData.clearCallback();
            if (!computeRecognitionRunning()) {
            if (!computeRecognitionRunningLocked()) {
                internalClearGlobalStateLocked();
            }
            return status;
@@ -505,12 +505,12 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
        if (modelId == null || mModule == null) {
            return STATUS_ERROR;
        }
        synchronized (mLock) {
            ModelData modelData = mGenericModelDataMap.get(modelId);
            if (modelData == null) {
                Slog.w(TAG, "Unload error: Attempting unload invalid generic model with id:" + modelId);
                return STATUS_ERROR;
            }
        synchronized (mLock) {
            if (!modelData.isModelLoaded()) {
                // Nothing to do here.
                Slog.i(TAG, "Unload: Given generic model is not loaded:" + modelId);
@@ -530,7 +530,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
                Slog.w(TAG, "unloadGenericSoundModel() force-marking model as unloaded.");
            }
            mGenericModelDataMap.remove(modelId);
            if (DBG) dumpGenericModelState();
            if (DBG) dumpGenericModelStateLocked();
            return status;
        }
    }
@@ -580,7 +580,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
        if (event.status != SoundTrigger.RECOGNITION_STATUS_SUCCESS) {
            return;
        }
        ModelData model = getModelDataFor(event.soundModelHandle);
        ModelData model = getModelDataForLocked(event.soundModelHandle);
        if (model == null) {
            Slog.w(TAG, "Generic recognition event: Model does not exist for handle: " +
                    event.soundModelHandle);
@@ -919,7 +919,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
        mIsPowerSaveMode = mPowerManager.isPowerSaveMode();
    }

    private ModelData getOrCreateGenericModelData(UUID modelId) {
    private ModelData getOrCreateGenericModelDataLocked(UUID modelId) {
        ModelData modelData = mGenericModelDataMap.get(modelId);
        if (modelData == null) {
            modelData = new ModelData(modelId);
@@ -932,7 +932,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
    // Instead of maintaining a second hashmap of modelHandle -> ModelData, we just
    // iterate through to find the right object (since we don't expect 100s of models
    // to be stored).
    private ModelData getModelDataFor(int modelHandle) {
    private ModelData getModelDataForLocked(int modelHandle) {
        // Fetch ModelData object corresponding to the model handle.
        for (ModelData model : mGenericModelDataMap.values()) {
            if (model.getHandle() == modelHandle) {
@@ -988,7 +988,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
                }
            }
        }
        if (DBG) dumpGenericModelState();
        if (DBG) dumpGenericModelStateLocked();
        return status;
    }

@@ -1017,11 +1017,11 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
                }
            }
        }
        if (DBG) dumpGenericModelState();
        if (DBG) dumpGenericModelStateLocked();
        return status;
    }

    private void dumpGenericModelState() {
    private void dumpGenericModelStateLocked() {
        for (UUID modelId : mGenericModelDataMap.keySet()) {
            ModelData modelData = mGenericModelDataMap.get(modelId);
            Slog.i(TAG, "Model :" + modelData.toString());
@@ -1030,16 +1030,13 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {

    // Computes whether we have any recognition running at all (voice or generic). Sets
    // the mRecognitionRunning variable with the result.
    private boolean computeRecognitionRunning() {
        synchronized (mLock) {
    private boolean computeRecognitionRunningLocked() {
        if (mModuleProperties == null || mModule == null) {
            mRecognitionRunning = false;
            return mRecognitionRunning;
        }
            if (mKeyphraseListener != null &&
                    mKeyphraseStarted &&
                    mCurrentKeyphraseModelHandle != INVALID_VALUE &&
                    mCurrentSoundModel != null) {
        if (mKeyphraseListener != null && mKeyphraseStarted &&
            mCurrentKeyphraseModelHandle != INVALID_VALUE && mCurrentSoundModel != null) {
            mRecognitionRunning = true;
            return mRecognitionRunning;
        }
@@ -1051,7 +1048,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
            }
        }
        mRecognitionRunning = false;
        }
        return mRecognitionRunning;
    }