diff options
| author | 2016-06-23 21:49:04 +0000 | |
|---|---|---|
| committer | 2016-06-23 21:49:05 +0000 | |
| commit | 38d7897690b61378d94cfe3553d083648aca8e43 (patch) | |
| tree | cd4666eb059e90fd9dbb0b95cbd9238bb1c8f6bf | |
| parent | 0cacb14c4ee78e4618339d1c855550a445168bea (diff) | |
| parent | 0b77ef9f5199b7cd0956f2bfe049cbd699ca03b4 (diff) | |
Merge "Print names of observers causing timeout" into nyc-mr1-dev
8 files changed, 48 insertions, 37 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index cf5240b581ae..cee5646a73b3 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2371,7 +2371,8 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM data.enforceInterface(IActivityManager.descriptor); IUserSwitchObserver observer = IUserSwitchObserver.Stub.asInterface( data.readStrongBinder()); - registerUserSwitchObserver(observer); + String name = data.readString(); + registerUserSwitchObserver(observer, name); reply.writeNoException(); return true; } @@ -6060,11 +6061,13 @@ class ActivityManagerProxy implements IActivityManager return result; } - public void registerUserSwitchObserver(IUserSwitchObserver observer) throws RemoteException { + public void registerUserSwitchObserver(IUserSwitchObserver observer, + String name) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(observer != null ? observer.asBinder() : null); + data.writeString(name); mRemote.transact(REGISTER_USER_SWITCH_OBSERVER_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 5037e3eb9dc5..3f7ff0bede57 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -512,7 +512,8 @@ public interface IActivityManager extends IInterface { public int getLaunchedFromUid(IBinder activityToken) throws RemoteException; public String getLaunchedFromPackage(IBinder activityToken) throws RemoteException; - public void registerUserSwitchObserver(IUserSwitchObserver observer) throws RemoteException; + public void registerUserSwitchObserver(IUserSwitchObserver observer, + String name) throws RemoteException; public void unregisterUserSwitchObserver(IUserSwitchObserver observer) throws RemoteException; public void requestBugReport(int bugreportType) throws RemoteException; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index a8419bf4cbdf..94d9550f77e4 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1040,10 +1040,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { public void onForegroundProfileSwitch(int newProfileId) { // Ignore. } - }); + }, TAG); } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + e.rethrowAsRuntimeException(); } IntentFilter strongAuthTimeoutFilter = new IntentFilter(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 81c0d812997a..a13138d4e6f6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -144,7 +144,7 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro // listen for user / profile change. try { - ActivityManagerNative.getDefault().registerUserSwitchObserver(mUserSwitchListener); + ActivityManagerNative.getDefault().registerUserSwitchObserver(mUserSwitchListener, TAG); } catch (RemoteException e) { // Ignore } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 6264ccc65fff..89715f8952ba 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -21374,8 +21374,8 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override - public void registerUserSwitchObserver(IUserSwitchObserver observer) { - mUserController.registerUserSwitchObserver(observer); + public void registerUserSwitchObserver(IUserSwitchObserver observer, String name) { + mUserController.registerUserSwitchObserver(observer, name); } @Override diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 597b49924d7d..152d34d10525 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -76,6 +76,7 @@ import android.os.UserManager; import android.os.UserManagerInternal; import android.os.storage.IMountService; import android.os.storage.StorageManager; +import android.util.ArraySet; import android.util.IntArray; import android.util.Pair; import android.util.Slog; @@ -86,6 +87,7 @@ import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; import com.android.internal.util.ArrayUtils; +import com.android.internal.util.Preconditions; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; import com.android.server.pm.UserManagerService; @@ -151,9 +153,9 @@ final class UserController { = new RemoteCallbackList<>(); /** - * Currently active user switch. + * Currently active user switch callbacks. */ - Object mCurUserSwitchCallback; + private volatile ArraySet<String> mCurWaitingUserSwitchCallbacks; private volatile UserManagerService mUserManager; @@ -1040,7 +1042,8 @@ final class UserController { void timeoutUserSwitch(UserState uss, int oldUserId, int newUserId) { synchronized (mService) { - Slog.wtf(TAG, "User switch timeout: from " + oldUserId + " to " + newUserId); + Slog.wtf(TAG, "User switch timeout: from " + oldUserId + " to " + newUserId + + ". Observers that didn't send results: " + mCurWaitingUserSwitchCallbacks); sendContinueUserSwitchLocked(uss, oldUserId, newUserId); } } @@ -1049,28 +1052,34 @@ final class UserController { Slog.d(TAG, "Dispatch onUserSwitching oldUser #" + oldUserId + " newUser #" + newUserId); final int observerCount = mUserSwitchObservers.beginBroadcast(); if (observerCount > 0) { - final IRemoteCallback callback = new IRemoteCallback.Stub() { - int mCount = 0; - @Override - public void sendResult(Bundle data) throws RemoteException { - synchronized (mService) { - if (mCurUserSwitchCallback == this) { - mCount++; - if (mCount == observerCount) { - sendContinueUserSwitchLocked(uss, oldUserId, newUserId); - } - } - } - } - }; + final ArraySet<String> curWaitingUserSwitchCallbacks = new ArraySet<>(); synchronized (mService) { uss.switching = true; - mCurUserSwitchCallback = callback; + mCurWaitingUserSwitchCallbacks = curWaitingUserSwitchCallbacks; } for (int i = 0; i < observerCount; i++) { try { - mUserSwitchObservers.getBroadcastItem(i).onUserSwitching( - newUserId, callback); + // Prepend with unique prefix to guarantee that keys are unique + final String name = "#" + i + " " + mUserSwitchObservers.getBroadcastCookie(i); + mCurWaitingUserSwitchCallbacks.add(name); + final IRemoteCallback callback = new IRemoteCallback.Stub() { + @Override + public void sendResult(Bundle data) throws RemoteException { + synchronized (mService) { + // Early return if this session is no longer valid + if (curWaitingUserSwitchCallbacks + != mCurWaitingUserSwitchCallbacks) { + return; + } + curWaitingUserSwitchCallbacks.remove(name); + // Continue switching if all callbacks have been notified + if (curWaitingUserSwitchCallbacks.isEmpty()) { + sendContinueUserSwitchLocked(uss, oldUserId, newUserId); + } + } + } + }; + mUserSwitchObservers.getBroadcastItem(i).onUserSwitching(newUserId, callback); } catch (RemoteException e) { } } @@ -1083,7 +1092,7 @@ final class UserController { } void sendContinueUserSwitchLocked(UserState uss, int oldUserId, int newUserId) { - mCurUserSwitchCallback = null; + mCurWaitingUserSwitchCallbacks = null; mHandler.removeMessages(USER_SWITCH_TIMEOUT_MSG); mHandler.sendMessage(mHandler.obtainMessage(ActivityManagerService.CONTINUE_USER_SWITCH_MSG, oldUserId, newUserId, uss)); @@ -1248,7 +1257,8 @@ final class UserController { ? getCurrentUserIdLocked(): userId; } - void registerUserSwitchObserver(IUserSwitchObserver observer) { + void registerUserSwitchObserver(IUserSwitchObserver observer, String name) { + Preconditions.checkNotNull(name, "Observer name cannot be null"); if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL) != PackageManager.PERMISSION_GRANTED) { final String msg = "Permission Denial: registerUserSwitchObserver() from pid=" @@ -1258,8 +1268,7 @@ final class UserController { Slog.w(TAG, msg); throw new SecurityException(msg); } - - mUserSwitchObservers.register(observer); + mUserSwitchObservers.register(observer, name); } void unregisterUserSwitchObserver(IUserSwitchObserver observer) { diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index cc556c7e45b3..14e4bc66199d 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -1013,7 +1013,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe public void onForegroundProfileSwitch(int newProfileId) { // Ignore. } - }); + }, TAG); } catch (RemoteException e) { Slog.w(TAG, "Failed to listen for user switching event" ,e); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index efd238201e7a..7c2ba1eaaac1 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -906,10 +906,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { public void onForegroundProfileSwitch(int newProfileId) { // Ignore. } - }); + }, TAG); } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + e.rethrowAsRuntimeException(); } } |