This is an automated email from the ASF dual-hosted git repository. sdedic pushed a commit to branch vsnetbeans_2003 in repository https://gitbox.apache.org/repos/asf/netbeans.git
commit 53e632e7e3068683519d985fc33f40647c3dcd8e Author: Svata Dedic <svatopluk.de...@oracle.com> AuthorDate: Tue Jan 9 10:15:22 2024 +0100 Fixed potential race condition betweeen LSP requests and reportController. --- .../server/protocol/TextDocumentServiceImpl.java | 38 ++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java index 115f717dd2..0dd12e5ea1 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java @@ -1914,23 +1914,27 @@ public class TextDocumentServiceImpl implements TextDocumentService, LanguageCli new Exception("no NbCodeLanguageClient!").printStackTrace(); } - diagnosticTasks.computeIfAbsent(uri, u -> { - return BACKGROUND_TASKS.create(() -> { - Document originalDoc = server.getOpenedDocuments().getDocument(uri); - long originalVersion = documentVersion(originalDoc); - List<Diagnostic> errorDiags = computeDiags(u, -1, ErrorProvider.Kind.ERRORS, originalVersion); - if (documentVersion(originalDoc) == originalVersion) { - publishDiagnostics(uri, errorDiags); - BACKGROUND_TASKS.create(() -> { - List<Diagnostic> hintDiags = computeDiags(u, -1, ErrorProvider.Kind.HINTS, originalVersion); - Document doc = server.getOpenedDocuments().getDocument(uri); - if (documentVersion(doc) == originalVersion) { - publishDiagnostics(uri, hintDiags); - } - }).schedule(DELAY); - } - }); - }).schedule(DELAY); + // sync needed - this can be called also from reporterControl, from other that LSP request thread. The factory function just cretaes a stopped + // Task that is executed later. + synchronized (diagnosticTasks) { + diagnosticTasks.computeIfAbsent(uri, u -> { + return BACKGROUND_TASKS.create(() -> { + Document originalDoc = server.getOpenedDocuments().getDocument(uri); + long originalVersion = documentVersion(originalDoc); + List<Diagnostic> errorDiags = computeDiags(u, -1, ErrorProvider.Kind.ERRORS, originalVersion); + if (documentVersion(originalDoc) == originalVersion) { + publishDiagnostics(uri, errorDiags); + BACKGROUND_TASKS.create(() -> { + List<Diagnostic> hintDiags = computeDiags(u, -1, ErrorProvider.Kind.HINTS, originalVersion); + Document doc = server.getOpenedDocuments().getDocument(uri); + if (documentVersion(doc) == originalVersion) { + publishDiagnostics(uri, hintDiags); + } + }).schedule(DELAY); + } + }); + }).schedule(DELAY); + } } CompletableFuture<List<Diagnostic>> computeDiagnostics(String uri, EnumSet<ErrorProvider.Kind> types) { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists