analysis: support sched_waking event
authorFrancis Giraldeau <francis.giraldeau@gmail.com>
Thu, 29 Oct 2015 14:15:23 +0000 (10:15 -0400)
committerFrancis Giraldeau <francis.giraldeau@gmail.com>
Tue, 24 Nov 2015 21:29:20 +0000 (16:29 -0500)
Use sched_waking event if available. This change is backward compatible
with previous instrumentation.

Change-Id: I28b07dc5cdfe988db8a1e11656eceac9856b1ae2
Signed-off-by: Francis Giraldeau <francis.giraldeau@gmail.com>
Reviewed-on: https://git.eclipse.org/r/59231
Reviewed-by: Hudson CI
Reviewed-by: Alexandre Montplaisir <alexmonthy@efficios.com>
analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/analysis/graph/core/base/TmfEdge.java
analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/internal/analysis/graph/core/criticalpath/CriticalPathAlgorithmBounded.java
analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathPresentationProvider.java
analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathView.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/building/LttngKernelExecGraphProvider.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/BaseHandler.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/EventContextHandler.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerExecutionGraph.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerSched.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerStatedump.java

index e777a887024b6110fbf350a2b7d5d78ff3a8dcd4..5c9f4be159a5ee03a91b7d4a2773c8e0004c37e0 100644 (file)
@@ -79,8 +79,9 @@ public class TmfEdge {
         /** Worker is waiting for user input */
         USER_INPUT,
         /** Block device */
-        BLOCK_DEVICE
-
+        BLOCK_DEVICE,
+        /** inter-processor interrupt */
+        IPI,
     }
 
     private EdgeType fType;
index 3649de80bfb5c7067d7e0353dad82ea1502b5395..ce5714b4cf38fd0437facff3b13b1bf65de90a22 100644 (file)
@@ -78,6 +78,7 @@ public class CriticalPathAlgorithmBounded extends AbstractCriticalPathAlgorithm
                 break;
             }
             switch (nextEdge.getType()) {
+            case IPI:
             case USER_INPUT:
             case BLOCK_DEVICE:
             case TIMER:
index 01d8dcba43c328940e8c8599e845a85389acd1c3..7c75c651711d516d71e8446fc1f199dd9b36eb13 100644 (file)
@@ -42,6 +42,8 @@ public class CriticalPathPresentationProvider extends TimeGraphPresentationProvi
         USER_INPUT      (new RGB(0x5a, 0x01, 0x01)),
         /** Worker is waiting on network */
         NETWORK         (new RGB(0xff, 0x9b, 0xff)),
+        /** Worker is waiting for an IPI */
+        IPI             (new RGB(0x66, 0x66, 0xcc)),
         /** Any other reason */
         UNKNOWN         (new RGB(0x40, 0x3b, 0x33));
 
@@ -92,6 +94,8 @@ public class CriticalPathPresentationProvider extends TimeGraphPresentationProvi
             return State.USER_INPUT;
         case 6:
             return State.NETWORK;
+        case 7:
+            return State.IPI;
         default:
             return State.UNKNOWN;
         }
