Merge "Reboot the soundtrigger HAL on failure" into rvc-dev

This commit is contained in:
Ytai Ben-tsvi
2020-04-13 16:22:52 +00:00
committed by Android (Google) Code Review
2 changed files with 41 additions and 8 deletions

View File

@@ -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;
}
}
}
/**

View File

@@ -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);
}