Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre Guilet2018-07-26 09:31:55 +0000
committerPierre-Charles David2018-07-30 12:24:17 +0000
commit340e321d2adbd4729835b73b703234b6f5bf070e (patch)
tree689510e1a6662cdc4fa51d3520ce9afc956d95ef
parent431a7da05a7a4d1de64b31215f6336ccf34bb18d (diff)
downloadorg.eclipse.sirius-340e321d2adbd4729835b73b703234b6f5bf070e.tar.gz
org.eclipse.sirius-340e321d2adbd4729835b73b703234b6f5bf070e.tar.xz
org.eclipse.sirius-340e321d2adbd4729835b73b703234b6f5bf070e.zip
[537231] Fix deadlock with workflow page
The Jetty Browser refresh calls SiriusServerBackendFilter in a separate thread for each request coming from each resource set event. This call constructs the Workflow page and during the construction, Viewpoints proxys can be resolved at the same time leading to a deadlock in EMF transaction level that is not thread safe. This patch makes the browser to refresh only one time when the following event have occurred: - a representation change - a semantic change - a view selection change - a VSM update - a resource replacement Bug: 537231 Change-Id: I76335690f8e71f4ec8fc03943112faf820748d7c Signed-off-by: Pierre Guilet <pierre.guilet@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.workflow.ui.page/src/org/eclipse/sirius/workflow/ui/page/WorkflowPage.java71
1 files changed, 66 insertions, 5 deletions
diff --git a/plugins/org.eclipse.sirius.workflow.ui.page/src/org/eclipse/sirius/workflow/ui/page/WorkflowPage.java b/plugins/org.eclipse.sirius.workflow.ui.page/src/org/eclipse/sirius/workflow/ui/page/WorkflowPage.java
index d7108bf2c1..0ef77430ca 100644
--- a/plugins/org.eclipse.sirius.workflow.ui.page/src/org/eclipse/sirius/workflow/ui/page/WorkflowPage.java
+++ b/plugins/org.eclipse.sirius.workflow.ui.page/src/org/eclipse/sirius/workflow/ui/page/WorkflowPage.java
@@ -18,11 +18,15 @@ import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.transaction.ResourceSetChangeEvent;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.sirius.business.api.session.Session;
+import org.eclipse.sirius.business.api.session.SessionListener;
+import org.eclipse.sirius.business.api.session.SessionManager;
+import org.eclipse.sirius.business.api.session.SessionManagerListener;
import org.eclipse.sirius.server.internal.SiriusServerPlugin;
import org.eclipse.sirius.ui.editor.SessionEditorPlugin;
import org.eclipse.sirius.ui.editor.api.pages.AbstractSessionEditorPage;
import org.eclipse.sirius.ui.editor.api.pages.PageProviderRegistry.PositioningKind;
import org.eclipse.sirius.ui.editor.api.pages.PageUpdateCommandBuilder.PageUpdateCommand;
+import org.eclipse.sirius.viewpoint.description.Viewpoint;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
@@ -43,6 +47,55 @@ import org.eclipse.ui.forms.widgets.ScrolledForm;
*/
public class WorkflowPage extends AbstractSessionEditorPage {
/**
+ * Listener refreshing the {@link Browser} when Sirius resource changes occur.
+ *
+ * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+ *
+ */
+ private final class SessionManagerListenerForBrowserRefresh implements SessionManagerListener {
+ @Override
+ public void notifyAddSession(Session newSession) {
+ // Nothing to do for this event.
+ }
+
+ @Override
+ public void notifyRemoveSession(Session removedSession) {
+ // Nothing to do for this event.
+ }
+
+ @Override
+ public void viewpointSelected(Viewpoint selectedSirius) {
+ // Nothing to do for this event.
+ }
+
+ @Override
+ public void viewpointDeselected(Viewpoint deselectedSirius) {
+ // Nothing to do for this event.
+ }
+
+ @Override
+ public void notify(Session updated, int notification) {
+ switch (notification) {
+ case SessionListener.REPRESENTATION_CHANGE:
+ case SessionListener.SEMANTIC_CHANGE:
+ case SessionListener.SELECTED_VIEWS_CHANGE_KIND:
+ case SessionListener.VSM_UPDATED:
+ case SessionListener.REPLACED:
+ Display.getDefault().asyncExec(() -> {
+ if (browser != null && !browser.isDisposed()) {
+ browser.refresh();
+ }
+ });
+ break;
+ default:
+ // do nothing as we will be notified in other way
+ break;
+ }
+
+ }
+ }
+
+ /**
* The session.
*/
private final Session session;
@@ -53,6 +106,11 @@ public class WorkflowPage extends AbstractSessionEditorPage {
private Browser browser;
/**
+ * Listener refreshing the {@link Browser} when Sirius resource changes occur.
+ */
+ private SessionManagerListenerForBrowserRefresh sessionManagerListenerForBrowserRefresh;
+
+ /**
* Creates a new {@link WorkflowPage} for the specified session.
*
* @param s
@@ -61,6 +119,14 @@ public class WorkflowPage extends AbstractSessionEditorPage {
public WorkflowPage(Session s) {
super(s.getID(), Messages.WorkflowPage_tab_name);
this.session = Objects.requireNonNull(s);
+ sessionManagerListenerForBrowserRefresh = new SessionManagerListenerForBrowserRefresh();
+ SessionManager.INSTANCE.addSessionsListener(sessionManagerListenerForBrowserRefresh);
+ }
+
+ @Override
+ public void dispose() {
+ SessionManager.INSTANCE.removeSessionsListener(sessionManagerListenerForBrowserRefresh);
+ super.dispose();
}
@Override
@@ -115,11 +181,6 @@ public class WorkflowPage extends AbstractSessionEditorPage {
@Override
public Optional<PageUpdateCommand> resourceSetChanged(ResourceSetChangeEvent resourceSetChangeEvent) {
- Display.getDefault().asyncExec(() -> {
- if (browser != null && !browser.isDisposed()) {
- browser.refresh();
- }
- });
return Optional.empty();
}
}

Back to the top