index a067abc813e7d8c8390835f8af2e35a949926f0c..cbd7306149171025da4d5e0f4634004e86d67098 100644 (file)
@@ -458,6 +458,9 @@ public class CriticalPathView extends AbstractTimeGraphView {
         case USER_INPUT:
             state = State.USER_INPUT;
             break;
+        case IPI:
+            state = State.IPI;
+            break;
         case EPS:
         case UNKNOWN:
         case DEFAULT:
index 8ce57e09380999530a859dd12dfbc726f7398b26..0f0e87d903d6bd61d242f139b67522132872c681 100644 (file)
@@ -19,6 +19,7 @@ import org.eclipse.tracecompass.analysis.graph.core.base.TmfGraph;
 import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex;
 import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex.EdgeDirection;
 import org.eclipse.tracecompass.analysis.graph.core.building.AbstractTmfGraphProvider;
+import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers.EventContextHandler;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers.TraceEventHandlerExecutionGraph;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers.TraceEventHandlerSched;
@@ -51,7 +52,6 @@ import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
  */
 public class LttngKernelExecGraphProvider extends AbstractTmfGraphProvider {
 
-    private final LttngEventLayout fEventLayout;
     private final LttngSystemModel fSystem;
 
     /**
@@ -65,7 +65,9 @@ public class LttngKernelExecGraphProvider extends AbstractTmfGraphProvider {
         /** The interrupt is an IRQ */
         IRQ,
         /** The interrupt is a timer */
-        HRTIMER
+        HRTIMER,
+        /** The inter-processor interrupt */
+        IPI,
     }
 
     /**
@@ -125,18 +127,6 @@ public class LttngKernelExecGraphProvider extends AbstractTmfGraphProvider {
         super(trace, "LTTng Kernel"); //$NON-NLS-1$
         fSystem = new LttngSystemModel();
 
-        /*
-         * TODO: factorize this code because it is duplicated everywhere to
-         * access layout
-         */
-        if (trace instanceof LttngKernelTrace) {
-
-            fEventLayout = (LttngEventLayout) ((LttngKernelTrace) trace).getKernelEventLayout();
-        } else {
-            /* Fall-back to the base LttngEventLayout */
-            fEventLayout = (LttngEventLayout) LttngEventLayout.getInstance();
-        }
-
         registerHandler(new TraceEventHandlerStatedump(this));
         registerHandler(new TraceEventHandlerSched(this));
         registerHandler(new EventContextHandler(this));
@@ -193,12 +183,18 @@ public class LttngKernelExecGraphProvider extends AbstractTmfGraphProvider {
     }
 
     /**
-     * Returns the event layout for the current trace
+     * Returns the event layout for the given trace
+     *
+     * @param trace
+     *            the trace
      *
      * @return the eventLayout
      */
-    public LttngEventLayout getEventLayout() {
-        return fEventLayout;
+    public IKernelAnalysisEventLayout getEventLayout(ITmfTrace trace) {
+        if (trace instanceof LttngKernelTrace) {
+            return ((LttngKernelTrace) trace).getKernelEventLayout();
+        }
+        return LttngEventLayout.getInstance();
     }
 
     /**
index 460392d112fc017e70809f1014966eb754cefa36..f0d6ef964d6de35c0da174d00adbaa8d2b24d383 100644 (file)
@@ -15,7 +15,11 @@ import java.util.Map;
 import java.util.Set;
 
 import org.eclipse.tracecompass.analysis.graph.core.building.AbstractTraceEventHandler;
+import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
+import org.eclipse.tracecompass.common.core.NonNullUtils;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider;
+import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.Lttng27EventLayout;
+import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.Lttng28EventLayout;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEventType;
@@ -33,20 +37,63 @@ import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
 public class BaseHandler extends AbstractTraceEventHandler {
 
     private final LttngKernelExecGraphProvider fProvider;
-    private Map<ITmfTrace, Boolean> fHasEventSchedTTWU;
+
+    /**
+     * The fWakeupEventMap is populated with the prefered wake-up event for a
+     * given trace. Here is the possible values for LTTng, that are in priority
+     * order:
+     *
+     * <pre>
+     * - linux all versions and lttng all versions: sched_ttwu
+     * - linux >= 4.3 and lttng >= 2.8: sched_waking + sched_wakeup_new
+     * - linux < 3.8.0: sched_wakeup + sched_wakeup_new
+     * </pre>
+     *
+     * The acronym ttwu stands for "Try To Wake Up". The sched_ttwu requires
+     * lttng-modules addons and works with all versions of linux and LTTng. This
+     * event alone is sufficient, because it a placeholder for both sched_wakeup
+     * and sched_wakeup_new. The event sched_wakeup_new is a special case, and
+     * is emitted when a process is created and is scheduled for the first time.
+     * Therefore, we use in priority sched_ttwu if available, then sched_waking
+     * and as a last resort, we use sched_wakup, but this last option will work
+     * only for older kernels.
+     *
+     * If the trace has more than one type of wake-up event enabled, we ensure
+     * that only one type will be processed.
+     */
+    private Map<ITmfTrace, String> fWakeupEventMap;
 
     BaseHandler(LttngKernelExecGraphProvider provider) {
         fProvider = provider;
-        fHasEventSchedTTWU = new HashMap<>();
+        fWakeupEventMap = new HashMap<>();
         ITmfTrace trace = getProvider().getTrace();
-        LttngEventLayout layout = getProvider().getEventLayout();
         Collection<ITmfTrace> traceSet = TmfTraceManager.getTraceSet(trace);
         for (ITmfTrace traceItem : traceSet) {
+            IKernelAnalysisEventLayout layout = getProvider().getEventLayout(traceItem);
             if (traceItem instanceof ITmfTraceWithPreDefinedEvents) {
                 Set<? extends ITmfEventType> content = ((ITmfTraceWithPreDefinedEvents) traceItem).getContainedEventTypes();
                 Set<String> traceEvents = TmfEventTypeCollectionHelper.getEventNames(content);
-                boolean hasEvent = traceEvents.contains(layout.eventSchedProcessTTWU());
-                fHasEventSchedTTWU.put(traceItem, hasEvent);
+
+                /* default wake-up event */
+                String wakeupEvent = layout.eventSchedProcessWakeup();
+
+                /*
+                 * FIXME: downcast in the client should be avoided
+                 */
+                if (layout instanceof LttngEventLayout) {
+                    LttngEventLayout lttngLayout = (LttngEventLayout) layout;
+                    if (traceEvents.contains(lttngLayout.eventSchedProcessTTWU())) {
+                        /* use sched_ttwu if available */
+                        wakeupEvent = lttngLayout.eventSchedProcessTTWU();
+                    } else if (layout instanceof Lttng28EventLayout) {
+                        /* use sched_waking if available */
+                        Lttng28EventLayout layout28 = (Lttng28EventLayout) layout;
+                        if (traceEvents.contains(layout28.eventSchedProcessWaking())) {
+                            wakeupEvent = layout28.eventSchedProcessWaking();
+                        }
+                    }
+                }
+                fWakeupEventMap.put(traceItem, wakeupEvent);
             }
         }
     }
@@ -57,22 +104,85 @@ public class BaseHandler extends AbstractTraceEventHandler {
      * @return the graph provider
      */
     public LttngKernelExecGraphProvider getProvider() {
-        return fProvider;
+        return NonNullUtils.checkNotNull(fProvider);
     }
 
     /**
-     * Return if the trace has the try to wake-up event
+     * Return if this event is a wake-up event for this trace
      *
-     * @param trace
+     * @param event
      *            the trace to check
-     * @return if the trace has the try to wake-up event
+     * @return true if this is a wake-up event to process, false otherwise
+     */
+    public boolean isWakeupEvent(ITmfEvent event) {
+        String eventName = event.getName();
+        ITmfTrace trace = event.getTrace();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
+        String wakeupEventName = NonNullUtils.nullToEmptyString(fWakeupEventMap.get(trace));
+
+        /* First, check if sched_ttwu is the current wake-up event for this trace */
+        if (eventLayout instanceof LttngEventLayout) {
+            LttngEventLayout layoutDefault = (LttngEventLayout) eventLayout;
+            if (wakeupEventName.equals(layoutDefault.eventSchedProcessTTWU())) {
+                return eventName.equals(layoutDefault.eventSchedProcessTTWU());
+            }
+        }
+
+        /* Fall back to built-in sched_waking and sched_wakeup_new */
+        if (eventLayout instanceof Lttng28EventLayout) {
+            Lttng28EventLayout layout28 = (Lttng28EventLayout) eventLayout;
+            if (wakeupEventName.equals(layout28.eventSchedProcessWaking())) {
+                return (eventName.equals(layout28.eventSchedProcessWaking()) ||
+                        eventName.equals(layout28.eventSchedProcessWakeupNew()));
+            }
+        }
+
+        /* Legacy support using built-in sched_wakeup and sched_wakeup_new */
+        if (eventLayout instanceof LttngEventLayout) {
+            LttngEventLayout layoutDefault = (LttngEventLayout) eventLayout;
+            if (wakeupEventName.equals(layoutDefault.eventSchedProcessWakeup())) {
+                return (eventName.equals(layoutDefault.eventSchedProcessWakeup()) ||
+                        eventName.equals(layoutDefault.eventSchedProcessWakeupNew()));
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Return true if this event is an IPI entry
+     *
+     * @param event
+     *            the event
+     * @return true of this is an IPI entry, false otherwise
      */
-    public boolean traceHasEventSchedTTWU(ITmfTrace trace) {
-        Boolean ret = fHasEventSchedTTWU.get(trace);
-        if (ret == null) {
-            return false;
+    public boolean isIpiEntry(ITmfEvent event) {
+        return layoutContainsEvent(event, true);
+    }
+
+    /**
+     * Return true if this event is an IPI exit
+     *
+     * @param event
+     *            the event
+     * @return true of this is an IPI exit, false otherwise
+     */
+    public boolean isIpiExit(ITmfEvent event) {
+        return layoutContainsEvent(event, false);
+    }
+
+    private boolean layoutContainsEvent(ITmfEvent event, boolean entry) {
+        String eventName = event.getName();
+        ITmfTrace trace = event.getTrace();
+        IKernelAnalysisEventLayout layout = getProvider().getEventLayout(trace);
+        /* awkward downcast */
+        if (layout instanceof Lttng27EventLayout) {
+            Lttng27EventLayout layout27 = (Lttng27EventLayout) layout;
+            if (entry) {
+                return layout27.getX86IrqVectorsEntry().contains(eventName);
+            }
+            return layout27.getX86IrqVectorsExit().contains(eventName);
         }
-        return ret;
+        return false;
     }
 
     @Override
index d742dcae5706718353b88474e5187ec4e75ad516..e6239b3558fc88f535c85e6d7c66ee965cb6d392 100644 (file)
@@ -40,7 +40,7 @@ public class EventContextHandler extends BaseHandler {
     @Override
     public void handleEvent(ITmfEvent event) {
         String eventName = event.getName();
-        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         if (eventName.equals(eventLayout.eventSoftIrqEntry())) {
             handleSoftirqEntry(event);
         } else if (eventName.equals(eventLayout.eventSoftIrqExit())) {
@@ -53,6 +53,10 @@ public class EventContextHandler extends BaseHandler {
             handleIrqHandlerEntry(event);
         } else if (eventName.equals(eventLayout.eventIrqHandlerExit())) {
             handleIrqHandlerExit(event);
+        } else if (isIpiEntry(event)) {
+            handleIpiEntry(event);
+        } else if (isIpiExit(event)) {
+            handleIpiExit(event);
         }
     }
 
@@ -100,4 +104,12 @@ public class EventContextHandler extends BaseHandler {
         popInterruptContext(event, Context.HRTIMER);
     }
 
+    private void handleIpiEntry(ITmfEvent event) {
+        pushInterruptContext(event, Context.IPI);
+    }
+
+    private void handleIpiExit(ITmfEvent event) {
+        popInterruptContext(event, Context.IPI);
+    }
+
 }
index bda64f932a58d1f0becc2b613335dcf9302ddee8..d72c238ff81e2cfce3b77ded4327c7d0bffbe36d 100644 (file)
@@ -23,6 +23,7 @@ import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex;
 import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex.EdgeDirection;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernelanalysis.LinuxValues;
 import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
+import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
 import org.eclipse.tracecompass.common.core.NonNullUtils;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.TcpEventStrings;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider;
@@ -32,7 +33,6 @@ import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngInterruptContext;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker;
-import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCpuAspect;
 import org.eclipse.tracecompass.tmf.core.event.matching.IMatchProcessingUnit;
@@ -128,22 +128,10 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
     @Override
     public void handleEvent(ITmfEvent ev) {
         String eventName = ev.getName();
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(ev.getTrace());
 
         if (eventName.equals(eventLayout.eventSchedSwitch())) {
             handleSchedSwitch(ev);
-        } else if (eventName.equals(eventLayout.eventSchedProcessTTWU())) {
-            if (traceHasEventSchedTTWU(ev.getTrace())) {
-                handleSchedWakeup(ev);
-            }
-        } else if (eventName.equals(eventLayout.eventSchedProcessWakeup())) {
-            if (!traceHasEventSchedTTWU(ev.getTrace())) {
-                handleSchedWakeup(ev);
-            }
-        } else if (eventName.equals(eventLayout.eventSchedProcessWakeupNew())) {
-            if (!traceHasEventSchedTTWU(ev.getTrace())) {
-                handleSchedWakeup(ev);
-            }
         } else if (eventName.equals(eventLayout.eventSoftIrqEntry())) {
             handleSoftirqEntry(ev);
         } else if (eventName.equals(TcpEventStrings.INET_SOCK_LOCAL_IN) ||
@@ -152,6 +140,8 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
         } else if (eventName.equals(TcpEventStrings.INET_SOCK_LOCAL_OUT) ||
                 eventName.equals(TcpEventStrings.NET_DEV_QUEUE)) {
             handleInetSockLocalOut(ev);
+        } else if (isWakeupEvent(ev)) {
+            handleSchedWakeup(ev);
         }
     }
 
@@ -202,7 +192,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
     private void handleSchedSwitch(ITmfEvent event) {
         String host = event.getTrace().getHostId();
         long ts = event.getTimestamp().getValue();
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         LttngSystemModel system = getProvider().getSystem();
 
         Integer next = EventField.getInt(event, eventLayout.fieldNextTid());
@@ -222,7 +212,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
         TmfGraph graph = NonNullUtils.checkNotNull(getProvider().getAssignedGraph());
         String host = event.getTrace().getHostId();
         Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         LttngSystemModel system = getProvider().getSystem();
 
         long ts = event.getTimestamp().getValue();
@@ -254,7 +244,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
         }
     }
 
-    private void waitBlocked(ITmfEvent event, TmfGraph graph, String host, Integer cpu, LttngEventLayout eventLayout, LttngSystemModel system, long ts, LttngWorker target, @Nullable LttngWorker current) {
+    private void waitBlocked(ITmfEvent event, TmfGraph graph, String host, Integer cpu, IKernelAnalysisEventLayout eventLayout, LttngSystemModel system, long ts, LttngWorker target, @Nullable LttngWorker current) {
         LttngInterruptContext context = system.peekContextStack(host, cpu);
         switch (context.getContext()) {
         case HRTIMER:
@@ -267,6 +257,9 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
         case SOFTIRQ:
             softIrq(event, graph, cpu, eventLayout, ts, target, context);
             break;
+        case IPI:
+            graph.append(target, new TmfVertex(ts), EdgeType.IPI);
+            break;
         case NONE:
             none(ts, target, current);
             break;
@@ -275,7 +268,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
         }
     }
 
-    private void softIrq(ITmfEvent event, TmfGraph graph, Integer cpu, LttngEventLayout eventLayout, long ts, LttngWorker target, LttngInterruptContext context) {
+    private void softIrq(ITmfEvent event, TmfGraph graph, Integer cpu, IKernelAnalysisEventLayout eventLayout, long ts, LttngWorker target, LttngInterruptContext context) {
         TmfVertex wup = new TmfVertex(ts);
         TmfEdge l2 = graph.append(target, wup);
         if (l2 != null) {
@@ -306,7 +299,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
         }
     }
 
-    private static void irq(TmfGraph graph, LttngEventLayout eventLayout, long ts, LttngWorker target, LttngInterruptContext context) {
+    private static void irq(TmfGraph graph, IKernelAnalysisEventLayout eventLayout, long ts, LttngWorker target, LttngInterruptContext context) {
         TmfEdge link = graph.append(target, new TmfVertex(ts));
         if (link != null) {
             int vec = EventField.getLong(context.getEvent(), eventLayout.fieldIrq()).intValue();
@@ -402,7 +395,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler {
     }
 
     private void handleSoftirqEntry(ITmfEvent event) {
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         TmfGraph graph = NonNullUtils.checkNotNull(getProvider().getAssignedGraph());
         Long vec = EventField.getLong(event, eventLayout.fieldVec());
         if (vec == LinuxValues.SOFTIRQ_NET_RX || vec == LinuxValues.SOFTIRQ_NET_TX) {
index 96b5a06882a9ee938265dde73f29a2d82bc26cfb..d14bf52eee1bfa612f39ef60d03563291c2be462 100644 (file)
@@ -11,13 +11,13 @@ package org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.hand
 
 import org.eclipse.tracecompass.analysis.os.linux.core.kernelanalysis.LinuxValues;
 import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
+import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
 import org.eclipse.tracecompass.common.core.NonNullUtils;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider.ProcessStatus;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.EventField;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker;
-import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCpuAspect;
 import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
@@ -43,34 +43,24 @@ public class TraceEventHandlerSched extends BaseHandler {
     @Override
     public void handleEvent(ITmfEvent ev) {
         String eventName = ev.getName();
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(ev.getTrace());
 
         if (eventName.equals(eventLayout.eventSchedSwitch())) {
             handleSchedSwitch(ev);
-        } else if (eventName.equals(eventLayout.eventSchedProcessTTWU())) {
-            if (traceHasEventSchedTTWU(ev.getTrace())) {
-                handleSchedWakeup(ev);
-            }
-        } else if (eventName.equals(eventLayout.eventSchedProcessWakeup())) {
-            if (!traceHasEventSchedTTWU(ev.getTrace())) {
-                handleSchedWakeup(ev);
-            }
-        } else if (eventName.equals(eventLayout.eventSchedProcessWakeupNew())) {
-            if (!traceHasEventSchedTTWU(ev.getTrace())) {
-                handleSchedWakeup(ev);
-            }
         } else if (eventName.equals(eventLayout.eventSchedProcessFork())) {
             handleSchedProcessFork(ev);
         } else if (eventName.equals(eventLayout.eventSchedProcessExit())) {
             handleSchedProcessExit(ev);
         } else if (eventName.equals(eventLayout.eventSchedProcessExec())) {
             handleSchedProcessExec(ev);
+        } else if (isWakeupEvent(ev)) {
+            handleSchedWakeup(ev);
         }
     }
 
     private void handleSchedSwitch(ITmfEvent event) {
         Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         LttngSystemModel system = getProvider().getSystem();
 
         Integer next = EventField.getInt(event, eventLayout.fieldNextTid());
@@ -108,7 +98,7 @@ public class TraceEventHandlerSched extends BaseHandler {
 
     private void handleSchedProcessFork(ITmfEvent event) {
         String host = event.getTrace().getHostId();
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         LttngSystemModel system = getProvider().getSystem();
 
         Integer childTid = EventField.getInt(event, eventLayout.fieldChildTid());
@@ -129,7 +119,7 @@ public class TraceEventHandlerSched extends BaseHandler {
     private void handleSchedWakeup(ITmfEvent event) {
         String host = event.getTrace().getHostId();
         Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         LttngSystemModel system = getProvider().getSystem();
 
         Integer tid = EventField.getInt(event, eventLayout.fieldTid());
@@ -137,6 +127,7 @@ public class TraceEventHandlerSched extends BaseHandler {
 
         LttngWorker target = system.findWorker(targetHt);
         LttngWorker current = system.getWorkerOnCpu(host, cpu);
+
         if (target == null) {
             String name = EventField.getOrDefault(event, eventLayout.fieldComm(), NonNullUtils.checkNotNull(Messages.TraceEventHandlerSched_UnknownThreadName));
             target = new LttngWorker(targetHt, name, event.getTimestamp().getValue());
@@ -159,7 +150,7 @@ public class TraceEventHandlerSched extends BaseHandler {
 
     private void handleSchedProcessExit(ITmfEvent event) {
         String host = event.getTrace().getHostId();
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         LttngSystemModel system = getProvider().getSystem();
 
         Integer tid = EventField.getInt(event, eventLayout.fieldTid());
@@ -173,7 +164,7 @@ public class TraceEventHandlerSched extends BaseHandler {
     private void handleSchedProcessExec(ITmfEvent event) {
         String host = event.getTrace().getHostId();
         Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         LttngSystemModel system = getProvider().getSystem();
 
         String filename = EventField.getString(event, eventLayout.fieldFilename());
index 0c17d0cbd73f4f6985eed09809dbca60be482f59..226aa200d6dcf314b7b74a23b088788de075bcf9 100644 (file)
 package org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers;
 
 import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
+import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider.ProcessStatus;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.EventField;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker;
-import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout;
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 
 /**
@@ -38,7 +38,7 @@ public class TraceEventHandlerStatedump extends BaseHandler {
 
     @Override
     public void handleEvent(ITmfEvent event) {
-        LttngEventLayout eventLayout = getProvider().getEventLayout();
+        IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
         LttngSystemModel system = getProvider().getSystem();
         String eventName = event.getName();
         if (!eventName.equals(eventLayout.eventStatedumpProcessState())) {
This page took 0.036317 seconds and 5 git commands to generate.