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

Reply via email to