diff options
| author | 2015-12-10 18:04:44 +0000 | |
|---|---|---|
| committer | 2015-12-10 18:04:44 +0000 | |
| commit | 7e4d92fbc7761d561c1bc61dc5cf55b69d3a54f3 (patch) | |
| tree | e84bd85d3c39d15d137039694411e344feea4314 | |
| parent | cb299b858f4f073e2abd4ad45aa944dc0dfd0aa2 (diff) | |
| parent | 60a74318163968ce3db46c1952ed7bc4f8ce530e (diff) | |
Merge "ConcurrentModificationException in SyncManager"
| -rw-r--r-- | services/core/java/com/android/server/content/SyncManager.java | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index b61f90e966d7..85d08219cdf8 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -316,25 +316,9 @@ public class SyncManager { } public void updateRunningAccounts() { - mRunningAccounts = AccountManagerService.getSingleton().getRunningAccounts(); - - if (mBootCompleted) { - doDatabaseCleanup(); - } - - AccountAndUser[] accounts = mRunningAccounts; - for (ActiveSyncContext currentSyncContext : mActiveSyncContexts) { - if (!containsAccountAndUser(accounts, - currentSyncContext.mSyncOperation.target.account, - currentSyncContext.mSyncOperation.target.userId)) { - Log.d(TAG, "canceling sync since the account is no longer running"); - sendSyncFinishedOrCanceledMessage(currentSyncContext, - null /* no result since this is a cancel */); - } - } - // we must do this since we don't bother scheduling alarms when - // the accounts are not set yet - sendCheckAlarmsMessage(); + if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "sending MESSAGE_ACCOUNTS_UPDATED"); + // Update accounts in handler thread. + mSyncHandler.sendEmptyMessage(SyncHandler.MESSAGE_ACCOUNTS_UPDATED); } private void doDatabaseCleanup() { @@ -2099,6 +2083,7 @@ public class SyncManager { * obj: {@link com.android.server.content.SyncManager.ActiveSyncContext} */ private static final int MESSAGE_MONITOR_SYNC = 8; + private static final int MESSAGE_ACCOUNTS_UPDATED = 9; public final SyncNotificationInfo mSyncNotificationInfo = new SyncNotificationInfo(); private Long mAlarmScheduleTime = null; @@ -2216,6 +2201,13 @@ public class SyncManager { // to also take into account the periodic syncs. earliestFuturePollTime = scheduleReadyPeriodicSyncs(); switch (msg.what) { + case SyncHandler.MESSAGE_ACCOUNTS_UPDATED: + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "handleSyncHandlerMessage: MESSAGE_ACCOUNTS_UPDATED"); + } + updateRunningAccountsH(); + break; + case SyncHandler.MESSAGE_CANCEL: SyncStorageEngine.EndPoint endpoint = (SyncStorageEngine.EndPoint) msg.obj; Bundle extras = msg.peekData(); @@ -2764,6 +2756,28 @@ public class SyncManager { return nextReadyToRunTime; } + private void updateRunningAccountsH() { + mRunningAccounts = AccountManagerService.getSingleton().getRunningAccounts(); + + if (mBootCompleted) { + doDatabaseCleanup(); + } + + AccountAndUser[] accounts = mRunningAccounts; + for (ActiveSyncContext currentSyncContext : mActiveSyncContexts) { + if (!containsAccountAndUser(accounts, + currentSyncContext.mSyncOperation.target.account, + currentSyncContext.mSyncOperation.target.userId)) { + Log.d(TAG, "canceling sync since the account is no longer running"); + sendSyncFinishedOrCanceledMessage(currentSyncContext, + null /* no result since this is a cancel */); + } + } + // we must do this since we don't bother scheduling alarms when + // the accounts are not set yet + sendCheckAlarmsMessage(); + } + private boolean isSyncNotUsingNetworkH(ActiveSyncContext activeSyncContext) { final long bytesTransferredCurrent = getTotalBytesTransferredByUid(activeSyncContext.mSyncAdapterUid); |