Merge "Fix system crash due to mismatching begin/finishBroadcast()" into nyc-mr1-dev

This commit is contained in:
Makoto Onuki
2016-09-16 17:13:15 +00:00
committed by Android (Google) Code Review
2 changed files with 101 additions and 77 deletions

View File

@@ -288,6 +288,7 @@ public class RemoteCallbackList<E extends IInterface> {
* @see #beginBroadcast * @see #beginBroadcast
*/ */
public void finishBroadcast() { public void finishBroadcast() {
synchronized (mCallbacks) {
if (mBroadcastCount < 0) { if (mBroadcastCount < 0) {
throw new IllegalStateException( throw new IllegalStateException(
"finishBroadcast() called outside of a broadcast"); "finishBroadcast() called outside of a broadcast");
@@ -303,6 +304,7 @@ public class RemoteCallbackList<E extends IInterface> {
mBroadcastCount = -1; mBroadcastCount = -1;
} }
}
/** /**
* Returns the number of registered callbacks. Note that the number of registered * Returns the number of registered callbacks. Note that the number of registered

View File

@@ -631,6 +631,7 @@ public class LauncherAppsService extends SystemService {
public void onPackageAdded(String packageName, int uid) { public void onPackageAdded(String packageName, int uid) {
UserHandle user = new UserHandle(getChangingUserId()); UserHandle user = new UserHandle(getChangingUserId());
final int n = mListeners.beginBroadcast(); final int n = mListeners.beginBroadcast();
try {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
@@ -641,7 +642,9 @@ public class LauncherAppsService extends SystemService {
Slog.d(TAG, "Callback failed ", re); Slog.d(TAG, "Callback failed ", re);
} }
} }
} finally {
mListeners.finishBroadcast(); mListeners.finishBroadcast();
}
super.onPackageAdded(packageName, uid); super.onPackageAdded(packageName, uid);
} }
@@ -650,6 +653,7 @@ public class LauncherAppsService extends SystemService {
public void onPackageRemoved(String packageName, int uid) { public void onPackageRemoved(String packageName, int uid) {
UserHandle user = new UserHandle(getChangingUserId()); UserHandle user = new UserHandle(getChangingUserId());
final int n = mListeners.beginBroadcast(); final int n = mListeners.beginBroadcast();
try {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
@@ -660,7 +664,9 @@ public class LauncherAppsService extends SystemService {
Slog.d(TAG, "Callback failed ", re); Slog.d(TAG, "Callback failed ", re);
} }
} }
} finally {
mListeners.finishBroadcast(); mListeners.finishBroadcast();
}
super.onPackageRemoved(packageName, uid); super.onPackageRemoved(packageName, uid);
} }
@@ -669,6 +675,7 @@ public class LauncherAppsService extends SystemService {
public void onPackageModified(String packageName) { public void onPackageModified(String packageName) {
UserHandle user = new UserHandle(getChangingUserId()); UserHandle user = new UserHandle(getChangingUserId());
final int n = mListeners.beginBroadcast(); final int n = mListeners.beginBroadcast();
try {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
@@ -679,7 +686,9 @@ public class LauncherAppsService extends SystemService {
Slog.d(TAG, "Callback failed ", re); Slog.d(TAG, "Callback failed ", re);
} }
} }
} finally {
mListeners.finishBroadcast(); mListeners.finishBroadcast();
}
super.onPackageModified(packageName); super.onPackageModified(packageName);
} }
@@ -688,6 +697,7 @@ public class LauncherAppsService extends SystemService {
public void onPackagesAvailable(String[] packages) { public void onPackagesAvailable(String[] packages) {
UserHandle user = new UserHandle(getChangingUserId()); UserHandle user = new UserHandle(getChangingUserId());
final int n = mListeners.beginBroadcast(); final int n = mListeners.beginBroadcast();
try {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
@@ -698,7 +708,9 @@ public class LauncherAppsService extends SystemService {
Slog.d(TAG, "Callback failed ", re); Slog.d(TAG, "Callback failed ", re);
} }
} }
} finally {
mListeners.finishBroadcast(); mListeners.finishBroadcast();
}
super.onPackagesAvailable(packages); super.onPackagesAvailable(packages);
} }
@@ -707,6 +719,7 @@ public class LauncherAppsService extends SystemService {
public void onPackagesUnavailable(String[] packages) { public void onPackagesUnavailable(String[] packages) {
UserHandle user = new UserHandle(getChangingUserId()); UserHandle user = new UserHandle(getChangingUserId());
final int n = mListeners.beginBroadcast(); final int n = mListeners.beginBroadcast();
try {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
@@ -717,7 +730,9 @@ public class LauncherAppsService extends SystemService {
Slog.d(TAG, "Callback failed ", re); Slog.d(TAG, "Callback failed ", re);
} }
} }
} finally {
mListeners.finishBroadcast(); mListeners.finishBroadcast();
}
super.onPackagesUnavailable(packages); super.onPackagesUnavailable(packages);
} }
@@ -726,6 +741,7 @@ public class LauncherAppsService extends SystemService {
public void onPackagesSuspended(String[] packages) { public void onPackagesSuspended(String[] packages) {
UserHandle user = new UserHandle(getChangingUserId()); UserHandle user = new UserHandle(getChangingUserId());
final int n = mListeners.beginBroadcast(); final int n = mListeners.beginBroadcast();
try {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
@@ -736,7 +752,9 @@ public class LauncherAppsService extends SystemService {
Slog.d(TAG, "Callback failed ", re); Slog.d(TAG, "Callback failed ", re);
} }
} }
} finally {
mListeners.finishBroadcast(); mListeners.finishBroadcast();
}
super.onPackagesSuspended(packages); super.onPackagesSuspended(packages);
} }
@@ -745,6 +763,7 @@ public class LauncherAppsService extends SystemService {
public void onPackagesUnsuspended(String[] packages) { public void onPackagesUnsuspended(String[] packages) {
UserHandle user = new UserHandle(getChangingUserId()); UserHandle user = new UserHandle(getChangingUserId());
final int n = mListeners.beginBroadcast(); final int n = mListeners.beginBroadcast();
try {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
@@ -755,7 +774,9 @@ public class LauncherAppsService extends SystemService {
Slog.d(TAG, "Callback failed ", re); Slog.d(TAG, "Callback failed ", re);
} }
} }
} finally {
mListeners.finishBroadcast(); mListeners.finishBroadcast();
}
super.onPackagesUnsuspended(packages); super.onPackagesUnsuspended(packages);
} }
@@ -768,10 +789,10 @@ public class LauncherAppsService extends SystemService {
private void onShortcutChangedInner(@NonNull String packageName, private void onShortcutChangedInner(@NonNull String packageName,
@UserIdInt int userId) { @UserIdInt int userId) {
final int n = mListeners.beginBroadcast();
try { try {
final UserHandle user = UserHandle.of(userId); final UserHandle user = UserHandle.of(userId);
final int n = mListeners.beginBroadcast();
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i); BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
@@ -803,10 +824,11 @@ public class LauncherAppsService extends SystemService {
Slog.d(TAG, "Callback failed ", re); Slog.d(TAG, "Callback failed ", re);
} }
} }
mListeners.finishBroadcast();
} catch (RuntimeException e) { } catch (RuntimeException e) {
// When the user is locked we get IllegalState, so just catch all. // When the user is locked we get IllegalState, so just catch all.
Log.w(TAG, e.getMessage(), e); Log.w(TAG, e.getMessage(), e);
} finally {
mListeners.finishBroadcast();
} }
} }
} }