1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-16 05:25:21 +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;
@ -935,7 +937,7 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
fCacheListHead.fNext.remove(); fCacheListHead.fNext.remove();
} }
} }
/** /**
* Retrieves the deprecated IDMData object for the given IDMContext. This * Retrieves the deprecated IDMData object for the given IDMContext. This
* method should be removed once the use of IDMData is replaced with * method should be removed once the use of IDMData is replaced with
@ -944,49 +946,76 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
@Deprecated @Deprecated
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();
ElementDataKey key = makeEntryKey(node, update); if ( vmExecutor instanceof SimpleDisplayExecutor ) {
final ElementDataEntry entry = getElementDataEntry(key); getCacheModelData(node, update, service, dmc, rm, executor );
/*if (entry.fDirty) { } else {
rm.setStatus(Status.CANCEL_STATUS); vmExecutor.execute(new DsfRunnable() {
rm.done(); public void run() {
} else */{ getCacheModelData(node, update, service, dmc, rm, executor );
Object dataOrStatus = entry.fDataOrStatus.get(dmc); }
if(dataOrStatus != null) { });
if (dataOrStatus instanceof IDMData) { }
rm.setData( dataOrStatus ); }
} else {
rm.setStatus((IStatus)dataOrStatus ); private void getCacheModelData(final IVMNode node, final IViewerUpdate update, final IDMService service, final IDMContext dmc,
} final DataRequestMonitor rm, final Executor executor)
rm.done(); {
} else { ElementDataKey key = makeEntryKey(node, update);
service.getExecutor().execute(new DsfRunnable() { final ElementDataEntry entry = getElementDataEntry(key);
public void run() { /*if (entry.fDirty) {
service.getModelData(dmc, rm.setStatus(Status.CANCEL_STATUS);
new ViewerDataRequestMonitor<IDMData>(executor, update) { rm.done();
@Override } else */{
protected void handleCompleted() { Object dataOrStatus = entry.fDataOrStatus.get(dmc);
if (isSuccess()) { if(dataOrStatus != null) {
entry.fDataOrStatus.put(dmc, getData()); if (dataOrStatus instanceof IDMData) {
rm.setData(getData()); rm.setData( dataOrStatus );
} else { } else {
if (!isCanceled()) { rm.setStatus((IStatus)dataOrStatus );
entry.fDataOrStatus.put(dmc, getStatus()); }
} rm.done();
rm.setStatus(getStatus()); } else {
} // Determine if we are already running on a DSF executor thread. if so then
rm.done(); // we do not need to create a new one to issue the request to the service.
} DsfExecutor dsfExecutor = service.getExecutor();
}); if ( dsfExecutor.isInExecutorThread() ) {
} getModelDataFromService(node, update, service, dmc, rm, executor, entry );
}); }
} else {
} dsfExecutor.execute(new DsfRunnable() {
} public void run() {
}); getModelDataFromService(node, update, service, dmc, rm, executor, entry );
}
});
}
}
}
}
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();
}
});
} }
/** /**