This is an automated email from the ASF dual-hosted git repository.
sdedic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new a4edd994da Prevent deadlock from firing events.
new 0b7a01dfe8 Merge pull request #6845 from
sdedic/sdedic/project-alert-deadlock
a4edd994da is described below
commit a4edd994da949b401eb00e58b5626e1d553d2714
Author: Svata Dedic <[email protected]>
AuthorDate: Thu Dec 14 20:15:17 2023 +0100
Prevent deadlock from firing events.
---
.../lsp/server/project/BrokenReferencesModel.java | 76 +++++++++++-----------
1 file changed, 37 insertions(+), 39 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..8959e91fb8 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
@@ -115,51 +115,49 @@ public final class BrokenReferencesModel extends
AbstractListModel implements Pr
* @param fire
*/
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;
+ boolean changed = false;
+ 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 = updateReferencesList(problems, all);
+ size = getSize();
+ }
+ if (fire && changed) {
+ 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