Community
Participate
Working Groups
Sometimes we get the following exception just after session closing because of the UI thread which call SessionManager.INSTANCE.getSession() : java.util.ConcurrentModificationException at org.eclipse.emf.common.util.ArrayDelegatingEList$EIterator.checkModCount(ArrayDelegatingEList.java:879) at org.eclipse.emf.common.util.AbstractEList$EIterator.doNext(AbstractEList.java:704) at org.eclipse.emf.common.util.AbstractEList$EIterator.next(AbstractEList.java:690) at java.util.AbstractCollection.addAll(AbstractCollection.java:322) at java.util.LinkedHashSet.<init>(LinkedHashSet.java:169) at com.google.common.collect.Sets.newLinkedHashSet(Sets.java:325) at org.eclipse.sirius.business.internal.session.SessionTransientAttachment.getSessionTransientAttachement(SessionTransientAttachment.java:72) at org.eclipse.sirius.business.internal.session.SessionManagerImpl.getSession(SessionManagerImpl.java:213) at org.eclipse.sirius.ui.tools.internal.views.common.SessionWrapperContentProvider.getRepresentationsAssociatedToEObject(SessionWrapperContentProvider.java:195) at org.eclipse.sirius.ui.tools.internal.views.common.SessionWrapperContentProvider.doGetChildren(SessionWrapperContentProvider.java:140) at org.eclipse.sirius.ui.tools.internal.views.common.SessionWrapperContentProvider.getChildren(SessionWrapperContentProvider.java:88) at org.eclipse.sirius.common.ui.tools.api.navigator.GroupingContentProvider.getChildren(GroupingContentProvider.java:165) at org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider.getChildren(SiriusCommonContentProvider.java:175) at org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider.hasChildren(SiriusCommonContentProvider.java:401) at org.eclipse.ui.internal.navigator.extensions.SafeDelegateTreeContentProvider.hasChildren(SafeDelegateTreeContentProvider.java:110) at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.callNormalHasChildren(NavigatorContentServiceContentProvider.java:430) at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.access$4(NavigatorContentServiceContentProvider.java:425) at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider$3.run(NavigatorContentServiceContentProvider.java:395) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.hasChildren(NavigatorContentServiceContentProvider.java:381) at org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider.hasChildren(NavigatorContentServiceContentProvider.java:422) at org.eclipse.jface.viewers.AbstractTreeViewer.isExpandable(AbstractTreeViewer.java:2138) at org.eclipse.jface.viewers.TreeViewer.isExpandable(TreeViewer.java:588) at org.eclipse.jface.viewers.AbstractTreeViewer.isExpandable(AbstractTreeViewer.java:2176) at org.eclipse.jface.viewers.AbstractTreeViewer.optionallyPruneChildren(AbstractTreeViewer.java:2808) at org.eclipse.jface.viewers.AbstractTreeViewer.updateChildren(AbstractTreeViewer.java:2608) at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1923) at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:721) at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1930) at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:721) at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1930) at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:721) at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1930) at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:721) at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1930) at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:721) at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1930) at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:721) at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1898) at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1855) at org.eclipse.ui.navigator.CommonViewer.internalRefresh(CommonViewer.java:561) at org.eclipse.jface.viewers.StructuredViewer$8.run(StructuredViewer.java:1535) at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1443) at org.eclipse.jface.viewers.TreeViewer.preservingSelection(TreeViewer.java:403) at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1404) at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1533) at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:548) at org.eclipse.ui.navigator.CommonViewer.refresh(CommonViewer.java:350) at org.eclipse.sirius.ui.tools.internal.views.common.navigator.filter.FilteredCommonTree$NotifyingCommonViewer.refresh(FilteredCommonTree.java:1177) at org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider$3.run(SiriusCommonContentProvider.java:584) at org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider.runUpdates(SiriusCommonContentProvider.java:745) at org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider.runPendingUpdates(SiriusCommonContentProvider.java:737) at org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider.access$9(SiriusCommonContentProvider.java:728) at org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider$4.runInUIThread(SiriusCommonContentProvider.java:714) at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:95) at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135) at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3537) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3189) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:124) at org.eclipse.swtbot.eclipse.core.UITestApplication.start(UITestApplication.java:54) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:622) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584) at org.eclipse.equinox.launcher.Main.run(Main.java:1438) at org.eclipse.equinox.launcher.Main.main(Main.java:1414)
Esteban, do you think that a simple copy of eObj.eAdapters(), before iterate on it, in SessionTransientAttachment.getSessionTransientAttachement(Notifier) could solve the problem?
No it will not be sufficient, the fix is have Session.Manager.getSession() thread safe. Perhaps a read-only transaction will solve this issue. I will try that.
https://git.eclipse.org/r/40522 has been created, the change consists of using a read transaction to access model but this can lead to deadlock for example on diagram creation because GMF view factories need UI resource in a non UI thread and UI thread need to access model through SessionManager.getSession() : Thread creating the diagram : Thread [ModalContext] (Suspended) waiting for: Lock (id=140) Object.wait(long) line: not available [native method] Lock(Object).wait() line: 502 Lock.lock() line: 34 OS.gdk_colormap_get_system() line: 3801 Color.init(int, int, int) line: 247 Color.<init>(Device, int, int, int) line: 79 FigureUtilities.<clinit>() line: 33 DNodeContainerViewFactory(AbstractViewFactory).initializeFromPreferences(View) line: 116 DNodeContainerViewFactory(AbstractShapeViewFactory).initializeFromPreferences(View) line: 50 DNodeContainerViewFactory(BasicNodeViewFactory).decorateView(View, View, IAdaptable, String, int, boolean) line: 211 DNodeContainerViewFactory(AbstractDesignerNodeFactory).decorateView(View, View, IAdaptable, String, int, boolean) line: 36 DNodeContainerViewFactory.decorateView(View, View, IAdaptable, String, int, boolean) line: 53 BasicNodeViewFactory$2.doExecute(IProgressMonitor, IAdaptable) line: 162 BasicNodeViewFactory$2(AbstractEMFOperation).execute(IProgressMonitor, IAdaptable) line: 150 DNodeContainerViewFactory(BasicNodeViewFactory).createView(IAdaptable, View, String, int, boolean, PreferencesHint) line: 170 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 622 SiriusViewProvider(AbstractViewProvider).createNewView(Class, Object[]) line: 249 SiriusViewProvider(AbstractViewProvider).createNode(IAdaptable, View, String, int, boolean, PreferencesHint) line: 119 DDiagramCanonicalSynchronizer(AbstractCanonicalSynchronizer).createViews(List<SiriusNodeDescriptor>, String, View) line: 294 DDiagramCanonicalSynchronizer(AbstractCanonicalSynchronizer).refreshSemanticChildren(View, EObject) line: 158 DDiagramCanonicalSynchronizer.refreshSemantic() line: 107 DDiagramCanonicalSynchronizer.synchronize() line: 101 DiagramDialectServices.createRepresentation(String, EObject, RepresentationDescription, Session, IProgressMonitor) line: 176 DialectManagerImpl.createRepresentation(String, EObject, RepresentationDescription, Session, IProgressMonitor) line: 151 CreateRepresentationCommand.doExecute() line: 115 CreateRepresentationCommand(RecordingCommand).execute() line: 135 EMFCommandOperation.doExecute(IProgressMonitor, IAdaptable) line: 119 EMFCommandOperation(AbstractEMFOperation).execute(IProgressMonitor, IAdaptable) line: 150 DefaultOperationHistory.execute(IUndoableOperation, IProgressMonitor, IAdaptable) line: 513 WorkspaceCommandStack(WorkspaceCommandStackImpl).doExecute(Command, Map<?,?>) line: 208 WorkspaceCommandStack.doExecute(Command, Map) line: 68 WorkspaceCommandStack(AbstractTransactionalCommandStack).execute(Command, Map<?,?>) line: 165 WorkspaceCommandStack(AbstractTransactionalCommandStack).execute(Command) line: 219 CreateRepresentationAction$1.run(IProgressMonitor) line: 127 ModalContext$ModalContextThread.run() line: 121 UI thread calling SessionManager.getSession() : Thread [main] (Suspended) owns: TransactionImpl (id=152) owns: RunnableLock (id=153) owns: TransactionImpl (id=154) owns: RunnableLock (id=155) waiting for: Semaphore (id=151) Object.wait(long) line: not available [native method] Semaphore.acquire(long) line: 39 OrderedLock.doAcquire(Semaphore, long) line: 176 OrderedLock.acquire(long) line: 110 OrderedLock.acquire() line: 84 Lock.uiSafeAcquire(boolean) line: 357 TransactionalEditingDomainImpl(TransactionalEditingDomainImpl).acquire(InternalTransaction) line: 580 TransactionalEditingDomainImpl(TransactionalEditingDomainImpl).activate(InternalTransaction) line: 508 TransactionImpl.start() line: 204 TransactionalEditingDomainImpl(TransactionalEditingDomainImpl).startTransaction(boolean, Map<?,?>) line: 424 TransactionalEditingDomainImpl(TransactionalEditingDomainImpl).runExclusive(Runnable) line: 321 SessionManagerImpl.getSession(Resource) line: 202 CommonItemSorter.category(Object) line: 75 CommonItemSorter(ViewerComparator).compare(Viewer, Object, Object) line: 121 CommonItemSorter.compare(Viewer, Object, Object) line: 94 CommonViewerSorter.compare(Viewer, TreePath, Object, Object) line: 140 TreePathViewerSorter$1.compare(Object, Object) line: 105 Arrays.mergeSort(Object[], Object[], int, int, int, Comparator) line: 1283 Arrays.sort(T[], Comparator<? super T>) line: 1223 CommonViewerSorter(TreePathViewerSorter).sort(Viewer, TreePath, Object[]) line: 103 FilteredCommonTree$NotifyingCommonViewer(AbstractTreeViewer).getSortedChildren(Object) line: 639 FilteredCommonTree$NotifyingCommonViewer(AbstractTreeViewer).updateChildren(Widget, Object, Object[], boolean) line: 2643 FilteredCommonTree$NotifyingCommonViewer(AbstractTreeViewer).internalRefreshStruct(Widget, Object, boolean) line: 1923 FilteredCommonTree$NotifyingCommonViewer(TreeViewer).internalRefreshStruct(Widget, Object, boolean) line: 721 FilteredCommonTree$NotifyingCommonViewer(AbstractTreeViewer).internalRefreshStruct(Widget, Object, boolean) line: 1930 FilteredCommonTree$NotifyingCommonViewer(TreeViewer).internalRefreshStruct(Widget, Object, boolean) line: 721 FilteredCommonTree$NotifyingCommonViewer(AbstractTreeViewer).internalRefresh(Widget, Object, boolean, boolean) line: 1898 FilteredCommonTree$NotifyingCommonViewer(AbstractTreeViewer).internalRefresh(Object, boolean) line: 1855 FilteredCommonTree$NotifyingCommonViewer(CommonViewer).internalRefresh(Object, boolean) line: 561 StructuredViewer$8.run() line: 1535 FilteredCommonTree$NotifyingCommonViewer(StructuredViewer).preservingSelection(Runnable, boolean) line: 1443 FilteredCommonTree$NotifyingCommonViewer(TreeViewer).preservingSelection(Runnable, boolean) line: 403 FilteredCommonTree$NotifyingCommonViewer(StructuredViewer).preservingSelection(Runnable) line: 1404 FilteredCommonTree$NotifyingCommonViewer(StructuredViewer).refresh(Object, boolean) line: 1533 FilteredCommonTree$NotifyingCommonViewer(ColumnViewer).refresh(Object, boolean) line: 548 FilteredCommonTree$NotifyingCommonViewer(CommonViewer).refresh(Object, boolean) line: 350 FilteredCommonTree$NotifyingCommonViewer.refresh(Object, boolean) line: 1177 SiriusCommonContentProvider$3.run() line: 584 SiriusCommonContentProvider.runUpdates(Collection<Runnable>) line: 745 SiriusCommonContentProvider.runPendingUpdates() line: 737 SiriusCommonContentProvider.access$9(SiriusCommonContentProvider) line: 728 SiriusCommonContentProvider$4.runInUIThread(IProgressMonitor) line: 714 UIJob$1.run() line: 95 RunnableLock.run() line: 35 UISynchronizer(Synchronizer).runAsyncMessages(boolean) line: 135 Display.runAsyncMessages(boolean) line: 3537 Display.readAndDispatch() line: 3189 EventLoopProgressMonitor.runEventLoop() line: 123 EventLoopProgressMonitor.isCanceled() line: 97 ThreadJob.isCanceled(IProgressMonitor) line: 144 ThreadJob.waitForRun(ThreadJob, IProgressMonitor, InternalJob, Thread) line: 233 ThreadJob.joinRun(ThreadJob, IProgressMonitor) line: 197 ImplicitJobs.begin(ISchedulingRule, IProgressMonitor, boolean) line: 92 JobManager.beginRule(ISchedulingRule, IProgressMonitor) line: 286 Lock.uiSafeAcquire(boolean) line: 359 TransactionalEditingDomainImpl(TransactionalEditingDomainImpl).acquire(InternalTransaction) line: 580 TransactionalEditingDomainImpl(TransactionalEditingDomainImpl).activate(InternalTransaction) line: 508 TransactionImpl.start() line: 204 TransactionalEditingDomainImpl(TransactionalEditingDomainImpl).startTransaction(boolean, Map<?,?>) line: 424 TransactionalEditingDomainImpl(TransactionalEditingDomainImpl).runExclusive(Runnable) line: 321 SessionManagerImpl.getSession(EObject) line: 184 AbstractSaveRemoteChangesActionHandler.getCurrentSession(ISelection) line: 237 AbstractSaveRemoteChangesActionHandler.getCurrentRepositoryManagerIfAny(ISelection) line: 164 AbstractSaveRemoteChangesActionHandler.getOrCreateTransaction(ISelection) line: 285 DiscardChangesHandler(AbstractSaveRemoteChangesActionHandler).isEnabled() line: 103 HandlerProxy.isEnabled() line: 317 Command.isEnabled() line: 862 CommandContributionItem.isEnabled() line: 986 CommandContributionItem.updateToolItem() line: 670 CommandContributionItem.update(String) line: 582 CommandContributionItem.update() line: 569 CommandContributionItem$1.bindingManagerChanged(BindingManagerEvent) line: 1006 BindingManager.fireBindingManagerChanged(BindingManagerEvent) line: 900 BindingManager.setActiveBindings(Map, Map, Map, Map) line: 2176 BindingManager.recomputeBindings() line: 1742 BindingManager.contextManagerChanged(ContextManagerEvent) line: 689 ContextManager.fireContextManagerChanged(ContextManagerEvent) line: 165 ContextManager.setEventCaching(boolean) line: 324 ContextManager.deferUpdates(boolean) line: 83 ContextAuthority.sourceChanged(int) line: 673 ContextAuthority(ExpressionAuthority).sourceChanged(int, String[]) line: 310 ContextAuthority(ExpressionAuthority).sourceChanged(int, Map) line: 290 WorkbenchSourceProvider(AbstractSourceProvider).fireSourceChanged(int, Map) line: 99 WorkbenchSourceProvider.access$14(WorkbenchSourceProvider, int, Map) line: 1 WorkbenchSourceProvider$6.handleEvent(Event) line: 772 EventTable.sendEvent(Event) line: 84 Display.filterEvent(Event) line: 1484 Shell(Widget).sendEvent(Event) line: 1275 Shell(Widget).sendEvent(int, Event, boolean) line: 1300 Shell(Widget).sendEvent(int) line: 1281 Shell.filterProc(long, long, long) line: 731 Display.filterProc(long, long, long) line: 1496 OS._g_main_context_iteration(long, boolean) line: not available [native method] OS.g_main_context_iteration(long, boolean) line: 2342 Display.readAndDispatch() line: 3184 ModalContext$ModalContextThread.block() line: 173 ModalContext.run(IRunnableWithProgress, boolean, IProgressMonitor, Display) line: 388 ProgressMonitorJobsDialog(ProgressMonitorDialog).run(boolean, boolean, IRunnableWithProgress) line: 507 ProgressMonitorJobsDialog.run(boolean, boolean, IRunnableWithProgress) line: 275 ProgressManager.run(boolean, boolean, IRunnableWithProgress) line: 1162 CreateRepresentationAction.run() line: 136 CreateRepresentationAction(Action).runWithEvent(Event) line: 498 ActionContributionItem.handleWidgetSelection(Event, boolean) line: 584 ActionContributionItem.access$2(ActionContributionItem, Event, boolean) line: 501 ActionContributionItem$5.handleEvent(Event) line: 411 EventTable.sendEvent(Event) line: 84 MenuItem(Widget).sendEvent(Event) line: 1276 MenuItem(Widget).sendEvent(int, Event, boolean) line: 1300 MenuItem(Widget).sendEvent(int, Event) line: 1285 MenuItem(Widget).notifyListeners(int, Event) line: 1079 AbstractSWTBot$2.run() line: 159 ... UISynchronizer(Synchronizer).runAsyncMessages(boolean) line: 135 Display.runAsyncMessages(boolean) line: 3537 Display.readAndDispatch() line: 3189 Workbench.runEventLoop(Window$IExceptionHandler, Display) line: 2701 Workbench.runUI() line: 2665 Workbench.access$4(Workbench) line: 2499 Workbench$7.run() line: 679 Realm.runWithDefault(Realm, Runnable) line: 332 Workbench.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 668 PlatformUI.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 149 IDEApplication.start(IApplicationContext) line: 124 UITestApplication.start(IApplicationContext) line: 54 EclipseAppHandle.run(Object) line: 196 EclipseAppLauncher.runApplication(Object) line: 110 EclipseAppLauncher.start(Object) line: 79 EclipseStarter.run(Object) line: 353 EclipseStarter.run(String[], Runnable) line: 180 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43 Method.invoke(Object, Object...) line: 622 Main.invokeFramework(String[], URL[]) line: 629 Main.basicRun(String[]) line: 584 Main.run(String[]) line: 1438 Main.main(String[]) line: 1414