This is an automated email from the ASF dual-hosted git repository. sdedic pushed a commit to branch sdedic/feature/project-dependency-add_base in repository https://gitbox.apache.org/repos/asf/netbeans.git
commit 9bcb2d55c50e8a03966644f3168117486c273b4a Author: Svata Dedic <[email protected]> AuthorDate: Thu Dec 14 20:15:17 2023 +0100 Prevent deadlock from firing events. --- .../lsp/server/project/BrokenReferencesModel.java | 75 +++++++++++----------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/project/BrokenReferencesModel.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/project/BrokenReferencesModel.java index b686c356a8..a9aab9523d 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/project/BrokenReferencesModel.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/project/BrokenReferencesModel.java @@ -116,50 +116,49 @@ public final class BrokenReferencesModel extends AbstractListModel implements Pr */ void refresh(boolean fire) { AtomicBoolean changed = new AtomicBoolean(false); - final int size = ProjectManager.mutex().readAccess(new Mutex.Action<Integer>() { - @Override - public Integer run() { - synchronized (lock) { - final Map<ProjectProblemsProvider,Project> newProviders = new LinkedHashMap<ProjectProblemsProvider,Project>(); - for (Project bprj : ctx.getBrokenProjects()) { - final ProjectProblemsProvider provider = bprj.getLookup().lookup(ProjectProblemsProvider.class); - if (provider != null) { - newProviders.put(provider, bprj); - } + ProjectManager.mutex().postReadRequest(() -> { + int size; + + synchronized (lock) { + final Map<ProjectProblemsProvider,Project> newProviders = new LinkedHashMap<ProjectProblemsProvider,Project>(); + for (Project bprj : ctx.getBrokenProjects()) { + final ProjectProblemsProvider provider = bprj.getLookup().lookup(ProjectProblemsProvider.class); + if (provider != null) { + newProviders.put(provider, bprj); } - for (Iterator<Map.Entry<ProjectProblemsProvider,PropertyChangeListener>> it = providers.entrySet().iterator(); it.hasNext();) { - final Map.Entry<ProjectProblemsProvider,PropertyChangeListener> e = it.next(); - if (!newProviders.containsKey(e.getKey())) { - e.getKey().removePropertyChangeListener(e.getValue()); - it.remove(); - } + } + for (Iterator<Map.Entry<ProjectProblemsProvider,PropertyChangeListener>> it = providers.entrySet().iterator(); it.hasNext();) { + final Map.Entry<ProjectProblemsProvider,PropertyChangeListener> e = it.next(); + if (!newProviders.containsKey(e.getKey())) { + e.getKey().removePropertyChangeListener(e.getValue()); + it.remove(); + } + } + final Set<ProblemReference> all = new LinkedHashSet<ProblemReference>(); + for (Map.Entry<ProjectProblemsProvider,Project> ne : newProviders.entrySet()) { + final ProjectProblemsProvider ppp = ne.getKey(); + final Project bprj = ne.getValue(); + if (!providers.containsKey(ppp)) { + final PropertyChangeListener l = WeakListeners.propertyChange(BrokenReferencesModel.this, ppp); + ppp.addPropertyChangeListener(l); + providers.put(ppp, l); } - final Set<ProblemReference> all = new LinkedHashSet<ProblemReference>(); - for (Map.Entry<ProjectProblemsProvider,Project> ne : newProviders.entrySet()) { - final ProjectProblemsProvider ppp = ne.getKey(); - final Project bprj = ne.getValue(); - if (!providers.containsKey(ppp)) { - final PropertyChangeListener l = WeakListeners.propertyChange(BrokenReferencesModel.this, ppp); - ppp.addPropertyChangeListener(l); - providers.put(ppp, l); - } - for (ProjectProblem problem : ppp.getProblems()) { - all.add(new ProblemReference(problem, bprj, global)); - } + for (ProjectProblem problem : ppp.getProblems()) { + all.add(new ProblemReference(problem, bprj, global)); } - changed.set(updateReferencesList(problems, all)); - return getSize(); } + changed.set(updateReferencesList(problems, all)); + size = getSize(); + } + if (fire && changed.get()) { + Mutex.EVENT.postReadRequest(new Runnable() { + @Override + public void run() { + fireContentsChanged(BrokenReferencesModel.this, 0, size); + } + }); } }); - if (fire && changed.get()) { - Mutex.EVENT.readAccess(new Runnable() { - @Override - public void run() { - fireContentsChanged(BrokenReferencesModel.this, 0, size); - } - }); - } } private ProblemReference getOneReference(int index) { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected] For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
