Merge "Small VibrationThread fixes." into tm-dev

This commit is contained in:
TreeHugger Robot
2022-03-08 21:20:27 +00:00
committed by Android (Google) Code Review
2 changed files with 16 additions and 11 deletions

View File

@@ -60,8 +60,6 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
static final float RAMP_OFF_AMPLITUDE_MIN = 1e-3f;
static final List<Step> EMPTY_STEP_LIST = new ArrayList<>();
private final Object mLock = new Object();
// Used within steps.
public final VibrationSettings vibrationSettings;
public final DeviceVibrationEffectAdapter deviceEffectAdapter;
@@ -74,6 +72,11 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
private final Queue<Step> mPendingOnVibratorCompleteSteps = new LinkedList<>();
// Signalling fields.
// Note that vibrator callback signals may happen inside vibrator HAL calls made by the
// VibrationThread, or on an external executor, so this lock should not be held for anything
// other than updating signalling state - particularly not during HAL calls or when invoking
// other callbacks that may trigger calls into the thread.
private final Object mLock = new Object();
@GuardedBy("mLock")
private final IntArray mSignalVibratorsComplete;
@GuardedBy("mLock")
@@ -334,9 +337,9 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
* The state update is recorded for processing on the main execution thread (VibrationThread).
*/
public void notifyVibratorComplete(int vibratorId) {
if (Build.IS_DEBUGGABLE) {
expectIsVibrationThread(false);
}
// HAL callbacks may be triggered directly within HAL calls, so these notifications
// could be on the VibrationThread as it calls the HAL, or some other executor later.
// Therefore no thread assertion is made here.
if (DEBUG) {
Slog.d(TAG, "Vibration complete reported by vibrator " + vibratorId);
@@ -356,9 +359,9 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
* (VibrationThread).
*/
public void notifySyncedVibrationComplete() {
if (Build.IS_DEBUGGABLE) {
expectIsVibrationThread(false);
}
// HAL callbacks may be triggered directly within HAL calls, so these notifications
// could be on the VibrationThread as it calls the HAL, or some other executor later.
// Therefore no thread assertion is made here.
if (DEBUG) {
Slog.d(TAG, "Synced vibration complete reported by vibrator manager");
@@ -394,7 +397,7 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
int[] vibratorsToProcess = null;
boolean doCancel = false;
boolean doCancelImmediate = false;
// Swap out the queue of completions to process.
// Collect signals to process, but don't keep the lock while processing them.
synchronized (mLock) {
if (mSignalCancelImmediate) {
if (mCancelledImmediately) {
@@ -407,6 +410,7 @@ final class VibrationStepConductor implements IBinder.DeathRecipient {
doCancel = true;
}
if (!doCancelImmediate && mSignalVibratorsComplete.size() > 0) {
// Swap out the queue of completions to process.
vibratorsToProcess = mSignalVibratorsComplete.toArray(); // makes a copy
mSignalVibratorsComplete.clear();
}

View File

@@ -22,6 +22,7 @@ import android.os.IBinder;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
import android.os.WorkSource;
import android.util.Slog;
@@ -176,7 +177,7 @@ final class VibrationThread extends Thread {
* @return true if the vibration completed, or false if waiting timed out.
*/
public boolean waitForThreadIdle(long maxWaitMillis) {
long now = System.currentTimeMillis();
long now = SystemClock.elapsedRealtime();
long deadline = now + maxWaitMillis;
synchronized (mLock) {
while (true) {
@@ -191,7 +192,7 @@ final class VibrationThread extends Thread {
} catch (InterruptedException e) {
Slog.w(TAG, "VibrationThread interrupted waiting to stop, continuing");
}
now = System.currentTimeMillis();
now = SystemClock.elapsedRealtime();
}
}
}