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.dd.dsf.concurrent.CountingRequestMonitor;
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.RequestMonitor;
import org.eclipse.dd.dsf.datamodel.IDMContext;
import org.eclipse.dd.dsf.datamodel.IDMData;
import org.eclipse.dd.dsf.datamodel.IDMService;
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.ViewerDataRequestMonitor;
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
@ -945,9 +947,23 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
public void getModelData(final IVMNode node, final IViewerUpdate update, final IDMService service, final IDMContext dmc,
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
// 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 );
}
});
}
}
private void getCacheModelData(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);
/*if (entry.fDirty) {
@ -963,9 +979,28 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
}
rm.done();
} else {
service.getExecutor().execute(new DsfRunnable() {
// Determine if we are already running on a DSF executor thread. if so then
// 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() {
service.getModelData(dmc,
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() {
@ -982,12 +1017,6 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
}
});
}
});
}
}
}
});
}
/**
* Retrieves the deprecated IDMData object for the given IDMContext. This