1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bugzilla 249345.

This commit is contained in:
Randy Rohrbach 2008-10-01 16:15:33 +00:00
parent f33ccb861b
commit 57661f4db9

View file

@ -23,12 +23,14 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform;
import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor; import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor;
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
import org.eclipse.dd.dsf.concurrent.DsfExecutor;
import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.DsfRunnable;
import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.concurrent.RequestMonitor;
import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.datamodel.IDMContext;
import org.eclipse.dd.dsf.datamodel.IDMData; import org.eclipse.dd.dsf.datamodel.IDMData;
import org.eclipse.dd.dsf.datamodel.IDMService; import org.eclipse.dd.dsf.datamodel.IDMService;
import org.eclipse.dd.dsf.internal.ui.DsfUIPlugin; import org.eclipse.dd.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.dd.dsf.ui.concurrent.SimpleDisplayExecutor;
import org.eclipse.dd.dsf.ui.concurrent.ViewerCountingRequestMonitor; import org.eclipse.dd.dsf.ui.concurrent.ViewerCountingRequestMonitor;
import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor;
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter; import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
@ -945,48 +947,75 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
public void getModelData(final IVMNode node, final IViewerUpdate update, final IDMService service, final IDMContext dmc, public void getModelData(final IVMNode node, final IViewerUpdate update, final IDMService service, final IDMContext dmc,
final DataRequestMonitor rm, final Executor executor) final DataRequestMonitor rm, final Executor executor)
{ {
getExecutor().execute(new DsfRunnable() { // Determine if this request is being issues on the a VM executor thread. If so
public void run() { // then we do not need to create a new one to insure data integrity.
Executor vmExecutor = getExecutor();
if ( vmExecutor instanceof SimpleDisplayExecutor ) {
getCacheModelData(node, update, service, dmc, rm, executor );
} else {
vmExecutor.execute(new DsfRunnable() {
public void run() {
getCacheModelData(node, update, service, dmc, rm, executor );
}
});
}
}
ElementDataKey key = makeEntryKey(node, update); private void getCacheModelData(final IVMNode node, final IViewerUpdate update, final IDMService service, final IDMContext dmc,
final ElementDataEntry entry = getElementDataEntry(key); final DataRequestMonitor rm, final Executor executor)
/*if (entry.fDirty) { {
rm.setStatus(Status.CANCEL_STATUS); ElementDataKey key = makeEntryKey(node, update);
rm.done(); final ElementDataEntry entry = getElementDataEntry(key);
} else */{ /*if (entry.fDirty) {
Object dataOrStatus = entry.fDataOrStatus.get(dmc); rm.setStatus(Status.CANCEL_STATUS);
if(dataOrStatus != null) { rm.done();
if (dataOrStatus instanceof IDMData) { } else */{
rm.setData( dataOrStatus ); Object dataOrStatus = entry.fDataOrStatus.get(dmc);
} else { if(dataOrStatus != null) {
rm.setStatus((IStatus)dataOrStatus ); if (dataOrStatus instanceof IDMData) {
} rm.setData( dataOrStatus );
rm.done(); } else {
} else { rm.setStatus((IStatus)dataOrStatus );
service.getExecutor().execute(new DsfRunnable() { }
public void run() { rm.done();
service.getModelData(dmc, } else {
new ViewerDataRequestMonitor<IDMData>(executor, update) { // Determine if we are already running on a DSF executor thread. if so then
@Override // we do not need to create a new one to issue the request to the service.
protected void handleCompleted() { DsfExecutor dsfExecutor = service.getExecutor();
if (isSuccess()) { if ( dsfExecutor.isInExecutorThread() ) {
entry.fDataOrStatus.put(dmc, getData()); getModelDataFromService(node, update, service, dmc, rm, executor, entry );
rm.setData(getData()); }
} else { else {
if (!isCanceled()) { dsfExecutor.execute(new DsfRunnable() {
entry.fDataOrStatus.put(dmc, getStatus()); public void run() {
} getModelDataFromService(node, update, service, dmc, rm, executor, entry );
rm.setStatus(getStatus()); }
} });
rm.done(); }
} }
}); }
} }
});
} private void getModelDataFromService(final IVMNode node, final IViewerUpdate update, final IDMService service, final IDMContext dmc,
} final DataRequestMonitor rm, final Executor executor, final ElementDataEntry entry)
} {
}); service.getModelData(
dmc,
new ViewerDataRequestMonitor<IDMData>(executor, update) {
@Override
protected void handleCompleted() {
if (isSuccess()) {
entry.fDataOrStatus.put(dmc, getData());
rm.setData(getData());
} else {
if (!isCanceled()) {
entry.fDataOrStatus.put(dmc, getStatus());
}
rm.setStatus(getStatus());
}
rm.done();
}
});
} }
/** /**