1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +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:
Marc Khouzam 2015-02-13 14:32:17 -05:00
parent 0699f77da6
commit b26c273112
2 changed files with 88 additions and 154 deletions

View file

@ -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 * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -20,8 +20,6 @@ import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import org.eclipse.cdt.visualizer.ui.util.Todo;
/** /**
* Class representing the state of the data to display in the MulticoreVisualizer. * Class representing the state of the data to display in the MulticoreVisualizer.
*/ */
@ -38,12 +36,6 @@ public class VisualizerModel
/** List of threads */ /** List of threads */
protected ArrayList<VisualizerThread> m_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. // Setting to remove exited threads, or keep them shown.
// If we are to support this, we should have a preference // If we are to support this, we should have a preference
// and a way to for the user to clean up old threads, // 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_cpus = new ArrayList<VisualizerCPU>();
m_cpuMap = new Hashtable<Integer, VisualizerCPU>(); m_cpuMap = new Hashtable<Integer, VisualizerCPU>();
m_threads = new ArrayList<VisualizerThread>(); m_threads = new ArrayList<VisualizerThread>();
m_todo = new Todo();
m_loadTodo = new Todo();
} }
/** Dispose method */ /** Dispose method */
@ -85,30 +75,12 @@ public class VisualizerModel
m_threads.clear(); m_threads.clear();
m_threads = null; 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; m_sessionId = null;
} }
// --- accessors --- // --- 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) { public void setLoadMetersEnabled (boolean enable) {
m_loadMetersEnabled = enable; m_loadMetersEnabled = enable;
} }

View file

@ -26,6 +26,7 @@
* Marc Dumais (Ericsson) - Bug 460737 * Marc Dumais (Ericsson) - Bug 460737
* Marc Dumais (Ericsson) - Bug 460837 * Marc Dumais (Ericsson) - Bug 460837
* Marc Dumais (Ericsson) - Bug 460476 * 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; package org.eclipse.cdt.dsf.gdb.multicorevisualizer.internal.ui.view;
@ -37,10 +38,13 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor; 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.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.DsfRunnable; 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.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.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData; import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData;
@ -1137,11 +1141,8 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
// clear CPU/core cache // clear CPU/core cache
m_cpuCoreContextsCache.clear(); m_cpuCoreContextsCache.clear();
m_sessionState.execute(new DsfRunnable() { @Override public void run() { fDataModel = new VisualizerModel(m_sessionState.getSessionID());
// get model asynchronously, and update canvas getVisualizerModel(fDataModel);
// in getVisualizerModelDone().
getVisualizerModel();
}});
} }
/** Sets canvas model. (Also updates canvas selection.) */ /** Sets canvas model. (Also updates canvas selection.) */
@ -1199,54 +1200,44 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
// --- Visualizer model update methods --- // --- Visualizer model update methods ---
/** Starts visualizer model request. /**
* Calls getVisualizerModelDone() with the constructed model. * Starts visualizer model request.
*/ */
@ConfinedToDsfExecutor("getSession().getExecutor()") protected void getVisualizerModel(final VisualizerModel model) {
public void getVisualizerModel() { m_sessionState.execute(new DsfRunnable() { @Override public void run() {
String sessionId = m_sessionState.getSessionID(); // get model asynchronously starting at the top of the hierarchy
DsfSession session = DsfSession.getSession(sessionId); getCPUs(model, new ImmediateRequestMonitor() {
if (session != null) {
final VisualizerModel model = new VisualizerModel(sessionId);
fDataModel = model;
fTargetData.getCPUs(m_sessionState, new DataRequestMonitor<ICPUDMContext[]>(session.getExecutor(), null) {
@Override @Override
protected void handleCompleted() { protected void handleCompleted() {
ICPUDMContext[] cpuContexts = isSuccess() ? getData() : null;
getCPUsDone(cpuContexts, model);
}
});
}
}
/** Invoked when getModel() request completes. */
@ConfinedToDsfExecutor("getSession().getExecutor()")
public void getVisualizerModelDone(VisualizerModel model) {
model.setLoadMetersEnabled(getLoadMetersEnabled()); model.setLoadMetersEnabled(getLoadMetersEnabled());
updateLoads(model); updateLoads(model);
model.sort(); model.sort();
setCanvasModel(model); setCanvasModel(model);
} }
});
}});
}
// --- DSFDebugModelListener implementation ---
/** Invoked when DSFDebugModel.getCPUs() completes. */
@ConfinedToDsfExecutor("getSession().getExecutor()") @ConfinedToDsfExecutor("getSession().getExecutor()")
public void getCPUsDone(ICPUDMContext[] cpuContexts, final Object arg) protected void getCPUs(final VisualizerModel model, final RequestMonitor rm) {
{ fTargetData.getCPUs(m_sessionState, new ImmediateDataRequestMonitor<ICPUDMContext[]>() {
VisualizerModel model = (VisualizerModel) arg; @Override
protected void handleCompleted() {
ICPUDMContext[] cpuContexts = isSuccess() ? getData() : null;
getCores(cpuContexts, model, rm);
}
});
}
@ConfinedToDsfExecutor("getSession().getExecutor()")
protected void getCores(ICPUDMContext[] cpuContexts, final VisualizerModel model, final RequestMonitor rm)
{
if (cpuContexts == null || cpuContexts.length == 0) { if (cpuContexts == null || cpuContexts.length == 0) {
// Whoops, no CPU data. // Whoops, no CPU data.
// We'll fake a CPU and use it to contain any cores we find. // We'll fake a CPU and use it to contain any cores we find.
model.addCPU(new VisualizerCPU(0)); model.addCPU(new VisualizerCPU(0));
// keep track of CPUs left to visit
model.getTodo().add(1);
// Collect core data. // Collect core data.
fTargetData.getCores(m_sessionState, new ImmediateDataRequestMonitor<ICoreDMContext[]>() { fTargetData.getCores(m_sessionState, new ImmediateDataRequestMonitor<ICoreDMContext[]>() {
@Override @Override
@ -1263,16 +1254,15 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
} }
// Continue // Continue
getCoresDone(cpu, coreContexts, arg); getThreads(cpu, coreContexts, model, rm);
} }
}); });
} else { } else {
// save CPU contexts // save CPU contexts
m_cpuCoreContextsCache.addAll(Arrays.asList(cpuContexts)); m_cpuCoreContextsCache.addAll(Arrays.asList(cpuContexts));
// keep track of CPUs left to visit final CountingRequestMonitor crm = new ImmediateCountingRequestMonitor(rm);
int count = cpuContexts.length; crm.setDoneCount(cpuContexts.length);
model.getTodo().add(count);
for (final ICPUDMContext cpuContext : cpuContexts) { for (final ICPUDMContext cpuContext : cpuContexts) {
int cpuID = Integer.parseInt(cpuContext.getId()); int cpuID = Integer.parseInt(cpuContext.getId());
@ -1283,22 +1273,23 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
@Override @Override
protected void handleCompleted() { protected void handleCompleted() {
ICoreDMContext[] coreContexts = isSuccess() ? getData() : null; ICoreDMContext[] coreContexts = isSuccess() ? getData() : null;
getCoresDone(cpuContext, coreContexts, arg); getThreads(cpuContext, coreContexts, model, crm);
} }
}); });
} }
} }
} }
/** Invoked when getCores() request completes. */
@ConfinedToDsfExecutor("getSession().getExecutor()") @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) { if (coreContexts == null || coreContexts.length == 0) {
// no cores for this cpu context // no cores for this cpu context
// That's fine. // That's fine.
rm.done();
} else { } else {
// save core contexts // save core contexts
m_cpuCoreContextsCache.addAll(Arrays.asList(coreContexts)); m_cpuCoreContextsCache.addAll(Arrays.asList(coreContexts));
@ -1306,9 +1297,8 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
int cpuID = Integer.parseInt(cpuContext.getId()); int cpuID = Integer.parseInt(cpuContext.getId());
VisualizerCPU cpu = model.getCPU(cpuID); VisualizerCPU cpu = model.getCPU(cpuID);
// keep track of Cores left to visit final CountingRequestMonitor crm = new ImmediateCountingRequestMonitor(rm);
int count = coreContexts.length; crm.setDoneCount(coreContexts.length);
model.getTodo().add(count);
for (final ICoreDMContext coreContext : coreContexts) { for (final ICoreDMContext coreContext : coreContexts) {
int coreID = Integer.parseInt(coreContext.getId()); int coreID = Integer.parseInt(coreContext.getId());
@ -1319,35 +1309,27 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
@Override @Override
protected void handleCompleted() { protected void handleCompleted() {
IDMContext[] threadContexts = isSuccess() ? getData() : null; IDMContext[] threadContexts = isSuccess() ? getData() : null;
getThreadData(cpuContext, coreContext, threadContexts, model, crm);
getThreadsDone(cpuContext, coreContext, threadContexts, arg);
} }
}); });
} }
} }
// keep track of CPUs visited
// note: do this _after_ incrementing for cores
done(1, model);
} }
/** Invoked when getThreads() request completes. */
@ConfinedToDsfExecutor("getSession().getExecutor()") @ConfinedToDsfExecutor("getSession().getExecutor()")
public void getThreadsDone(final ICPUDMContext cpuContext, protected void getThreadData(final ICPUDMContext cpuContext,
final ICoreDMContext coreContext, final ICoreDMContext coreContext,
IDMContext[] threadContexts, IDMContext[] threadContexts,
final Object arg) final VisualizerModel model,
RequestMonitor rm)
{ {
VisualizerModel model = (VisualizerModel) arg;
if (threadContexts == null || threadContexts.length == 0) { if (threadContexts == null || threadContexts.length == 0) {
// no threads for this core // no threads for this core
// That's fine. // That's fine.
rm.done();
} else { } else {
// keep track of threads left to visit final CountingRequestMonitor crm = new ImmediateCountingRequestMonitor(rm);
int count = threadContexts.length; crm.setDoneCount(threadContexts.length);
model.getTodo().add(count);
for (IDMContext threadContext : threadContexts) { for (IDMContext threadContext : threadContexts) {
final IMIExecutionDMContext execContext = final IMIExecutionDMContext execContext =
@ -1358,24 +1340,21 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
@Override @Override
protected void handleCompleted() { protected void handleCompleted() {
IThreadDMData threadData = isSuccess() ? getData() : null; 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. */ /** Invoked when getThreads() request completes. */
@ConfinedToDsfExecutor("getSession().getExecutor()") @ConfinedToDsfExecutor("getSession().getExecutor()")
public void getThreadDataDone(final ICPUDMContext cpuContext, protected void getThreadExecutionState(final ICPUDMContext cpuContext,
final ICoreDMContext coreContext, final ICoreDMContext coreContext,
final IMIExecutionDMContext execContext, final IMIExecutionDMContext execContext,
final IThreadDMData threadData, final IThreadDMData threadData,
final Object arg) final VisualizerModel model,
final RequestMonitor rm)
{ {
// Get the execution state // Get the execution state
fTargetData.getThreadExecutionState(m_sessionState, cpuContext, coreContext, execContext, fTargetData.getThreadExecutionState(m_sessionState, cpuContext, coreContext, execContext,
@ -1390,13 +1369,13 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
protected void handleCompleted() { protected void handleCompleted() {
IFrameDMData frameData = isSuccess() ? getData() : null; IFrameDMData frameData = isSuccess() ? getData() : null;
getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData, getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData,
frameData, state, arg); frameData, state, model, rm);
} }
}); });
} else { } else {
// frame data is not valid // frame data is not valid
getThreadExecutionStateDone(cpuContext, coreContext, execContext, threadData, 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. */ /** Invoked when getThreadExecutionState() request completes. */
@ConfinedToDsfExecutor("getSession().getExecutor()") @ConfinedToDsfExecutor("getSession().getExecutor()")
public void getThreadExecutionStateDone(ICPUDMContext cpuContext, protected void getThreadExecutionStateDone(ICPUDMContext cpuContext,
ICoreDMContext coreContext, ICoreDMContext coreContext,
IMIExecutionDMContext execContext, IMIExecutionDMContext execContext,
IThreadDMData threadData, IThreadDMData threadData,
IFrameDMData frame, IFrameDMData frame,
VisualizerExecutionState state, VisualizerExecutionState state,
Object arg) VisualizerModel model,
RequestMonitor rm)
{ {
VisualizerModel model = (VisualizerModel) arg;
int cpuID = Integer.parseInt(cpuContext.getId()); int cpuID = Integer.parseInt(cpuContext.getId());
VisualizerCPU cpu = model.getCPU(cpuID); VisualizerCPU cpu = model.getCPU(cpuID);
int coreID = Integer.parseInt(coreContext.getId()); int coreID = Integer.parseInt(coreContext.getId());
@ -1448,13 +1427,12 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
t.setLocationInfo(frame); t.setLocationInfo(frame);
} }
// keep track of threads visited rm.done();
done(1, model);
} }
/** Updates the loads for all cpus and cores */ /** Updates the loads for all cpus and cores */
@ConfinedToDsfExecutor("getSession().getExecutor()") @ConfinedToDsfExecutor("getSession().getExecutor()")
public void updateLoads(final VisualizerModel model) { protected void updateLoads(final VisualizerModel model) {
if (m_cpuCoreContextsCache.isEmpty()) { if (m_cpuCoreContextsCache.isEmpty()) {
// not ready to get load info yet // not ready to get load info yet
return; return;
@ -1464,9 +1442,21 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
return; return;
} }
model.getLoadTodo().dispose(); final CountingRequestMonitor crm = new ImmediateCountingRequestMonitor() {
// keep track of how many loads we expect @Override
model.getLoadTodo().add(m_cpuCoreContextsCache.size()); 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 // ask load for each CPU and core
for (final IDMContext context : m_cpuCoreContextsCache) { for (final IDMContext context : m_cpuCoreContextsCache) {
@ -1474,7 +1464,7 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
@Override @Override
protected void handleCompleted() { protected void handleCompleted() {
ILoadInfo loadInfo = isSuccess() ? getData() : null; 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. */ /** Invoked when a getLoad() request completes. */
@ConfinedToDsfExecutor("getSession().getExecutor()") @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; Integer l = null;
if (load != null) { if (load != null) {
@ -1504,32 +1493,7 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
core.setLoadInfo(new VisualizerLoadInfo(l)); core.setLoadInfo(new VisualizerLoadInfo(l));
} }
loadDone(1, model); rm.done();
}
/** 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();
}
}
} }
private Timer getLoadTimer(final DSFSessionState sessionState, final int timeout) { private Timer getLoadTimer(final DSFSessionState sessionState, final int timeout) {
@ -1544,8 +1508,7 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
executor.execute(new Runnable() { executor.execute(new Runnable() {
@Override @Override
public void run() { public void run() {
final VisualizerModel model = fDataModel; updateLoads(fDataModel);
updateLoads(model);
} }
}); });
} }
@ -1556,6 +1519,5 @@ public class MulticoreVisualizer extends GraphicCanvasVisualizer implements IPin
return t; return t;
} }
} }