mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
[233372] - [view model] VM Cache gets corrupted causing it to get into spin-lock and freezing up the IDE.
[233380] - [view model] VM cache can save the result of a canceled update.
This commit is contained in:
parent
77b141cf06
commit
9cfe89c6fc
1 changed files with 58 additions and 31 deletions
|
@ -21,6 +21,7 @@ import java.util.concurrent.Executor;
|
|||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor;
|
||||
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
|
||||
import org.eclipse.dd.dsf.concurrent.DsfRunnable;
|
||||
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
|
||||
import org.eclipse.dd.dsf.datamodel.IDMContext;
|
||||
import org.eclipse.dd.dsf.datamodel.IDMData;
|
||||
|
@ -193,6 +194,21 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
|||
RootElementMarkerKey(Object rootElement) {
|
||||
fRootElement = rootElement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Root marker for " + fRootElement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return obj instanceof RootElementMarkerKey && ((RootElementMarkerKey)obj).fRootElement.equals(fRootElement);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return fRootElement.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
class RootElementMarkerEntry extends Entry {
|
||||
|
@ -364,7 +380,7 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
|||
// This causes the update to return with an error.
|
||||
// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=202109
|
||||
// Instead of checking isSuccess(), check getData() != null.
|
||||
if(getData() != null) {
|
||||
if(getData() != null && !isCanceled()) {
|
||||
// Check if the udpate retrieved all children by specifying "offset = -1, length = -1"
|
||||
int updateOffset = update.getOffset();
|
||||
if (updateOffset < 0) {
|
||||
|
@ -654,7 +670,10 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
|||
entry.insert(fCacheListHead);
|
||||
}
|
||||
|
||||
// Update they root element marker.
|
||||
// Update they root element marker:
|
||||
// - ensure that the root marker is root markers' map,
|
||||
// - ensure that the root marker is in the cache map,
|
||||
// - and ensure that it's at the end of the cache.
|
||||
RootElementMarkerKey rootMarker = fRootMarkers.get(key.fRootElement);
|
||||
if (rootMarker == null) {
|
||||
rootMarker = new RootElementMarkerKey(key.fRootElement);
|
||||
|
@ -664,7 +683,7 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
|||
if (rootMarkerEntry == null) {
|
||||
rootMarkerEntry = new RootElementMarkerEntry(rootMarker);
|
||||
addEntry(rootMarker, rootMarkerEntry);
|
||||
} else {
|
||||
} else if (rootMarkerEntry.fNext != fCacheListHead) {
|
||||
rootMarkerEntry.remove();
|
||||
rootMarkerEntry.insert(fCacheListHead);
|
||||
}
|
||||
|
@ -691,36 +710,44 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
|||
* {@link IElementPropertiesProvider}.
|
||||
*/
|
||||
@Deprecated
|
||||
public void getModelData(IVMNode node, IViewerUpdate update, IDMService service, final IDMContext dmc,
|
||||
final DataRequestMonitor rm, Executor executor)
|
||||
public void getModelData(final IVMNode node, final IViewerUpdate update, final IDMService service, final IDMContext dmc,
|
||||
final DataRequestMonitor rm, final Executor executor)
|
||||
{
|
||||
ElementDataKey key = makeEntryKey(node, update);
|
||||
final ElementDataEntry entry = getElementDataEntry(key);
|
||||
Object dataOrStatus = entry.fDataOrStatus.get(dmc);
|
||||
if(dataOrStatus != null) {
|
||||
if (dataOrStatus instanceof IDMData) {
|
||||
rm.setData( (IDMData)dataOrStatus );
|
||||
} else {
|
||||
rm.setStatus((IStatus)dataOrStatus );
|
||||
}
|
||||
rm.done();
|
||||
} else {
|
||||
service.getModelData(dmc,
|
||||
new ViewerDataRequestMonitor<IDMData>(executor, update) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
if (isSuccess()) {
|
||||
entry.fDataOrStatus.put(dmc, getData());
|
||||
rm.setData(getData());
|
||||
} else {
|
||||
entry.fDataOrStatus.put(dmc, getStatus());
|
||||
rm.setStatus(getStatus());
|
||||
}
|
||||
rm.done();
|
||||
getExecutor().execute(new DsfRunnable() {
|
||||
public void run() {
|
||||
|
||||
ElementDataKey key = makeEntryKey(node, update);
|
||||
final ElementDataEntry entry = getElementDataEntry(key);
|
||||
Object dataOrStatus = entry.fDataOrStatus.get(dmc);
|
||||
if(dataOrStatus != null) {
|
||||
if (dataOrStatus instanceof IDMData) {
|
||||
rm.setData( (IDMData)dataOrStatus );
|
||||
} else {
|
||||
rm.setStatus((IStatus)dataOrStatus );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
rm.done();
|
||||
} else {
|
||||
service.getExecutor().execute(new DsfRunnable() {
|
||||
public void run() {
|
||||
service.getModelData(dmc,
|
||||
new ViewerDataRequestMonitor<IDMData>(executor, update) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
if (isSuccess()) {
|
||||
entry.fDataOrStatus.put(dmc, getData());
|
||||
rm.setData(getData());
|
||||
} else {
|
||||
entry.fDataOrStatus.put(dmc, getStatus());
|
||||
rm.setStatus(getStatus());
|
||||
}
|
||||
rm.done();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue