X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=org.eclipse.linuxtools.lttng2.kernel.ui%2Fsrc%2Forg%2Feclipse%2Flinuxtools%2Finternal%2Flttng2%2Fkernel%2Fui%2Fviews%2Fresources%2FResourcesView.java;h=69fb7e653651fd647eab9a4a0820e2471edf01fa;hb=4999a1961695db623f11e653207a24c639d67744;hp=f0e1e74daecbfed4bab1ded41acaeaee37ca34f3;hpb=8a74a597ac2d10b71df7f2e9099e9683ee8b3498;p=deliverable%2Ftracecompass.git diff --git a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java index f0e1e74dae..69fb7e6536 100644 --- a/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java +++ b/org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java @@ -1,630 +1,281 @@ -/******************************************************************************* - * Copyright (c) 2012 Ericsson - * - * 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Patrick Tasse - Initial API and implementation - *******************************************************************************/ - -package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IToolBarManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.linuxtools.internal.lttng2.kernel.core.Attributes; -import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages; -import org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources.ResourcesEntry.Type; -import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace; -import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp; -import org.eclipse.linuxtools.tmf.core.event.ITmfEvent; -import org.eclipse.linuxtools.tmf.core.event.TmfEvent; -import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange; -import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp; -import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException; -import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException; -import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException; -import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval; -import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal; -import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal; -import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler; -import org.eclipse.linuxtools.tmf.core.signal.TmfStateSystemBuildCompleted; -import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal; -import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier; -import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace; -import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment; -import org.eclipse.linuxtools.tmf.ui.views.TmfView; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphViewer; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry; -import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IActionBars; - -public class ResourcesView extends TmfView { - - // ------------------------------------------------------------------------ - // Constants - // ------------------------------------------------------------------------ - - /** - * View ID. - */ - public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.resources"; //$NON-NLS-1$ - - /** - * Initial time range - */ - private static final long INITIAL_WINDOW_OFFSET = (1L * 100 * 1000 * 1000); // .1sec - - // ------------------------------------------------------------------------ - // Fields - // ------------------------------------------------------------------------ - - // The time graph viewer - TimeGraphViewer fTimeGraphViewer; - - // The selected experiment - private TmfExperiment fSelectedExperiment; - - // The time graph entry list - private ArrayList fEntryList; - - // The start time - private long fStartTime; - - // The end time - private long fEndTime; - - // The display width - private int fDisplayWidth; - - // The next resource action - private Action fNextResourceAction; - - // The previous resource action - private Action fPreviousResourceAction; - - // The zoom thread - private ZoomThread fZoomThread; - - // ------------------------------------------------------------------------ - // Classes - // ------------------------------------------------------------------------ - - private class TraceEntry implements ITimeGraphEntry { - // The Trace - private CtfKernelTrace fTrace; - // The start time - private long fTraceStartTime; - // The end time - private long fTraceEndTime; - // The children of the entry - private ArrayList fChildren; - // The name of entry - private String fName; - - public TraceEntry(CtfKernelTrace trace, String name, long startTime, long endTime) { - fTrace = trace; - fChildren = new ArrayList(); - fName = name; - fTraceStartTime = startTime; - fTraceEndTime = endTime; - } - - @Override - public ITimeGraphEntry getParent() { - return null; - } - - @Override - public boolean hasChildren() { - return fChildren != null && fChildren.size() > 0; - } - - @Override - public ResourcesEntry[] getChildren() { - return fChildren.toArray(new ResourcesEntry[0]); - } - - @Override - public String getName() { - return fName; - } - - @Override - public long getStartTime() { - return fTraceStartTime; - } - - @Override - public long getEndTime() { - return fTraceEndTime; - } - - @Override - public boolean hasTimeEvents() { - return false; - } - - @Override - public Iterator getTimeEventsIterator() { - return null; - } - - @Override - public Iterator getTimeEventsIterator(long startTime, long stopTime, long visibleDuration) { - return null; - } - - public CtfKernelTrace getTrace() { - return fTrace; - } - - public void addChild(ResourcesEntry entry) { - int index; - for (index = 0; index < fChildren.size(); index++) { - ResourcesEntry other = fChildren.get(index); - if (entry.getType().compareTo(other.getType()) < 0) { - break; - } else if (entry.getType().equals(other.getType())) { - if (entry.getId() < other.getId()) { - break; - } - } - } - entry.setParent(this); - fChildren.add(index, entry); - } - } - - private static class TraceEntryComparator implements Comparator { - @Override - public int compare(ITimeGraphEntry o1, ITimeGraphEntry o2) { - int result = o1.getStartTime() < o2.getStartTime() ? -1 : o1.getStartTime() > o2.getStartTime() ? 1 : 0; - if (result == 0) { - result = o1.getName().compareTo(o2.getName()); - } - return result; - } - } - - private class ZoomThread extends Thread { - private long fZoomStartTime; - private long fZoomEndTime; - private IProgressMonitor fMonitor; - - public ZoomThread(long startTime, long endTime) { - super("ResourcesView zoom"); //$NON-NLS-1$ - fZoomStartTime = startTime; - fZoomEndTime = endTime; - fMonitor = new NullProgressMonitor(); - } - - @Override - public void run() { - ArrayList entryList = fEntryList; - if (entryList == null) { - return; - } - long resolution = Math.max(1, (fZoomEndTime - fZoomStartTime) / fDisplayWidth); - for (TraceEntry traceEntry : entryList) { - for (ITimeGraphEntry child : traceEntry.getChildren()) { - if (fMonitor.isCanceled()) { - break; - } - ResourcesEntry entry = (ResourcesEntry) child; - if (fZoomStartTime <= fStartTime && fZoomEndTime >= fEndTime) { - entry.setZoomedEventList(null); - } else { - List zoomedEventList = getEventList(entry, fZoomStartTime, fZoomEndTime, resolution, true, fMonitor); - if (zoomedEventList != null) { - entry.setZoomedEventList(zoomedEventList); - } - } - } - } - redraw(); - } - - public void cancel() { - fMonitor.setCanceled(true); - } - } - - // ------------------------------------------------------------------------ - // Constructors - // ------------------------------------------------------------------------ - - public ResourcesView() { - super(ID); - fDisplayWidth = Display.getDefault().getBounds().width; - } - - // ------------------------------------------------------------------------ - // ViewPart - // ------------------------------------------------------------------------ - - /* (non-Javadoc) - * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse.swt.widgets.Composite) - */ - @Override - public void createPartControl(Composite parent) { - fTimeGraphViewer = new TimeGraphViewer(parent, SWT.NONE); - - fTimeGraphViewer.setTimeGraphProvider(new ResourcesPresentationProvider()); - - fTimeGraphViewer.setTimeCalendarFormat(true); - - fTimeGraphViewer.addRangeListener(new ITimeGraphRangeListener() { - @Override - public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) { - long startTime = event.getStartTime(); - long endTime = event.getEndTime(); - TmfTimeRange range = new TmfTimeRange(new CtfTmfTimestamp(startTime), new CtfTmfTimestamp(endTime)); - TmfTimestamp time = new CtfTmfTimestamp(fTimeGraphViewer.getSelectedTime()); - broadcast(new TmfRangeSynchSignal(ResourcesView.this, range, time)); - startZoomThread(startTime, endTime); - } - }); - - fTimeGraphViewer.addTimeListener(new ITimeGraphTimeListener() { - @Override - public void timeSelected(TimeGraphTimeEvent event) { - long time = event.getTime(); - broadcast(new TmfTimeSynchSignal(ResourcesView.this, new CtfTmfTimestamp(time))); - } - }); - - final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$ - @Override - public void run() { - if (TmfExperiment.getCurrentExperiment() != null) { - selectExperiment(TmfExperiment.getCurrentExperiment()); - } - } - }; - thread.start(); - - // View Action Handling - makeActions(); - contributeToActionBars(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#setFocus() - */ - @Override - public void setFocus() { - fTimeGraphViewer.setFocus(); - } - - // ------------------------------------------------------------------------ - // Signal handlers - // ------------------------------------------------------------------------ - - @TmfSignalHandler - public void experimentSelected(final TmfExperimentSelectedSignal signal) { - if (signal.getExperiment().equals(fSelectedExperiment)) { - return; - } - - final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$ - @Override - public void run() { - selectExperiment(signal.getExperiment()); - } - }; - thread.start(); - } - - @TmfSignalHandler - public void synchToTime(final TmfTimeSynchSignal signal) { - if (signal.getSource() == this || fSelectedExperiment == null) { - return; - } - final long time = signal.getCurrentTime().normalize(0, -9).getValue(); - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - if (fTimeGraphViewer.getControl().isDisposed()) { - return; - } - fTimeGraphViewer.setSelectedTime(time, true); - startZoomThread(fTimeGraphViewer.getTime0(), fTimeGraphViewer.getTime1()); - } - }); - } - - @TmfSignalHandler - public void synchToRange(final TmfRangeSynchSignal signal) { - if (signal.getSource() == this || fSelectedExperiment == null) { - return; - } - final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue(); - final long endTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue(); - final long time = signal.getCurrentTime().normalize(0, -9).getValue(); - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - if (fTimeGraphViewer.getControl().isDisposed()) { - return; - } - fTimeGraphViewer.setStartFinishTime(startTime, endTime); - fTimeGraphViewer.setSelectedTime(time, false); - startZoomThread(startTime, endTime); - } - }); - } - - @TmfSignalHandler - public void stateSystemBuildCompleted (final TmfStateSystemBuildCompleted signal) { - final TmfExperiment selectedExperiment = fSelectedExperiment; - if (selectedExperiment == null) { - return; - } - for (ITmfTrace trace : selectedExperiment.getTraces()) { - if (trace == signal.getTrace() && trace instanceof CtfKernelTrace) { - final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$ - @Override - public void run() { - // rebuild the model - selectExperiment(selectedExperiment); - } - }; - thread.start(); - } - } - } - - // ------------------------------------------------------------------------ - // Internal - // ------------------------------------------------------------------------ - - @SuppressWarnings("unchecked") - private void selectExperiment(TmfExperiment experiment) { - fStartTime = Long.MAX_VALUE; - fEndTime = Long.MIN_VALUE; - fSelectedExperiment = (TmfExperiment) experiment; - ArrayList entryList = new ArrayList(); - for (ITmfTrace trace : experiment.getTraces()) { - if (trace instanceof CtfKernelTrace) { - CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace; - IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem(); - long startTime = ssq.getStartTime(); - long endTime = ssq.getCurrentEndTime() + 1; - TraceEntry groupEntry = new TraceEntry(ctfKernelTrace, trace.getName(), startTime, endTime); - entryList.add(groupEntry); - fStartTime = Math.min(fStartTime, startTime); - fEndTime = Math.max(fEndTime, endTime); - List cpuQuarks = ssq.getQuarks(Attributes.CPUS, "*"); //$NON-NLS-1$ - ResourcesEntry[] cpuEntries = new ResourcesEntry[cpuQuarks.size()]; - for (int i = 0; i < cpuQuarks.size(); i++) { - int cpuQuark = cpuQuarks.get(i); - int cpu = Integer.parseInt(ssq.getAttributeName(cpuQuark)); - ResourcesEntry entry = new ResourcesEntry(cpuQuark, ctfKernelTrace, Type.CPU, cpu); - groupEntry.addChild(entry); - cpuEntries[i] = entry; - } - List irqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.IRQS, "*"); //$NON-NLS-1$ - ResourcesEntry[] irqEntries = new ResourcesEntry[irqQuarks.size()]; - for (int i = 0; i < irqQuarks.size(); i++) { - int irqQuark = irqQuarks.get(i); - int irq = Integer.parseInt(ssq.getAttributeName(irqQuark)); - ResourcesEntry entry = new ResourcesEntry(irqQuark, ctfKernelTrace, Type.IRQ, irq); - groupEntry.addChild(entry); - irqEntries[i] = entry; - } - List softIrqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.SOFT_IRQS, "*"); //$NON-NLS-1$ - ResourcesEntry[] softIrqEntries = new ResourcesEntry[softIrqQuarks.size()]; - for (int i = 0; i < softIrqQuarks.size(); i++) { - int softIrqQuark = softIrqQuarks.get(i); - int softIrq = Integer.parseInt(ssq.getAttributeName(softIrqQuark)); - ResourcesEntry entry = new ResourcesEntry(softIrqQuark, ctfKernelTrace, Type.SOFT_IRQ, softIrq); - groupEntry.addChild(entry); - softIrqEntries[i] = entry; - } - } - } - fEntryList = entryList; - refresh(INITIAL_WINDOW_OFFSET); - for (TraceEntry traceEntry : fEntryList) { - CtfKernelTrace ctfKernelTrace = ((TraceEntry) traceEntry).getTrace(); - IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem(); - long startTime = ssq.getStartTime(); - long endTime = ssq.getCurrentEndTime() + 1; - long resolution = (endTime - startTime) / fDisplayWidth; - for (ResourcesEntry entry : traceEntry.getChildren()) { - List eventList = getEventList(entry, startTime, endTime, resolution, false, new NullProgressMonitor()); - entry.setEventList(eventList); - redraw(); - } - } - } - - private List getEventList(ResourcesEntry entry, long startTime, long endTime, long resolution, boolean includeNull, IProgressMonitor monitor) { - IStateSystemQuerier ssq = entry.getTrace().getStateSystem(); - startTime = Math.max(startTime, ssq.getStartTime()); - endTime = Math.min(endTime, ssq.getCurrentEndTime() + 1); - if (endTime <= startTime) { - return null; - } - List eventList = null; - int quark = entry.getQuark(); - try { - if (entry.getType().equals(Type.CPU)) { - int statusQuark = ssq.getQuarkRelative(quark, Attributes.STATUS); - List statusIntervals = ssq.queryHistoryRange(statusQuark, startTime, endTime - 1, resolution); - eventList = new ArrayList(statusIntervals.size()); - long lastEndTime = -1; - for (ITmfStateInterval statusInterval : statusIntervals) { - if (monitor.isCanceled()) { - return null; - } - int status = statusInterval.getStateValue().unboxInt(); - long time = statusInterval.getStartTime(); - long duration = statusInterval.getEndTime() - time + 1; - if (!statusInterval.getStateValue().isNull()) { - if (lastEndTime != time && lastEndTime != -1) { - eventList.add(new TimeEvent(entry, lastEndTime, time - lastEndTime)); - } - eventList.add(new ResourcesEvent(entry, time, duration, status)); - lastEndTime = time + duration; - } else { - if (includeNull) { - eventList.add(new ResourcesEvent(entry, time, duration)); - } - } - } - } else if (entry.getType().equals(Type.IRQ)) { - List irqIntervals = ssq.queryHistoryRange(quark, startTime, endTime - 1, resolution); - eventList = new ArrayList(irqIntervals.size()); - long lastEndTime = -1; - boolean lastIsNull = true; - for (ITmfStateInterval irqInterval : irqIntervals) { - if (monitor.isCanceled()) { - return null; - } - long time = irqInterval.getStartTime(); - long duration = irqInterval.getEndTime() - time + 1; - if (!irqInterval.getStateValue().isNull()) { - int cpu = irqInterval.getStateValue().unboxInt(); - eventList.add(new ResourcesEvent(entry, time, duration, cpu)); - lastIsNull = false; - } else { - if (lastEndTime != time && lastEndTime != -1 && lastIsNull) { - eventList.add(new ResourcesEvent(entry, lastEndTime, time - lastEndTime, -1)); - } - if (includeNull) { - eventList.add(new ResourcesEvent(entry, time, duration)); - } - lastIsNull = true; - } - lastEndTime = time + duration; - } - } else if (entry.getType().equals(Type.SOFT_IRQ)) { - List softIrqIntervals = ssq.queryHistoryRange(quark, startTime, endTime - 1, resolution); - eventList = new ArrayList(softIrqIntervals.size()); - long lastEndTime = -1; - boolean lastIsNull = true; - for (ITmfStateInterval softIrqInterval : softIrqIntervals) { - if (monitor.isCanceled()) { - return null; - } - long time = softIrqInterval.getStartTime(); - long duration = softIrqInterval.getEndTime() - time + 1; - if (!softIrqInterval.getStateValue().isNull()) { - int cpu = softIrqInterval.getStateValue().unboxInt(); - eventList.add(new ResourcesEvent(entry, time, duration, cpu)); - } else { - if (lastEndTime != time && lastEndTime != -1 && lastIsNull) { - eventList.add(new ResourcesEvent(entry, lastEndTime, time - lastEndTime, -1)); - } - if (includeNull) { - eventList.add(new ResourcesEvent(entry, time, duration)); - } - lastIsNull = true; - } - lastEndTime = time + duration; - } - } - } catch (AttributeNotFoundException e) { - e.printStackTrace(); - } catch (TimeRangeException e) { - e.printStackTrace(); - } catch (StateValueTypeException e) { - e.printStackTrace(); - } - return eventList; - } - - private void refresh(final long windowRange) { - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - if (fTimeGraphViewer.getControl().isDisposed()) { - return; - } - ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]); - Arrays.sort(entries, new TraceEntryComparator()); - fTimeGraphViewer.setInput(entries); - fTimeGraphViewer.setTimeBounds(fStartTime, fEndTime); - - long endTime = fStartTime + windowRange; - - if (fEndTime < endTime) { - endTime = fEndTime; - } - fTimeGraphViewer.setStartFinishTime(fStartTime, endTime); - - startZoomThread(fStartTime, endTime); - } - }); - } - - - private void redraw() { - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - if (fTimeGraphViewer.getControl().isDisposed()) { - return; - } - fTimeGraphViewer.getControl().redraw(); - fTimeGraphViewer.getControl().update(); - } - }); - } - - private void startZoomThread(long startTime, long endTime) { - if (fZoomThread != null) { - fZoomThread.cancel(); - } - fZoomThread = new ZoomThread(startTime, endTime); - fZoomThread.start(); - } - - private void makeActions() { - fPreviousResourceAction = fTimeGraphViewer.getPreviousItemAction(); - fPreviousResourceAction.setText(Messages.ResourcesView_previousResourceActionNameText); - fPreviousResourceAction.setToolTipText(Messages.ResourcesView_previousResourceActionToolTipText); - fNextResourceAction = fTimeGraphViewer.getNextItemAction(); - fNextResourceAction.setText(Messages.ResourcesView_nextResourceActionNameText); - fNextResourceAction.setToolTipText(Messages.ResourcesView_previousResourceActionToolTipText); - } - - private void contributeToActionBars() { - IActionBars bars = getViewSite().getActionBars(); - fillLocalToolBar(bars.getToolBarManager()); - } - - private void fillLocalToolBar(IToolBarManager manager) { - manager.add(fTimeGraphViewer.getShowLegendAction()); - manager.add(new Separator()); - manager.add(fTimeGraphViewer.getResetScaleAction()); - manager.add(fTimeGraphViewer.getPreviousEventAction()); - manager.add(fTimeGraphViewer.getNextEventAction()); - manager.add(fPreviousResourceAction); - manager.add(fNextResourceAction); - manager.add(fTimeGraphViewer.getZoomInAction()); - manager.add(fTimeGraphViewer.getZoomOutAction()); - manager.add(new Separator()); - } -} +/******************************************************************************* + * Copyright (c) 2012, 2013 Ericsson, École Polytechnique de Montréal + * + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Patrick Tasse - Initial API and implementation + * Geneviève Bastien - Move code to provide base classes for time graph views + *******************************************************************************/ + +package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.linuxtools.internal.lttng2.kernel.core.Attributes; +import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages; +import org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources.ResourcesEntry.Type; +import org.eclipse.linuxtools.lttng2.kernel.core.trace.LttngKernelTrace; +import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException; +import org.eclipse.linuxtools.tmf.core.exceptions.StateSystemDisposedException; +import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException; +import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException; +import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval; +import org.eclipse.linuxtools.tmf.core.statesystem.ITmfStateSystem; +import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace; +import org.eclipse.linuxtools.tmf.ui.views.timegraph.AbstractTimeGraphView; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent; +import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeGraphEntry; + +/** + * Main implementation for the LTTng 2.0 kernel Resource view + * + * @author Patrick Tasse + */ +public class ResourcesView extends AbstractTimeGraphView { + + /** View ID. */ + public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.resources"; //$NON-NLS-1$ + + /** + * Default value for events with no other value. Since value in this case is + * often a CPU number, this constant should be <0 + */ + public static final int NO_VALUE_EVENT = -999; + + private static final String PROCESS_COLUMN = Messages.ControlFlowView_processColumn; + + private static final String[] COLUMN_NAMES = new String[] { + PROCESS_COLUMN + }; + + private static final String[] FILTER_COLUMN_NAMES = new String[] { + PROCESS_COLUMN + }; + + private static final int[] WEIGHTS = { 15, 85 }; + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + /** + * Default constructor + */ + public ResourcesView() { + super(ID, COLUMN_NAMES, FILTER_COLUMN_NAMES, new ResourcesPresentationProvider()); + setWeight(WEIGHTS); + } + + @Override + protected String getNextText() { + return Messages.ResourcesView_nextResourceActionNameText; + } + + @Override + protected String getNextTooltip() { + return Messages.ResourcesView_nextResourceActionToolTipText; + } + + @Override + protected String getPrevText() { + return Messages.ResourcesView_previousResourceActionNameText; + } + + @Override + protected String getPrevTooltip() { + return Messages.ResourcesView_previousResourceActionToolTipText; + } + + // ------------------------------------------------------------------------ + // Internal + // ------------------------------------------------------------------------ + + @Override + protected void buildEventList(ITmfTrace trace, IProgressMonitor monitor) { + setStartTime(Long.MAX_VALUE); + setEndTime(Long.MIN_VALUE); + + ArrayList entryList = new ArrayList(); + for (ITmfTrace aTrace : fTraceManager.getActiveTraceSet()) { + if (monitor.isCanceled()) { + return; + } + if (aTrace instanceof LttngKernelTrace) { + LttngKernelTrace lttngKernelTrace = (LttngKernelTrace) aTrace; + ITmfStateSystem ssq = lttngKernelTrace.getStateSystems().get(LttngKernelTrace.STATE_ID); + if (!ssq.waitUntilBuilt()) { + return; + } + long startTime = ssq.getStartTime(); + long endTime = ssq.getCurrentEndTime() + 1; + ResourcesEntry groupEntry = new ResourcesEntry(lttngKernelTrace, aTrace.getName(), startTime, endTime, 0); + entryList.add(groupEntry); + setStartTime(Math.min(getStartTime(), startTime)); + setEndTime(Math.max(getEndTime(), endTime)); + List cpuQuarks = ssq.getQuarks(Attributes.CPUS, "*"); //$NON-NLS-1$ + ResourcesEntry[] cpuEntries = new ResourcesEntry[cpuQuarks.size()]; + for (int i = 0; i < cpuQuarks.size(); i++) { + int cpuQuark = cpuQuarks.get(i); + int cpu = Integer.parseInt(ssq.getAttributeName(cpuQuark)); + ResourcesEntry entry = new ResourcesEntry(cpuQuark, lttngKernelTrace, getStartTime(), getEndTime(), Type.CPU, cpu); + groupEntry.addChild(entry); + cpuEntries[i] = entry; + } + List irqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.IRQS, "*"); //$NON-NLS-1$ + ResourcesEntry[] irqEntries = new ResourcesEntry[irqQuarks.size()]; + for (int i = 0; i < irqQuarks.size(); i++) { + int irqQuark = irqQuarks.get(i); + int irq = Integer.parseInt(ssq.getAttributeName(irqQuark)); + ResourcesEntry entry = new ResourcesEntry(irqQuark, lttngKernelTrace, getStartTime(), getEndTime(), Type.IRQ, irq); + groupEntry.addChild(entry); + irqEntries[i] = entry; + } + List softIrqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.SOFT_IRQS, "*"); //$NON-NLS-1$ + ResourcesEntry[] softIrqEntries = new ResourcesEntry[softIrqQuarks.size()]; + for (int i = 0; i < softIrqQuarks.size(); i++) { + int softIrqQuark = softIrqQuarks.get(i); + int softIrq = Integer.parseInt(ssq.getAttributeName(softIrqQuark)); + ResourcesEntry entry = new ResourcesEntry(softIrqQuark, lttngKernelTrace, getStartTime(), getEndTime(), Type.SOFT_IRQ, softIrq); + groupEntry.addChild(entry); + softIrqEntries[i] = entry; + } + } + } + putEntryList(trace, (ArrayList) entryList.clone()); + + if (trace.equals(getTrace())) { + refresh(); + } + for (ResourcesEntry traceEntry : entryList) { + if (monitor.isCanceled()) { + return; + } + LttngKernelTrace lttngKernelTrace = traceEntry.getTrace(); + ITmfStateSystem ssq = lttngKernelTrace.getStateSystems().get(LttngKernelTrace.STATE_ID); + long startTime = ssq.getStartTime(); + long endTime = ssq.getCurrentEndTime() + 1; + long resolution = (endTime - startTime) / getDisplayWidth(); + for (TimeGraphEntry entry : traceEntry.getChildren()) { + List eventList = getEventList(entry, startTime, endTime, resolution, monitor); + entry.setEventList(eventList); + redraw(); + } + } + } + + @Override + protected List getEventList(TimeGraphEntry entry, + long startTime, long endTime, long resolution, + IProgressMonitor monitor) { + ITmfStateSystem ssq = entry.getTrace().getStateSystems().get(LttngKernelTrace.STATE_ID); + final long realStart = Math.max(startTime, ssq.getStartTime()); + final long realEnd = Math.min(endTime, ssq.getCurrentEndTime() + 1); + if (realEnd <= realStart) { + return null; + } + List eventList = null; + + if (!(entry instanceof ResourcesEntry)) { + return eventList; + } + ResourcesEntry resourcesEntry = (ResourcesEntry) entry; + int quark = resourcesEntry.getQuark(); + + try { + if (resourcesEntry.getType().equals(Type.CPU)) { + int statusQuark = ssq.getQuarkRelative(quark, Attributes.STATUS); + List statusIntervals = ssq.queryHistoryRange(statusQuark, realStart, realEnd - 1, resolution, monitor); + eventList = new ArrayList(statusIntervals.size()); + long lastEndTime = -1; + for (ITmfStateInterval statusInterval : statusIntervals) { + if (monitor.isCanceled()) { + return null; + } + int status = statusInterval.getStateValue().unboxInt(); + long time = statusInterval.getStartTime(); + long duration = statusInterval.getEndTime() - time + 1; + if (!statusInterval.getStateValue().isNull()) { + if (lastEndTime != time && lastEndTime != -1) { + eventList.add(new TimeEvent(entry, lastEndTime, time - lastEndTime)); + } + eventList.add(new TimeEvent(entry, time, duration, status)); + lastEndTime = time + duration; + } else { + if (true) {// includeNull) { + eventList.add(new TimeEvent(entry, time, duration, NO_VALUE_EVENT)); + } + } + } + } else if (resourcesEntry.getType().equals(Type.IRQ)) { + List irqIntervals = ssq.queryHistoryRange(quark, realStart, realEnd - 1, resolution, monitor); + eventList = new ArrayList(irqIntervals.size()); + long lastEndTime = -1; + boolean lastIsNull = true; + for (ITmfStateInterval irqInterval : irqIntervals) { + if (monitor.isCanceled()) { + return null; + } + long time = irqInterval.getStartTime(); + long duration = irqInterval.getEndTime() - time + 1; + if (!irqInterval.getStateValue().isNull()) { + int cpu = irqInterval.getStateValue().unboxInt(); + eventList.add(new TimeEvent(entry, time, duration, cpu)); + lastIsNull = false; + } else { + if (lastEndTime != time && lastEndTime != -1 && lastIsNull) { + /* This is a special case where we want to show IRQ_ACTIVE state but we don't know the CPU (it is between two null samples) */ + eventList.add(new TimeEvent(entry, lastEndTime, time - lastEndTime, -1)); + } else { + eventList.add(new TimeEvent(entry, time, duration, NO_VALUE_EVENT)); + } + lastIsNull = true; + } + lastEndTime = time + duration; + } + } else if (resourcesEntry.getType().equals(Type.SOFT_IRQ)) { + List softIrqIntervals = ssq.queryHistoryRange(quark, realStart, realEnd - 1, resolution, monitor); + eventList = new ArrayList(softIrqIntervals.size()); + long lastEndTime = -1; + boolean lastIsNull = true; + for (ITmfStateInterval softIrqInterval : softIrqIntervals) { + if (monitor.isCanceled()) { + return null; + } + long time = softIrqInterval.getStartTime(); + long duration = softIrqInterval.getEndTime() - time + 1; + if (!softIrqInterval.getStateValue().isNull()) { + int cpu = softIrqInterval.getStateValue().unboxInt(); + eventList.add(new TimeEvent(entry, time, duration, cpu)); + } else { + if (lastEndTime != time && lastEndTime != -1 && lastIsNull) { + /* This is a special case where we want to show IRQ_ACTIVE state but we don't know the CPU (it is between two null samples) */ + eventList.add(new TimeEvent(entry, lastEndTime, time - lastEndTime, -1)); + } else { + eventList.add(new TimeEvent(entry, time, duration, NO_VALUE_EVENT)); + } + lastIsNull = true; + } + lastEndTime = time + duration; + } + } + + } catch (AttributeNotFoundException e) { + e.printStackTrace(); + } catch (TimeRangeException e) { + e.printStackTrace(); + } catch (StateValueTypeException e) { + e.printStackTrace(); + } catch (StateSystemDisposedException e) { + /* Ignored */ + } + return eventList; + } + +}