mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 06:32:10 +02:00
Bug 459114 - More cleanup of async handling for Multicore
Visualizer This commit migrates the MulticoreVisualizer class to use the standard DSF programming paradigm, which is to use RequestMonitors. It also renames some methods to better fit in that programming model. Change-Id: Ie00a5dcb810fb13a4ac526ff221cc10bd52a3fca Signed-off-by: Marc Khouzam <marc.khouzam@ericsson.com>
This commit is contained in:
parent
0699f77da6
commit
b26c273112
2 changed files with 88 additions and 154 deletions
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012, 2014 Tilera Corporation and others.
|
||||
* Copyright (c) 2012, 2015 Tilera Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -20,8 +20,6 @@ import java.util.Hashtable;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.visualizer.ui.util.Todo;
|
||||
|
||||
/**
|
||||
* Class representing the state of the data to display in the MulticoreVisualizer.
|
||||
*/
|
||||
|
@ -38,12 +36,6 @@ public class VisualizerModel
|
|||
/** List of threads */
|
||||
protected ArrayList<VisualizerThread> m_threads;
|
||||
|
||||
/** Completion state tracker. */
|
||||
protected Todo m_todo;
|
||||
|
||||
/** Completion state tracker for load meters. */
|
||||
protected Todo m_loadTodo;
|
||||
|
||||
// Setting to remove exited threads, or keep them shown.
|
||||
// If we are to support this, we should have a preference
|
||||
// and a way to for the user to clean up old threads,
|
||||
|
@ -63,8 +55,6 @@ public class VisualizerModel
|
|||
m_cpus = new ArrayList<VisualizerCPU>();
|
||||
m_cpuMap = new Hashtable<Integer, VisualizerCPU>();
|
||||
m_threads = new ArrayList<VisualizerThread>();
|
||||
m_todo = new Todo();
|
||||
m_loadTodo = new Todo();
|
||||
}
|
||||
|
||||
/** Dispose method */
|
||||
|
@ -85,30 +75,12 @@ public class VisualizerModel
|
|||
m_threads.clear();
|
||||
m_threads = null;
|
||||
}
|
||||
if (m_todo != null) {
|
||||
m_todo.dispose();
|
||||
m_todo = null;
|
||||
}
|
||||
if (m_loadTodo != null) {
|
||||
m_loadTodo.dispose();
|
||||
m_loadTodo = null;
|
||||
}
|
||||
m_sessionId = null;
|
||||
}
|
||||
|
||||
|
||||
// --- accessors ---
|
||||
|
||||
/** Gets completion state tracker. */
|
||||
public Todo getTodo() {
|
||||
return m_todo;
|
||||
}
|
||||
|
||||
/** Gets completion state tracker. */
|
||||
public Todo getLoadTodo() {
|
||||
return m_loadTodo;
|
||||
}
|
||||
|
||||
public void setLoadMetersEnabled (boolean enable) {
|
||||
m_loadMetersEnabled = enable;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
* Marc Dumais (Ericsson) - Bug 460737
|
||||
* Marc Dumais (Ericsson) - Bug 460837
|
||||
* Marc Dumais (Ericsson) - Bug 460476
|
||||
* Marc Khouzam (Ericsson) - Use DSF usual async pattern (Bug 459114)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
|
||||
|
@ -37,10 +38,13 @@ import java.util.List;
|
|||
import java.util.Set;
|
||||
|
||||
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
|
||||
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
|
||||
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
|
||||
import org.eclipse.cdt.dsf.concurrent.ImmediateCountingRequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
||||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
||||
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData;
|
||||
|
@ -1137,11 +1141,8 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
// clear CPU/core cache
|
||||
m_cpuCoreContextsCache.clear();
|
||||
|
||||
m_sessionState.execute(new DsfRunnable() { @Override public void run() {
|
||||
// get model asynchronously, and update canvas
|
||||
// in getVisualizerModelDone().
|
||||
getVisualizerModel();
|
||||
}});
|
||||
fDataModel = new VisualizerModel(m_sessionState.getSessionID());
|
||||
getVisualizerModel(fDataModel);
|
||||
}
|
||||
|
||||
/** Sets canvas model. (Also updates canvas selection.) */
|
||||
|
@ -1199,54 +1200,44 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
|
||||
// --- Visualizer model update methods ---
|
||||
|
||||
/** Starts visualizer model request.
|
||||
* Calls getVisualizerModelDone() with the constructed model.
|
||||
/**
|
||||
* Starts visualizer model request.
|
||||
*/
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void getVisualizerModel() {
|
||||
String sessionId = m_sessionState.getSessionID();
|
||||
DsfSession session = DsfSession.getSession(sessionId);
|
||||
|
||||
if (session != null) {
|
||||
final VisualizerModel model = new VisualizerModel(sessionId);
|
||||
fDataModel = model;
|
||||
fTargetData.getCPUs(m_sessionState, new DataRequestMonitor<ICPUDMContext[]>(session.getExecutor(), null) {
|
||||
protected void getVisualizerModel(final VisualizerModel model) {
|
||||
m_sessionState.execute(new DsfRunnable() { @Override public void run() {
|
||||
// get model asynchronously starting at the top of the hierarchy
|
||||
getCPUs(model, new ImmediateRequestMonitor() {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
ICPUDMContext[] cpuContexts = isSuccess() ? getData() : null;
|
||||
getCPUsDone(cpuContexts, model);
|
||||
model.setLoadMetersEnabled(getLoadMetersEnabled());
|
||||
updateLoads(model);
|
||||
model.sort();
|
||||
setCanvasModel(model);
|
||||
}
|
||||
});
|
||||
}
|
||||
}});
|
||||
}
|
||||
|
||||
/** Invoked when getModel() request completes. */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void getVisualizerModelDone(VisualizerModel model) {
|
||||
model.setLoadMetersEnabled(getLoadMetersEnabled());
|
||||
updateLoads(model);
|
||||
model.sort();
|
||||
setCanvasModel(model);
|
||||
protected void getCPUs(final VisualizerModel model, final RequestMonitor rm) {
|
||||
fTargetData.getCPUs(m_sessionState, new ImmediateDataRequestMonitor<ICPUDMContext[]>() {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
ICPUDMContext[] cpuContexts = isSuccess() ? getData() : null;
|
||||
getCores(cpuContexts, model, rm);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// --- DSFDebugModelListener implementation ---
|
||||
|
||||
/** Invoked when DSFDebugModel.getCPUs() completes. */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void getCPUsDone(ICPUDMContext[] cpuContexts, final Object arg)
|
||||
protected void getCores(ICPUDMContext[] cpuContexts, final VisualizerModel model, final RequestMonitor rm)
|
||||
{
|
||||
VisualizerModel model = (VisualizerModel) arg;
|
||||
|
||||
if (cpuContexts == null || cpuContexts.length == 0) {
|
||||
// Whoops, no CPU data.
|
||||
// We'll fake a CPU and use it to contain any cores we find.
|
||||
|
||||
model.addCPU(new VisualizerCPU(0));
|
||||
|
||||
// keep track of CPUs left to visit
|
||||
model.getTodo().add(1);
|
||||
|
||||
// Collect core data.
|
||||
fTargetData.getCores(m_sessionState, new ImmediateDataRequestMonitor<ICoreDMContext[]>() {
|
||||
@Override
|
||||
|
@ -1263,16 +1254,15 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
}
|
||||
|
||||
// Continue
|
||||
getCoresDone(cpu, coreContexts, arg);
|
||||
getThreads(cpu, coreContexts, model, rm);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// save CPU contexts
|
||||
m_cpuCoreContextsCache.addAll(Arrays.asList(cpuContexts));
|
||||
|
||||
// keep track of CPUs left to visit
|
||||
int count = cpuContexts.length;
|
||||
model.getTodo().add(count);
|
||||
final CountingRequestMonitor crm = new ImmediateCountingRequestMonitor(rm);
|
||||
crm.setDoneCount(cpuContexts.length);
|
||||
|
||||
for (final ICPUDMContext cpuContext : cpuContexts) {
|
||||
int cpuID = Integer.parseInt(cpuContext.getId());
|
||||
|
@ -1283,22 +1273,23 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
@Override
|
||||
protected void handleCompleted() {
|
||||
ICoreDMContext[] coreContexts = isSuccess() ? getData() : null;
|
||||
getCoresDone(cpuContext, coreContexts, arg);
|
||||
getThreads(cpuContext, coreContexts, model, crm);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Invoked when getCores() request completes. */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void getCoresDone(final ICPUDMContext cpuContext, ICoreDMContext[] coreContexts, final Object arg)
|
||||
protected void getThreads(final ICPUDMContext cpuContext,
|
||||
ICoreDMContext[] coreContexts,
|
||||
final VisualizerModel model,
|
||||
RequestMonitor rm)
|
||||
{
|
||||
VisualizerModel model = (VisualizerModel) arg;
|
||||
|
||||
if (coreContexts == null || coreContexts.length == 0) {
|
||||
// no cores for this cpu context
|
||||
// That's fine.
|
||||
rm.done();
|
||||
} else {
|
||||
// save core contexts
|
||||
m_cpuCoreContextsCache.addAll(Arrays.asList(coreContexts));
|
||||
|
@ -1306,9 +1297,8 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
int cpuID = Integer.parseInt(cpuContext.getId());
|
||||
VisualizerCPU cpu = model.getCPU(cpuID);
|
||||
|
||||
// keep track of Cores left to visit
|
||||
int count = coreContexts.length;
|
||||
model.getTodo().add(count);
|
||||
final CountingRequestMonitor crm = new ImmediateCountingRequestMonitor(rm);
|
||||
crm.setDoneCount(coreContexts.length);
|
||||
|
||||
for (final ICoreDMContext coreContext : coreContexts) {
|
||||
int coreID = Integer.parseInt(coreContext.getId());
|
||||
|
@ -1319,35 +1309,27 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
@Override
|
||||
protected void handleCompleted() {
|
||||
IDMContext[] threadContexts = isSuccess() ? getData() : null;
|
||||
|
||||
getThreadsDone(cpuContext, coreContext, threadContexts, arg);
|
||||
getThreadData(cpuContext, coreContext, threadContexts, model, crm);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// keep track of CPUs visited
|
||||
// note: do this _after_ incrementing for cores
|
||||
done(1, model);
|
||||
}
|
||||
|
||||
|
||||
/** Invoked when getThreads() request completes. */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void getThreadsDone(final ICPUDMContext cpuContext,
|
||||
final ICoreDMContext coreContext,
|
||||
IDMContext[] threadContexts,
|
||||
final Object arg)
|
||||
protected void getThreadData(final ICPUDMContext cpuContext,
|
||||
final ICoreDMContext coreContext,
|
||||
IDMContext[] threadContexts,
|
||||
final VisualizerModel model,
|
||||
RequestMonitor rm)
|
||||
{
|
||||
VisualizerModel model = (VisualizerModel) arg;
|
||||
|
||||
if (threadContexts == null || threadContexts.length == 0) {
|
||||
// no threads for this core
|
||||
// That's fine.
|
||||
rm.done();
|
||||
} else {
|
||||
// keep track of threads left to visit
|
||||
int count = threadContexts.length;
|
||||
model.getTodo().add(count);
|
||||
final CountingRequestMonitor crm = new ImmediateCountingRequestMonitor(rm);
|
||||
crm.setDoneCount(threadContexts.length);
|
||||
|
||||
for (IDMContext threadContext : threadContexts) {
|
||||
final IMIExecutionDMContext execContext =
|
||||
|
@ -1358,24 +1340,21 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
@Override
|
||||
protected void handleCompleted() {
|
||||
IThreadDMData threadData = isSuccess() ? getData() : null;
|
||||
getThreadDataDone(cpuContext, coreContext, execContext, threadData, arg);
|
||||
getThreadExecutionState(cpuContext, coreContext, execContext, threadData, model, crm);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// keep track of cores visited
|
||||
// note: do this _after_ incrementing for threads
|
||||
done(1, model);
|
||||
}
|
||||
|
||||
/** Invoked when getThreads() request completes. */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void getThreadDataDone(final ICPUDMContext cpuContext,
|
||||
final ICoreDMContext coreContext,
|
||||
final IMIExecutionDMContext execContext,
|
||||
final IThreadDMData threadData,
|
||||
final Object arg)
|
||||
protected void getThreadExecutionState(final ICPUDMContext cpuContext,
|
||||
final ICoreDMContext coreContext,
|
||||
final IMIExecutionDMContext execContext,
|
||||
final IThreadDMData threadData,
|
||||
final VisualizerModel model,
|
||||
final RequestMonitor rm)
|
||||
{
|
||||
// Get the execution state
|
||||
fTargetData.getThreadExecutionState(m_sessionState, cpuContext, coreContext, execContext,
|
||||
|
@ -1390,13 +1369,13 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
protected void handleCompleted() {
|
||||
IFrameDMData frameData = isSuccess() ? getData() : null;
|
||||
getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData,
|
||||
frameData, state, arg);
|
||||
frameData, state, model, rm);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// frame data is not valid
|
||||
getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData,
|
||||
null, state, arg);
|
||||
null, state, model, rm);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -1405,15 +1384,15 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
|
||||
/** Invoked when getThreadExecutionState() request completes. */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void getThreadExecutionStateDone(ICPUDMContext cpuContext,
|
||||
ICoreDMContext coreContext,
|
||||
IMIExecutionDMContext execContext,
|
||||
IThreadDMData threadData,
|
||||
IFrameDMData frame,
|
||||
VisualizerExecutionState state,
|
||||
Object arg)
|
||||
protected void getThreadExecutionStateDone(ICPUDMContext cpuContext,
|
||||
ICoreDMContext coreContext,
|
||||
IMIExecutionDMContext execContext,
|
||||
IThreadDMData threadData,
|
||||
IFrameDMData frame,
|
||||
VisualizerExecutionState state,
|
||||
VisualizerModel model,
|
||||
RequestMonitor rm)
|
||||
{
|
||||
VisualizerModel model = (VisualizerModel) arg;
|
||||
int cpuID = Integer.parseInt(cpuContext.getId());
|
||||
VisualizerCPU cpu = model.getCPU(cpuID);
|
||||
int coreID = Integer.parseInt(coreContext.getId());
|
||||
|
@ -1448,13 +1427,12 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
t.setLocationInfo(frame);
|
||||
}
|
||||
|
||||
// keep track of threads visited
|
||||
done(1, model);
|
||||
rm.done();
|
||||
}
|
||||
|
||||
/** Updates the loads for all cpus and cores */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void updateLoads(final VisualizerModel model) {
|
||||
protected void updateLoads(final VisualizerModel model) {
|
||||
if (m_cpuCoreContextsCache.isEmpty()) {
|
||||
// not ready to get load info yet
|
||||
return;
|
||||
|
@ -1464,9 +1442,21 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
return;
|
||||
}
|
||||
|
||||
model.getLoadTodo().dispose();
|
||||
// keep track of how many loads we expect
|
||||
model.getLoadTodo().add(m_cpuCoreContextsCache.size());
|
||||
final CountingRequestMonitor crm = new ImmediateCountingRequestMonitor() {
|
||||
@Override
|
||||
protected void handleSuccess() {
|
||||
// canvas may have been disposed since the transaction has started
|
||||
if (m_canvas != null) {
|
||||
m_canvas.refreshLoadMeters();
|
||||
m_canvas.requestUpdate();
|
||||
}
|
||||
if (m_updateLoadMeterTimer != null) {
|
||||
// re-start timer
|
||||
m_updateLoadMeterTimer.start();
|
||||
}
|
||||
}
|
||||
};
|
||||
crm.setDoneCount(m_cpuCoreContextsCache.size());
|
||||
|
||||
// ask load for each CPU and core
|
||||
for (final IDMContext context : m_cpuCoreContextsCache) {
|
||||
|
@ -1474,7 +1464,7 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
@Override
|
||||
protected void handleCompleted() {
|
||||
ILoadInfo loadInfo = isSuccess() ? getData() : null;
|
||||
getLoadDone(context, loadInfo, model);
|
||||
getLoadDone(context, loadInfo, model, crm);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1482,9 +1472,8 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
|
||||
/** Invoked when a getLoad() request completes. */
|
||||
@ConfinedToDsfExecutor("getSession().getExecutor()")
|
||||
public void getLoadDone(IDMContext context, ILoadInfo load, Object arg)
|
||||
protected void getLoadDone(IDMContext context, ILoadInfo load, VisualizerModel model, RequestMonitor rm)
|
||||
{
|
||||
VisualizerModel model = (VisualizerModel) arg;
|
||||
Integer l = null;
|
||||
|
||||
if (load != null) {
|
||||
|
@ -1504,32 +1493,7 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
core.setLoadInfo(new VisualizerLoadInfo(l));
|
||||
}
|
||||
|
||||
loadDone(1, model);
|
||||
}
|
||||
|
||||
|
||||
/** Update "done" count for current visualizer model. */
|
||||
protected void done(int n, VisualizerModel model) {
|
||||
model.getTodo().done(n);
|
||||
if (model.getTodo().isDone()) {
|
||||
getVisualizerModelDone(model);
|
||||
}
|
||||
}
|
||||
|
||||
/** Update "done" count for current visualizer model. */
|
||||
protected void loadDone(int n, VisualizerModel model) {
|
||||
model.getLoadTodo().done(n);
|
||||
if (model.getLoadTodo().isDone()) {
|
||||
// canvas may have been disposed since the transaction has started
|
||||
if (m_canvas != null) {
|
||||
m_canvas.refreshLoadMeters();
|
||||
m_canvas.requestUpdate();
|
||||
}
|
||||
if (m_updateLoadMeterTimer != null) {
|
||||
// re-start timer
|
||||
m_updateLoadMeterTimer.start();
|
||||
}
|
||||
}
|
||||
rm.done();
|
||||
}
|
||||
|
||||
private Timer getLoadTimer(final DSFSessionState sessionState, final int timeout) {
|
||||
|
@ -1544,8 +1508,7 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
executor.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final VisualizerModel model = fDataModel;
|
||||
updateLoads(model);
|
||||
updateLoads(fDataModel);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1556,6 +1519,5 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
|
|||
|
||||
return t;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue