lttng: Add arrows in Control Flow view
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng2.kernel.ui / src / org / eclipse / linuxtools / internal / lttng2 / kernel / ui / views / controlflow / ControlFlowView.java
index da4666f4b83391bb719f20c5da8815e320dcec6d..f9ba9dd809cb3e1133e9e1884ee755e897a11717 100644 (file)
@@ -19,7 +19,10 @@ import java.util.Comparator;
 import java.util.List;
 
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.linuxtools.internal.lttng2.kernel.core.Attributes;
+import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Activator;
 import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages;
 import org.eclipse.linuxtools.lttng2.kernel.core.trace.LttngKernelTrace;
 import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;
@@ -30,11 +33,14 @@ import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;
 import org.eclipse.linuxtools.tmf.core.statesystem.ITmfStateSystem;
 import org.eclipse.linuxtools.tmf.core.statevalue.ITmfStateValue;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
+import org.eclipse.linuxtools.tmf.core.trace.TmfTraceManager;
 import org.eclipse.linuxtools.tmf.ui.views.timegraph.AbstractTimeGraphView;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ILinkEvent;
 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.linuxtools.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeLinkEvent;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.Resolution;
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;
@@ -86,6 +92,17 @@ public class ControlFlowView extends AbstractTimeGraphView {
         setEntryComparator(new ControlFlowEntryComparator());
     }
 
+    @Override
+    protected void fillLocalToolBar(IToolBarManager manager) {
+        IDialogSettings settings = Activator.getDefault().getDialogSettings();
+        IDialogSettings section = settings.getSection(getClass().getName());
+        if (section == null) {
+            section = settings.addNewSection(getClass().getName());
+        }
+        manager.add(getTimeGraphCombo().getTimeGraphViewer().getHideArrowsAction(section));
+        super.fillLocalToolBar(manager);
+    }
+
     @Override
     protected String getNextText() {
         return Messages.ControlFlowView_nextProcessActionNameText;
@@ -424,4 +441,72 @@ public class ControlFlowView extends AbstractTimeGraphView {
             }
         }
     }
+
+    @Override
+    protected List<ILinkEvent> getLinkList(long startTime, long endTime, long resolution, IProgressMonitor monitor) {
+        List<ILinkEvent> list = new ArrayList<ILinkEvent>();
+        ITmfTrace[] traces = TmfTraceManager.getTraceSet(getTrace());
+        List<TimeGraphEntry> entryList = getEntryListMap().get(getTrace());
+        if (traces == null || entryList == null) {
+            return list;
+        }
+        for (ITmfTrace trace : traces) {
+            if (trace instanceof LttngKernelTrace) {
+                ITmfStateSystem ssq = trace.getStateSystems().get(LttngKernelTrace.STATE_ID);
+                try {
+                    long start = Math.max(startTime, ssq.getStartTime());
+                    long end = Math.min(endTime, ssq.getCurrentEndTime());
+                    if (end < start) {
+                        continue;
+                    }
+                    List<Integer> currentThreadQuarks = ssq.getQuarks(Attributes.CPUS, "*", Attributes.CURRENT_THREAD); //$NON-NLS-1$
+                    for (int currentThreadQuark : currentThreadQuarks) {
+                        List<ITmfStateInterval> currentThreadIntervals = ssq.queryHistoryRange(currentThreadQuark, start, end, resolution, monitor);
+                        int prevThread = 0;
+                        long prevEnd = 0;
+                        for (ITmfStateInterval currentThreadInterval : currentThreadIntervals) {
+                            if (monitor.isCanceled()) {
+                                return null;
+                            }
+                            long time = currentThreadInterval.getStartTime();
+                            int thread = currentThreadInterval.getStateValue().unboxInt();
+                            if (thread > 0 && prevThread > 0 && thread != prevThread && time == prevEnd) {
+                                ITimeGraphEntry prevEntry = findEntry(entryList, trace, prevThread);
+                                ITimeGraphEntry nextEntry = findEntry(entryList, trace, thread);
+                                list.add(new TimeLinkEvent(prevEntry, nextEntry, time, 0, 0));
+                            }
+                            prevThread = thread;
+                            prevEnd = currentThreadInterval.getEndTime() + 1;
+                        }
+                    }
+                } catch (TimeRangeException e) {
+                    e.printStackTrace();
+                } catch (AttributeNotFoundException e) {
+                    e.printStackTrace();
+                } catch (StateValueTypeException e) {
+                    e.printStackTrace();
+                } catch (StateSystemDisposedException e) {
+                    /* Ignored */
+                }
+            }
+        }
+        return list;
+    }
+
+    private ControlFlowEntry findEntry(List<TimeGraphEntry> entryList, ITmfTrace trace, int threadId) {
+        for (TimeGraphEntry entry : entryList) {
+            if (entry instanceof ControlFlowEntry) {
+                ControlFlowEntry controlFlowEntry = (ControlFlowEntry) entry;
+                if (controlFlowEntry.getThreadId() == threadId && controlFlowEntry.getTrace() == trace) {
+                    return controlFlowEntry;
+                } else if (entry.hasChildren()) {
+                    controlFlowEntry = findEntry(entry.getChildren(), trace, threadId);
+                    if (controlFlowEntry != null) {
+                        return controlFlowEntry;
+                    }
+                }
+            }
+        }
+        return null;
+    }
 }
This page took 0.027218 seconds and 5 git commands to generate.