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

Commit 1c233bcc authored by Ytai Ben-tsvi's avatar Ytai Ben-tsvi Committed by Automerger Merge Worker
Browse files

Merge "Reboot the soundtrigger HAL on failure" into rvc-dev am: 8ef3e05c

Change-Id: I33183ed311c96f48d9631c0ba6384f753782f9fe
parents 6879bcb0 8ef3e05c
Loading
Loading
Loading
Loading
+40 −1
Original line number Diff line number Diff line
@@ -27,7 +27,9 @@ import android.media.soundtrigger_middleware.PhraseSoundModel;
import android.media.soundtrigger_middleware.RecognitionConfig;
import android.media.soundtrigger_middleware.SoundModel;
import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.util.Log;

import com.android.server.SystemService;
@@ -99,6 +101,28 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic
        }
    }

    @Override
    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
            throws RemoteException {
        try {
            return super.onTransact(code, data, reply, flags);
        } catch (InternalServerError e) {
            if (e.getCause() instanceof HalException) {
                // We recover from any sort of HAL failure by rebooting the HAL process.
                // This will likely reboot more than just the sound trigger HAL.
                // The rest of the system should be able to tolerate that.
                rebootHal();
            }
            throw e;
        }
    }

    private static void rebootHal() {
        Log.i(TAG, "Rebooting the sound trigger HAL");
        // This property needs to be defined in an init.rc script and trigger a HAL reboot.
        SystemProperties.set("sys.audio.restart.hal", "1");
    }

    private final static class ModuleService extends ISoundTriggerModule.Stub {
        private final ISoundTriggerModule mDelegate;

@@ -119,7 +143,6 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic
        @Override
        public void unloadModel(int modelHandle) throws RemoteException {
            mDelegate.unloadModel(modelHandle);
            ;
        }

        @Override
@@ -159,6 +182,22 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic
        public void detach() throws RemoteException {
            mDelegate.detach();
        }

        @Override
        public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
                throws RemoteException {
            try {
                return super.onTransact(code, data, reply, flags);
            } catch (InternalServerError e) {
                if (e.getCause() instanceof HalException) {
                    // We recover from any sort of HAL failure by rebooting the HAL process.
                    // This will likely reboot more than just the sound trigger HAL.
                    // The rest of the system should be able to tolerate that.
                    rebootHal();
                }
                throw e;
            }
        }
    }

    /**
+1 −7
Original line number Diff line number Diff line
@@ -149,13 +149,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware
                    e.getMessage());
        }

        /* Throwing an exception is not enough in this case. When the HAL behaves unexpectedly, the
           system service and the HAL must be reset and the client must be notified. Without a full
           reset in this catastrophic case, the state of the HAL and the system service cannot be
           guaranteed to the client.
         */
        Log.wtf(TAG, "Crashing system server due to unrecoverable exception", e);
        Process.killProcess(Process.myPid());
        Log.wtf(TAG, "Unexpected exception", e);
        throw new InternalServerError(e);
    }