From 9b28336f8b43e8c092ed41ecae6691052183d083 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Wed, 8 Oct 2014 18:32:47 +0400 Subject: [PATCH] [git] fix deadlocks in cherry-pick, including IDEA-95523 Refresh changes in the background (fixes IDEA-95523), invoke callback in the background as well (fixes newly introduced lock with waiting in the EDT). --- .../git4idea/cherrypick/GitCherryPicker.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/plugins/git4idea/src/git4idea/cherrypick/GitCherryPicker.java b/plugins/git4idea/src/git4idea/cherrypick/GitCherryPicker.java index 8d33c2e6e19b..4e3c3183cf16 100644 --- a/plugins/git4idea/src/git4idea/cherrypick/GitCherryPicker.java +++ b/plugins/git4idea/src/git4idea/cherrypick/GitCherryPicker.java @@ -237,6 +237,7 @@ public class GitCherryPicker { @Nullable private LocalChangeList createChangeListAfterUpdate(@NotNull final VcsFullCommitDetails commit, @NotNull final Collection paths, @NotNull final String commitMessage) { + final CountDownLatch waiter = new CountDownLatch(1); final AtomicReference changeList = new AtomicReference(); myPlatformFacade.invokeAndWait(new Runnable() { @Override @@ -244,17 +245,26 @@ public class GitCherryPicker { myChangeListManager.invokeAfterUpdate(new Runnable() { public void run() { changeList.set(createChangeListIfThereAreChanges(commit, commitMessage)); + waiter.countDown(); } - }, InvokeAfterUpdateMode.SYNCHRONOUS_NOT_CANCELLABLE, "Cherry-pick", + }, InvokeAfterUpdateMode.SILENT_CALLBACK_POOLED, "Cherry-pick", new Consumer() { public void consume(VcsDirtyScopeManager vcsDirtyScopeManager) { vcsDirtyScopeManager.filePathsDirty(paths, null); } - }, ModalityState.NON_MODAL - ); + }, ModalityState.NON_MODAL); } }, ModalityState.NON_MODAL); - + try { + boolean success = waiter.await(100, TimeUnit.SECONDS); + if (!success) { + LOG.error("Couldn't await for change list manager refresh"); + } + } + catch (InterruptedException e) { + LOG.error(e); + return null; + } return changeList.get(); } @@ -475,7 +485,10 @@ public class GitCherryPicker { try { myChangeListManager.addChangeListListener(listener); myChangeListManager.moveChangesTo(targetChangeList, originalChanges.toArray(new Change[originalChanges.size()])); - moveChangesWaiter.await(100, TimeUnit.SECONDS); + boolean success = moveChangesWaiter.await(100, TimeUnit.SECONDS); + if (!success) { + LOG.error("Couldn't await for changes move."); + } return resultingChangeList.get(); } catch (InterruptedException e) {