From 3d4b5c9852aa4499a14835d8479a80f937cdd3e9 Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Mon, 30 Apr 2018 18:49:34 -0700 Subject: [PATCH] Wait for the user to fully stop before starting When starting the user, if the previous state is SHUTDOWN, we need for the user to fully stop to avoid various race conditions like old processes not being killed etc. Test: manual - adb shell am start-user/stop-user N Bug: 78533470 Change-Id: I1a188cc7c7f1f3df5c5448e67e811aba7d9d3b8e --- .../java/com/android/server/am/UserController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 8ad8256225d0f..18c095725b096 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -64,6 +64,7 @@ import android.os.IBinder; import android.os.IProgressListener; import android.os.IRemoteCallback; import android.os.IUserManager; +import android.os.Looper; import android.os.Message; import android.os.Process; import android.os.RemoteCallbackList; @@ -962,6 +963,11 @@ class UserController implements Handler.Callback { updateStartedUserArrayLU(); needStart = true; updateUmState = true; + } else if (uss.state == UserState.STATE_SHUTDOWN && !isCallingOnHandlerThread()) { + Slog.i(TAG, "User #" + userId + + " is shutting down - will start after full stop"); + mHandler.post(() -> startUser(userId, foreground, unlockListener)); + return true; } final Integer userIdInt = userId; mUserLru.remove(userIdInt); @@ -1086,6 +1092,10 @@ class UserController implements Handler.Callback { return true; } + private boolean isCallingOnHandlerThread() { + return Looper.myLooper() == mHandler.getLooper(); + } + /** * Start user, if its not already running, and bring it to foreground. */