From 62b09b6d4cea0c92ca0dd7d8c3b35e0c8a0ee622 Mon Sep 17 00:00:00 2001 From: Artem Bochkarev Date: Mon, 16 Jul 2018 10:23:53 +0700 Subject: [PATCH] fixed EA-124685 - REWA: TouchBarsManager.onUpdateEditorHeader syncronized access to ourProjectData, because onUpdateEditorHeader can be called from any thread --- .../ui/mac/touchbar/TouchBarsManager.java | 187 +++++++++--------- 1 file changed, 98 insertions(+), 89 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TouchBarsManager.java b/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TouchBarsManager.java index f6849cb8dd56..e4e19ca7e8ad 100644 --- a/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TouchBarsManager.java +++ b/platform/platform-impl/src/com/intellij/ui/mac/touchbar/TouchBarsManager.java @@ -57,10 +57,12 @@ public class TouchBarsManager { // System.out.println("opened project " + project + ", set default touchbar"); final ProjectData pd = new ProjectData(project); - final ProjectData prev = ourProjectData.put(project, pd); - if (prev != null) { - LOG.error("previous project data wasn't removed: " + project); - prev.releaseAll(); + synchronized (ourProjectData) { + final ProjectData prev = ourProjectData.put(project, pd); + if (prev != null) { + LOG.error("previous project data wasn't removed: " + project); + prev.releaseAll(); + } } pd.get(BarType.DEFAULT).show(); @@ -92,14 +94,17 @@ public class TouchBarsManager { ApplicationManager.getApplication().assertIsDispatchThread(); // System.out.println("closed project: " + project); - final ProjectData pd = ourProjectData.get(project); - if (pd == null) { - LOG.error("project data already was removed: " + project); - return; + final ProjectData pd; + synchronized (ourProjectData) { + pd = ourProjectData.remove(project); + if (pd == null) { + LOG.error("project data already was removed: " + project); + return; + } + + ourStack.removeAll(pd.getAllContainers()); + pd.releaseAll(); } - ourStack.removeAll(pd.getAllContainers()); - pd.releaseAll(); - ourProjectData.remove(project); } }); @@ -112,9 +117,9 @@ public class TouchBarsManager { if (!isTouchBarAvailable()) return; - ourProjectData.forEach((p, pd)->{ - pd.reloadAll(); - }); + synchronized (ourProjectData) { + ourProjectData.forEach((p, pd)->pd.reloadAll()); + } ourStack.setTouchBarFromTopContainer(); } @@ -155,29 +160,31 @@ public class TouchBarsManager { } } - for (ProjectData pd: ourProjectData.values()) { - if (pd.isDisposed()) - continue; + synchronized (ourProjectData) { + for (ProjectData pd: ourProjectData.values()) { + if (pd.isDisposed()) + continue; - if (pd.checkToolWindowContents(src)) { - // System.out.println("tool window gained focus: " + e); - return; - } + if (pd.checkToolWindowContents(src)) { + // System.out.println("tool window gained focus: " + e); + return; + } - final ProjectData.EditorData ed = pd.findEditorDataByComponent(src); - if (ed != null && ed.containerSearch != null) { - // System.out.println("editor-component gained focus: " + e); - // StackTouchBars.changeReason = "editor-search gained focus"; - ourStack.showContainer(ed.containerSearch); - return; - } + final ProjectData.EditorData ed = pd.findEditorDataByComponent(src); + if (ed != null && ed.containerSearch != null) { + // System.out.println("editor-component gained focus: " + e); + // StackTouchBars.changeReason = "editor-search gained focus"; + ourStack.showContainer(ed.containerSearch); + return; + } - final BarContainer twbc = pd.findDebugToolWindowByComponent(src); - if (twbc != null) { - // System.out.println("debugger component gained focus: " + e); - // StackTouchBars.changeReason = "tool-window gained focus"; - ourStack.showContainer(twbc); - return; + final BarContainer twbc = pd.findDebugToolWindowByComponent(src); + if (twbc != null) { + // System.out.println("debugger component gained focus: " + e); + // StackTouchBars.changeReason = "tool-window gained focus"; + ourStack.showContainer(twbc); + return; + } } } } else if (e.getID() == FocusEvent.FOCUS_LOST) { @@ -189,16 +196,18 @@ public class TouchBarsManager { return; } - for (ProjectData pd: ourProjectData.values()) { - if (pd.isDisposed()) - continue; + synchronized (ourProjectData) { + for (ProjectData pd: ourProjectData.values()) { + if (pd.isDisposed()) + continue; - final ProjectData.EditorData ed = pd.findEditorDataByComponent(src); - if (ed != null && ed.containerSearch != null) { - // System.out.println("editor-component lost focus: " + e); - // StackTouchBars.changeReason = "editor-component lost focus"; - ourStack.removeContainer(ed.containerSearch); - return; + final ProjectData.EditorData ed = pd.findEditorDataByComponent(src); + if (ed != null && ed.containerSearch != null) { + // System.out.println("editor-component lost focus: " + e); + // StackTouchBars.changeReason = "editor-component lost focus"; + ourStack.removeContainer(ed.containerSearch); + return; + } } } } @@ -208,19 +217,20 @@ public class TouchBarsManager { if (!isTouchBarAvailable()) return; - ApplicationManager.getApplication().assertIsDispatchThread(); - final Project proj = editor.getProject(); if (proj == null || proj.isDisposed()) return; - final ProjectData pd = ourProjectData.get(proj); - if (pd == null) { - // System.out.println("can't find project data to register editor: " + editor + ", project: " + proj); - return; - } + final ProjectData pd; + synchronized (ourProjectData) { + pd = ourProjectData.get(proj); + if (pd == null) { + // System.out.println("can't find project data to register editor: " + editor + ", project: " + proj); + return; + } - pd.registerEditor(editor); + pd.registerEditor(editor); + } if (editor instanceof EditorEx) ((EditorEx)editor).addFocusListener(new FocusChangeListener() { @@ -245,63 +255,62 @@ public class TouchBarsManager { if (!isTouchBarAvailable()) return; - ApplicationManager.getApplication().assertIsDispatchThread(); - final Project proj = editor.getProject(); if (proj == null) return; + synchronized (ourProjectData) { + final ProjectData pd = ourProjectData.get(proj); + if (pd == null) + return; - final ProjectData pd = ourProjectData.get(proj); - if (pd == null) - return; - - pd.removeEditor(editor); + pd.removeEditor(editor); + } } public static void onUpdateEditorHeader(@NotNull Editor editor, JComponent header) { if (!isTouchBarAvailable()) return; - ApplicationManager.getApplication().assertIsDispatchThread(); - final Project proj = editor.getProject(); if (proj == null) return; - final ProjectData pd = ourProjectData.get(proj); - if (pd == null) { - LOG.error("can't find project data to update header of editor: " + editor + ", project: " + proj); - return; - } + synchronized (ourProjectData) { + final ProjectData pd = ourProjectData.get(proj); + if (pd == null) { + LOG.error("can't find project data to update header of editor: " + editor + ", project: " + proj); + return; + } - final ProjectData.EditorData ed = pd.getEditorData(editor); - if (ed == null) { - LOG.error("can't find editor-data to update header of editor: " + editor + ", project: " + proj); - return; - } + final ProjectData.EditorData ed = pd.getEditorData(editor); + if (ed == null) { + LOG.error("can't find editor-data to update header of editor: " + editor + ", project: " + proj); + return; + } - // System.out.printf("onUpdateEditorHeader: editor='%s', header='%s'\n", editor, header); + // System.out.printf("onUpdateEditorHeader: editor='%s', header='%s'\n", editor, header); - final ActionGroup actions = header instanceof DataProvider ? TouchbarDataKeys.ACTIONS_KEY.getData((DataProvider)header) : null; - if (header == null) { - // System.out.println("set null header"); - ed.editorHeader = null; - if (ed.containerSearch != null) - ourStack.removeContainer(ed.containerSearch); - } else { - // System.out.println("set header: " + header); - // System.out.println("\t\tparent: " + header.getParent()); - ed.editorHeader = header; - - if (ed.containerSearch == null || ed.actionsSearch != actions) { - if (ed.containerSearch != null) { + final ActionGroup actions = header instanceof DataProvider ? TouchbarDataKeys.ACTIONS_KEY.getData((DataProvider)header) : null; + if (header == null) { + // System.out.println("set null header"); + ed.editorHeader = null; + if (ed.containerSearch != null) ourStack.removeContainer(ed.containerSearch); - ed.containerSearch.release(); - } + } else { + // System.out.println("set header: " + header); + // System.out.println("\t\tparent: " + header.getParent()); + ed.editorHeader = header; - if (actions != null) { - ed.containerSearch = new BarContainer(BarType.EDITOR_SEARCH, TouchBar.buildFromGroup("editor_search_" + header, actions, true, true), null, header); - ourStack.showContainer(ed.containerSearch); + if (ed.containerSearch == null || ed.actionsSearch != actions) { + if (ed.containerSearch != null) { + ourStack.removeContainer(ed.containerSearch); + ed.containerSearch.release(); + } + + if (actions != null) { + ed.containerSearch = new BarContainer(BarType.EDITOR_SEARCH, TouchBar.buildFromGroup("editor_search_" + header, actions, true, true), null, header); + ourStack.showContainer(ed.containerSearch); + } } } }