locationtech / udig-platform

uDig parent project containing all core components. More plugins can be found in community repos: http://github.com/uDig-Community
http://udig.refractions.net
190 stars 133 forks source link

Override toArray functions with lock #651

Closed sschulz92 closed 2 years ago

sschulz92 commented 2 years ago

In my project we faced concurrency issues, this PR is solving the issue in SynchronizedEObjectWithInverseResolvingEList:

Caused by: org.eclipse.emf.common.util.BasicEList$BasicIndexOutOfBoundsException: index=13, size=13
    at org.eclipse.emf.common.util.BasicEList.get(BasicEList.java:352)
    at org.locationtech.udig.project.internal.impl.SynchronizedEObjectWithInverseResolvingEList.get(SynchronizedEObjectWithInverseResolvingEList.java:78)
    at org.eclipse.emf.ecore.util.EcoreEList.toArray(EcoreEList.java:222)
    at java.util.Collections$UnmodifiableCollection.toArray(Unknown Source)
    at org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider.getElements(AdapterFactoryContentProvider.java:161)
    at org.eclipse.jface.viewers.StructuredViewer.getRawChildren(StructuredViewer.java:989)
    at org.eclipse.jface.viewers.ColumnViewer.getRawChildren(ColumnViewer.java:703)
    at org.eclipse.jface.viewers.AbstractTreeViewer.getRawChildren(AbstractTreeViewer.java:1332)
    at org.eclipse.jface.viewers.TreeViewer.getRawChildren(TreeViewer.java:391)
    at org.eclipse.jface.viewers.StructuredViewer.getFilteredChildren(StructuredViewer.java:896)
    at org.eclipse.jface.viewers.AbstractTreeViewer.getSortedChildren(AbstractTreeViewer.java:601)
    at org.eclipse.jface.viewers.AbstractTreeViewer.updateChildren(AbstractTreeViewer.java:2581)
fgdrf commented 2 years ago

Nice catch, i guess it fixes the issue:

!ENTRY org.eclipse.jface 2 0 2019-03-22 12:54:29.832
!MESSAGE Ignored reentrant call while viewer is busy. This is only logged once per viewer instance, but similar calls will still be ignored.
!STACK 0
java.lang.RuntimeException
    at org.eclipse.jface.viewers.ColumnViewer.checkBusy(ColumnViewer.java:763)
    at org.eclipse.jface.viewers.ColumnViewer.update(ColumnViewer.java:552)
    at org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider$ViewerRefresh.refresh(AdapterFactoryContentProvider.java:499)
    at org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider$ViewerRefresh.run(AdapterFactoryContentProvider.java:463)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4041)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660)

that somtimes happen while parallel layers need to be refreshed due to content of the datastore changed.