diff options
| author | Pierre Guilet | 2018-07-26 09:31:55 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2018-07-30 12:24:17 +0000 |
| commit | 340e321d2adbd4729835b73b703234b6f5bf070e (patch) | |
| tree | 689510e1a6662cdc4fa51d3520ce9afc956d95ef | |
| parent | 431a7da05a7a4d1de64b31215f6336ccf34bb18d (diff) | |
| download | org.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.java | 71 |
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(); } } |
