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,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, 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
// 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() { 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); ElementDataKey key = makeEntryKey(node, update);
final ElementDataEntry entry = getElementDataEntry(key); final ElementDataEntry entry = getElementDataEntry(key);
/*if (entry.fDirty) { /*if (entry.fDirty) {
@ -963,9 +979,28 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
} }
rm.done(); rm.done();
} else { } 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() { 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) { new ViewerDataRequestMonitor<IDMData>(executor, update) {
@Override @Override
protected void handleCompleted() { protected void handleCompleted() {
@ -982,12 +1017,6 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
} }
}); });
} }
});
}
}
}
});
}
/** /**
* Retrieves the deprecated IDMData object for the given IDMContext. This * Retrieves the deprecated IDMData object for the given IDMContext. This