From f95cf5d9c3981c0fb1f51493574232ca356428aa Mon Sep 17 00:00:00 2001 From: Michal Karpinski Date: Mon, 18 Sep 2017 13:34:39 +0100 Subject: [PATCH] [RefactoredBMS] Offload the mRunningFullBackupTask.handleCancel() call from the main thread to another thread This CL replicates both ag/2135862 and ag/2465381 in RefactoredBMS. Test: runtest -p com.android.server.backup frameworks-services Bug: 37973765 Change-Id: I895cb27bc910d9970ab1c33cd54a773b8f9b6cf6 --- .../RefactoredBackupManagerService.java | 24 ++++++++++++++----- 1 file 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 d044cb55cd9f3..dd99b023c6aab 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