diff options
| -rw-r--r-- | services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java index d044cb55cd9f..dd99b023c6aa 100644 --- a/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java @@ -2119,14 +2119,26 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter // so tear down any ongoing backup task right away. @Override public void endFullBackup() { - synchronized (mQueueLock) { - if (mRunningFullBackupTask != null) { - if (DEBUG_SCHEDULING) { - Slog.i(TAG, "Telling running backup to stop"); + // offload the mRunningFullBackupTask.handleCancel() call to another thread, + // as we might have to wait for mCancelLock + Runnable endFullBackupRunnable = new Runnable() { + @Override + public void run() { + PerformFullTransportBackupTask pftbt = null; + synchronized (mQueueLock) { + if (mRunningFullBackupTask != null) { + pftbt = mRunningFullBackupTask; + } + } + if (pftbt != null) { + if (DEBUG_SCHEDULING) { + Slog.i(TAG, "Telling running backup to stop"); + } + pftbt.handleCancel(true); } - mRunningFullBackupTask.handleCancel(true); } - } + }; + new Thread(endFullBackupRunnable, "end-full-backup").start(); } // Used by both incremental and full restore |