From 2056e4085ed398c47ab3527afef3fa9c2686735a Mon Sep 17 00:00:00 2001 From: Niklas Rentz Date: Tue, 5 Jul 2022 16:57:28 +0200 Subject: [PATCH] lsp: added more synchronization while accessing the view context and syntheses. Avoids exceptions caused by broken references in instantiated syntheses --- .../klighd/lsp/KGraphDiagramUpdater.xtend | 6 ++-- .../lsp/KGraphLanguageServerExtension.xtend | 34 +++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/plugins/de.cau.cs.kieler.klighd.lsp/src/de/cau/cs/kieler/klighd/lsp/KGraphDiagramUpdater.xtend b/plugins/de.cau.cs.kieler.klighd.lsp/src/de/cau/cs/kieler/klighd/lsp/KGraphDiagramUpdater.xtend index 330c9d249..da01539d6 100644 --- a/plugins/de.cau.cs.kieler.klighd.lsp/src/de/cau/cs/kieler/klighd/lsp/KGraphDiagramUpdater.xtend +++ b/plugins/de.cau.cs.kieler.klighd.lsp/src/de/cau/cs/kieler/klighd/lsp/KGraphDiagramUpdater.xtend @@ -170,8 +170,10 @@ class KGraphDiagramUpdater extends DiagramUpdater { (diagramServers as List).forEach [ KGraphDiagramServer server | // Only update an erroneous model if there was no diagram shown before. if (!hasErrors || server.currentRoot.type == "NONE") { - prepareModel(server, model_, uri) - updateLayout(server) + synchronized (diagramState) { + prepareModel(server, model_, uri) + updateLayout(server) + } } ] return null as Void diff --git a/plugins/de.cau.cs.kieler.klighd.lsp/src/de/cau/cs/kieler/klighd/lsp/KGraphLanguageServerExtension.xtend b/plugins/de.cau.cs.kieler.klighd.lsp/src/de/cau/cs/kieler/klighd/lsp/KGraphLanguageServerExtension.xtend index 12f45e9e4..3b228d9ff 100644 --- a/plugins/de.cau.cs.kieler.klighd.lsp/src/de/cau/cs/kieler/klighd/lsp/KGraphLanguageServerExtension.xtend +++ b/plugins/de.cau.cs.kieler.klighd.lsp/src/de/cau/cs/kieler/klighd/lsp/KGraphLanguageServerExtension.xtend @@ -180,17 +180,19 @@ class KGraphLanguageServerExtension extends SyncDiagramLanguageServer * @return A list of the IDs and displayable names of all available syntheses. */ def List getAvailableSynthesesData(Class currentModelClass) { - val KlighdDataManager kdm = KlighdDataManager.instance - return kdm.getAvailableSyntheses(currentModelClass).map [ - val synthesisId = kdm.getSynthesisID(it) - var displayedName = "" - if (it instanceof ReinitializingDiagramSynthesisProxy) { - displayedName = it.delegate.class.simpleName - } else { - displayedName = it.class.simpleName - } - return new SetSynthesesActionData(synthesisId, displayedName) - ].toList + synchronized (diagramState) { + val KlighdDataManager kdm = KlighdDataManager.instance + return kdm.getAvailableSyntheses(currentModelClass).map [ + val synthesisId = kdm.getSynthesisID(it) + var displayedName = "" + if (it instanceof ReinitializingDiagramSynthesisProxy) { + displayedName = it.delegate.class.simpleName + } else { + displayedName = it.class.simpleName + } + return new SetSynthesesActionData(synthesisId, displayedName) + ].toList + } } override setSynthesisOptions(SetSynthesisOptionsParam param) { @@ -436,10 +438,12 @@ class KGraphLanguageServerExtension extends SyncDiagramLanguageServer // With that new diagram server, do a similar procedure to generate a diagram as for usual diagrams (except, // use the 'model' as its model. if (diagramUpdater instanceof KGraphDiagramUpdater) { - (diagramUpdater as KGraphDiagramUpdater).prepareModel(diagramServer, model, uri) - AbstractLanguageServer.addToMainThreadQueue([ - (diagramUpdater as KGraphDiagramUpdater).updateLayout(diagramServer) - ]) + synchronized (diagramState) { + (diagramUpdater as KGraphDiagramUpdater).prepareModel(diagramServer, model, uri) + AbstractLanguageServer.addToMainThreadQueue([ + (diagramUpdater as KGraphDiagramUpdater).updateLayout(diagramServer) + ]) + } // Also, update the syntheses available for the given diagram. if (!update) { val availableSynthesesData = getAvailableSynthesesData(model.class)