os.linux: Add per cpu thread 0 modeling
authorMichael Jeanson <mjeanson@efficios.com>
Tue, 22 Mar 2016 22:53:28 +0000 (18:53 -0400)
committerAlexandre Montplaisir <alexmonthy@efficios.com>
Tue, 29 Mar 2016 21:04:14 +0000 (17:04 -0400)
The current model handle thread 0 as a normal thread which is incorrect
since it is the idle or swapper thread and can be active concurently on
multiple CPUs.

This commit adds this concept to the state system and the control flow
view by using a special thread attribute name of "0_X" where X is the
CPU number.

Change-Id: I476927be378482751ee523fac77bbf4d260da54a
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Reviewed-on: https://git.eclipse.org/r/69089
Reviewed-by: Hudson CI
Reviewed-by: Alexandre Montplaisir <alexmonthy@efficios.com>
Tested-by: Alexandre Montplaisir <alexmonthy@efficios.com>
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
13 files changed:
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/kernel/Attributes.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/KernelStateProvider.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/handlers/KernelEventHandlerUtils.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/handlers/PiSetprioHandler.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/handlers/ProcessForkHandler.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/handlers/ProcessFreeHandler.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/handlers/SchedSwitchHandler.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/handlers/SchedWakeupHandler.java
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/handlers/StateDumpHandler.java
analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/views/controlflow/ControlFlowView.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core.tests/src/org/eclipse/tracecompass/lttng2/kernel/core/tests/analysis/kernel/statesystem/StateSystemTest.java
lttng/org.eclipse.tracecompass.lttng2.kernel.core.tests/src/org/eclipse/tracecompass/lttng2/kernel/core/tests/analysis/kernel/statesystem/TestValues.java
lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/ControlFlowViewTest.java

index 93c187bb8400455a21aafe3bf7f40ebce3cf2880..a73365fb6795d56f16572436600b3fdaf99ee515 100644 (file)
@@ -59,7 +59,7 @@ public class KernelStateProvider extends AbstractTmfStateProvider {
      * Version number of this state provider. Please bump this if you modify the
      * contents of the generated state history in some way.
      */
-    private static final int VERSION = 15;
+    private static final int VERSION = 16;
 
     // ------------------------------------------------------------------------
     // Fields
index a3a60d068fdf95b4a468459b008b57f55d9d36fd..83bad4b42f3ccd69a0c437e94806b418c835ef62 100644 (file)
@@ -23,6 +23,7 @@ import org.eclipse.tracecompass.statesystem.core.statevalue.TmfStateValue;
 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;
+import org.eclipse.tracecompass.tmf.core.util.Pair;
 
 /**
  * Kernel Event Handler Utils is a collection of static methods to be used in
@@ -99,7 +100,7 @@ public final class KernelEventHandlerUtils {
         int quark = ss.getQuarkRelativeAndAdd(getCurrentCPUNode(cpuNumber, ss), Attributes.CURRENT_THREAD);
         ITmfStateValue value = ss.queryOngoingState(quark);
         int thread = value.isNull() ? -1 : value.unboxInt();
-        return ss.getQuarkRelativeAndAdd(getNodeThreads(ss), String.valueOf(thread));
+        return ss.getQuarkRelativeAndAdd(getNodeThreads(ss), buildThreadAttributeName(thread, cpuNumber));
     }
 
     /**
@@ -279,4 +280,62 @@ public final class KernelEventHandlerUtils {
                 StateValues.CPU_STATUS_RUN_SYSCALL_VALUE);
     }
 
+    /**
+     * Build the thread attribute name.
+     *
+     * For all threads except "0" this is the string representation of the threadId.
+     * For thread "0" which is the idle thread and can be running concurrently on multiple
+     * CPUs, append "_cpuId".
+     *
+     * @param threadId
+     *              the thread id
+     * @param cpuId
+     *              the cpu id
+     *
+     * @return the thread attribute name
+     *         null if the threadId is zero and the cpuId is null
+     */
+    public static @Nullable String buildThreadAttributeName(int threadId, @Nullable Integer cpuId) {
+
+        if (threadId == 0) {
+            if (cpuId == null) {
+                return null;
+            }
+            return Attributes.THREAD_0_PREFIX + String.valueOf(cpuId);
+        }
+
+        return String.valueOf(threadId);
+    }
+
+    /**
+     * Parse the thread id and CPU id from the thread attribute name string
+     *
+     * For thread "0" the attribute name is in the form "threadId_cpuId", extract both
+     * values from the string.
+     *
+     * For all other threads, the attribute name is the string representation of the
+     * threadId and there is no cpuId.
+     *
+     * @param threadAttributeName
+     *              the thread attribute name
+     * @return the thread id and cpu id
+     */
+    public static Pair<Integer, Integer> parseThreadAttributeName(String threadAttributeName) {
+        Integer threadId = -1;
+        Integer cpuId = -1;
+
+        try {
+            if (threadAttributeName.startsWith(Attributes.THREAD_0_PREFIX)) {
+                threadId = 0;
+                String[] tokens = threadAttributeName.split(Attributes.THREAD_0_SEPARATOR);
+                cpuId = Integer.parseInt(tokens[1]);
+            } else {
+                threadId = Integer.parseInt(threadAttributeName);
+            }
+        } catch (NumberFormatException e1) {
+            //pass
+        }
+
+        return new Pair<>(threadId, cpuId);
+    }
 }
index 03235a32e56a902296b787f224189b9e961ddbbb..3e21f97e0b340dd316d3f4f4f5eb04939c0286a8 100644 (file)
@@ -37,10 +37,16 @@ public class PiSetprioHandler extends KernelEventHandler {
     @Override
     public void handleEvent(ITmfStateSystemBuilder ss, ITmfEvent event) throws AttributeNotFoundException {
         ITmfEventField content = event.getContent();
+        Integer cpu = KernelEventHandlerUtils.getCpu(event);
         Integer tid = ((Long) content.getField(getLayout().fieldTid()).getValue()).intValue();
         Integer prio = ((Long) content.getField(getLayout().fieldNewPrio()).getValue()).intValue();
 
-        Integer updateThreadNode = ss.getQuarkRelativeAndAdd(KernelEventHandlerUtils.getNodeThreads(ss), tid.toString());
+        String threadAttributeName = KernelEventHandlerUtils.buildThreadAttributeName(tid, cpu);
+        if (threadAttributeName == null) {
+            return;
+        }
+
+        Integer updateThreadNode = ss.getQuarkRelativeAndAdd(KernelEventHandlerUtils.getNodeThreads(ss), threadAttributeName);
 
         /* Set the current prio for the new process */
         int quark = ss.getQuarkRelativeAndAdd(updateThreadNode, Attributes.PRIO);
index c34b52fd2a9ee8b82d24451dd20aea89a5b2843b..a97de2a868bb3477271e224460de0a23183df5ee 100644 (file)
@@ -40,14 +40,26 @@ public class ProcessForkHandler extends KernelEventHandler {
     @Override
     public void handleEvent(ITmfStateSystemBuilder ss, ITmfEvent event) throws AttributeNotFoundException {
         ITmfEventField content = event.getContent();
+        Integer cpu = KernelEventHandlerUtils.getCpu(event);
         String childProcessName = (String) content.getField(getLayout().fieldChildComm()).getValue();
 
         Integer parentTid = ((Long) content.getField(getLayout().fieldParentTid()).getValue()).intValue();
         Integer childTid = ((Long) content.getField(getLayout().fieldChildTid()).getValue()).intValue();
 
+        String parentThreadAttributeName = KernelEventHandlerUtils.buildThreadAttributeName(parentTid, cpu);
+        if (parentThreadAttributeName == null) {
+            return;
+        }
+
+        String childThreadAttributeName = KernelEventHandlerUtils.buildThreadAttributeName(childTid, cpu);
+        if (childThreadAttributeName == null) {
+            return;
+        }
+
         final int threadsNode = KernelEventHandlerUtils.getNodeThreads(ss);
-        Integer parentTidNode = ss.getQuarkRelativeAndAdd(threadsNode, parentTid.toString());
-        Integer childTidNode = ss.getQuarkRelativeAndAdd(threadsNode, childTid.toString());
+        Integer parentTidNode = ss.getQuarkRelativeAndAdd(threadsNode, parentThreadAttributeName);
+        Integer childTidNode = ss.getQuarkRelativeAndAdd(threadsNode, childThreadAttributeName);
+
 
         /* Assign the PPID to the new process */
         int quark = ss.getQuarkRelativeAndAdd(childTidNode, Attributes.PPID);
index ec593e461637c6bcfc553bff28e8bbd92e07143e..7c3b4d4be911523da70c0061a8a9faca69122e9d 100644 (file)
@@ -35,11 +35,18 @@ public class ProcessFreeHandler extends KernelEventHandler {
     @Override
     public void handleEvent(ITmfStateSystemBuilder ss, ITmfEvent event) throws AttributeNotFoundException {
 
+        Integer cpu = KernelEventHandlerUtils.getCpu(event);
         Integer tid = ((Long) event.getContent().getField(getLayout().fieldTid()).getValue()).intValue();
+
+        String threadAttributeName = KernelEventHandlerUtils.buildThreadAttributeName(tid, cpu);
+        if (threadAttributeName == null) {
+            return;
+        }
+
         /*
          * Remove the process and all its sub-attributes from the current state
          */
-        int quark = ss.getQuarkRelativeAndAdd(KernelEventHandlerUtils.getNodeThreads(ss), tid.toString());
+        int quark = ss.getQuarkRelativeAndAdd(KernelEventHandlerUtils.getNodeThreads(ss), threadAttributeName);
         ss.removeAttribute(KernelEventHandlerUtils.getTimestamp(event), quark);
     }
 }
index f6054030d9b495d2c0212524b85e5791b8484cce..371a1cd6b19f4e8dfb967acaed99b2cf5bd97d48 100644 (file)
@@ -54,9 +54,13 @@ public class SchedSwitchHandler extends KernelEventHandler {
         Integer nextTid = ((Long) content.getField(getLayout().fieldNextTid()).getValue()).intValue();
         Integer nextPrio = ((Long) content.getField(getLayout().fieldNextPrio()).getValue()).intValue();
 
+        /* Will never return null since "cpu" is null checked */
+        String formerThreadAttributeName = KernelEventHandlerUtils.buildThreadAttributeName(prevTid, cpu);
+        String currenThreadAttributeName = KernelEventHandlerUtils.buildThreadAttributeName(nextTid, cpu);
+
         int nodeThreads = KernelEventHandlerUtils.getNodeThreads(ss);
-        int formerThreadNode = ss.getQuarkRelativeAndAdd(nodeThreads, prevTid.toString());
-        int newCurrentThreadNode = ss.getQuarkRelativeAndAdd(nodeThreads, nextTid.toString());
+        int formerThreadNode = ss.getQuarkRelativeAndAdd(nodeThreads, formerThreadAttributeName);
+        int newCurrentThreadNode = ss.getQuarkRelativeAndAdd(nodeThreads, currenThreadAttributeName);
 
         long timestamp = KernelEventHandlerUtils.getTimestamp(event);
         /* Set the status of the process that got scheduled out. */
index 73b88cb5b56caf2dbf88d8f9e8b3fb237bf77b15..a55dca5cfe2ee5592218942cabde81839f639766 100644 (file)
@@ -36,9 +36,16 @@ public class SchedWakeupHandler extends KernelEventHandler {
 
     @Override
     public void handleEvent(ITmfStateSystemBuilder ss, ITmfEvent event) throws AttributeNotFoundException {
+        Integer cpu = KernelEventHandlerUtils.getCpu(event);
         final int tid = ((Long) event.getContent().getField(getLayout().fieldTid()).getValue()).intValue();
         final int prio = ((Long) event.getContent().getField(getLayout().fieldPrio()).getValue()).intValue();
-        final int threadNode = ss.getQuarkRelativeAndAdd(KernelEventHandlerUtils.getNodeThreads(ss), String.valueOf(tid));
+
+        String threadAttributeName = KernelEventHandlerUtils.buildThreadAttributeName(tid, cpu);
+        if (threadAttributeName == null) {
+            return;
+        }
+
+        final int threadNode = ss.getQuarkRelativeAndAdd(KernelEventHandlerUtils.getNodeThreads(ss), threadAttributeName);
 
         /*
          * The process indicated in the event's payload is now ready to run.
index 758d5bba254ef9cf37e9f18cacf965ec2e8c430b..1d1d5640d6f9bdac6ac976d3835584f6cd90afe4 100644 (file)
@@ -43,6 +43,7 @@ public class StateDumpHandler extends KernelEventHandler {
     @Override
     public void handleEvent(ITmfStateSystemBuilder ss, ITmfEvent event) throws AttributeNotFoundException {
         ITmfEventField content = event.getContent();
+        Integer cpu = KernelEventHandlerUtils.getCpu(event);
         int tid = ((Long) content.getField("tid").getValue()).intValue(); //$NON-NLS-1$
         int pid = ((Long) content.getField("pid").getValue()).intValue(); //$NON-NLS-1$
         int ppid = ((Long) content.getField("ppid").getValue()).intValue(); //$NON-NLS-1$
@@ -53,7 +54,12 @@ public class StateDumpHandler extends KernelEventHandler {
          * with anything relevant for now.
          */
 
-        int curThreadNode = ss.getQuarkRelativeAndAdd(KernelEventHandlerUtils.getNodeThreads(ss), String.valueOf(tid));
+        String threadAttributeName = KernelEventHandlerUtils.buildThreadAttributeName(tid, cpu);
+        if (threadAttributeName == null) {
+            return;
+        }
+
+        int curThreadNode = ss.getQuarkRelativeAndAdd(KernelEventHandlerUtils.getNodeThreads(ss), threadAttributeName);
         long timestamp = KernelEventHandlerUtils.getTimestamp(event);
         /* Set the process' name */
         setProcessName(ss, name, curThreadNode, timestamp);
index e806bf9c74c6e32e3aefc72f4929ba2a306227a2..ce9a84318eb73701de6225541701cc6fd0d659c7 100644 (file)
@@ -37,6 +37,7 @@ import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernel.Attributes;
 import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelAnalysisModule;
+import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.KernelEventHandlerUtils;
 import org.eclipse.tracecompass.internal.analysis.os.linux.ui.Activator;
 import org.eclipse.tracecompass.internal.analysis.os.linux.ui.Messages;
 import org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions.FollowThreadAction;
@@ -51,6 +52,7 @@ import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
 import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
+import org.eclipse.tracecompass.tmf.core.util.Pair;
 import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractStateSystemTimeGraphView;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphCombo;
 import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ILinkEvent;
@@ -271,7 +273,8 @@ public class ControlFlowView extends AbstractStateSystemTimeGraphView {
         }
 
         final List<ControlFlowEntry> entryList = new ArrayList<>();
-        final Map<Integer, ControlFlowEntry> entryMap = new HashMap<>();
+        /** Map of view entries, key is a pair [threadId, cpuId] */
+        final Map<Pair<Integer, Integer>, ControlFlowEntry> entryMap = new HashMap<>();
 
         long start = ssq.getStartTime();
         setStartTime(Math.min(getStartTime(), start));
@@ -298,14 +301,12 @@ public class ControlFlowView extends AbstractStateSystemTimeGraphView {
                 @Override
                 public void handle(List<List<ITmfStateInterval>> fullStates, List<ITmfStateInterval> prevFullState) {
                     for (int threadQuark : threadQuarks) {
-                        String threadName = ssq.getAttributeName(threadQuark);
-                        int threadId = -1;
-                        try {
-                            threadId = Integer.parseInt(threadName);
-                        } catch (NumberFormatException e1) {
-                            continue;
-                        }
-                        if (threadId <= 0) { // ignore the 'unknown' (-1) and swapper (0) threads
+                        String threadAttributeName = ssq.getAttributeName(threadQuark);
+
+                        Pair<Integer, Integer> entryKey = KernelEventHandlerUtils.parseThreadAttributeName(threadAttributeName);
+                        int threadId = entryKey.getFirst();
+
+                        if (threadId < 0) { // ignore the 'unknown' (-1) thread
                             continue;
                         }
 
@@ -358,11 +359,11 @@ public class ControlFlowView extends AbstractStateSystemTimeGraphView {
                                     execNameInterval.getStateValue().getType() == ITmfStateValue.Type.STRING) {
                                 String execName = execNameInterval.getStateValue().unboxStr();
                                 int ppid = ppidInterval.getStateValue().unboxInt();
-                                ControlFlowEntry entry = entryMap.get(threadId);
+                                ControlFlowEntry entry = entryMap.get(entryKey);
                                 if (entry == null) {
                                     entry = new ControlFlowEntry(threadQuark, trace, execName, threadId, ppid, startTime, endTime);
                                     entryList.add(entry);
-                                    entryMap.put(threadId, entry);
+                                    entryMap.put(entryKey, entry);
                                 } else {
                                     /*
                                      * Update the name of the entry to the
@@ -375,7 +376,7 @@ public class ControlFlowView extends AbstractStateSystemTimeGraphView {
                                 }
                             }
                             if (isNull) {
-                                entryMap.remove(threadId);
+                                entryMap.remove(entryKey);
                             }
                             lastExecNameStartTime = startTime;
                             lastExecNameEndTime = endTime;
index 77aeeec2e5da3ec83ceb910eabd8021caf354934..2decf38a2b47140c59213fe6fec1b8d475996010 100644 (file)
@@ -396,7 +396,7 @@ public abstract class StateSystemTest {
         List<Integer> list = fixture.getQuarks(Attributes.THREADS, "*", Attributes.EXEC_NAME);
 
         /* Number of different kernel threads in the trace */
-        assertEquals(168, list.size());
+        assertEquals(169, list.size());
     }
 
     @Test
index a35725c2685669b17b69ab6a9d2fa05a1691474b..1253e07dc3780d361de1c5baafaa6b33253b52ec 100644 (file)
@@ -25,7 +25,7 @@ import org.eclipse.tracecompass.statesystem.core.statevalue.TmfStateValue;
  */
 interface TestValues {
 
-    int size = 1034;
+    int size = 1040;
 
     long[] startTimes = {
         1331668247314038062L,
@@ -55,10 +55,12 @@ interface TestValues {
         1331668247314038062L,
         1331668247314038062L,
         1331668247314038062L,
-        1331668248013353414L,
-        1331668248004935409L,
+        1331668248014145796L,
         1331668247314601653L,
+        1331668247314601653L,
+        1331668247314038062L,
         1331668247314038062L,
+        1331668248013353414L,
         1331668247314038062L,
         1331668248014184526L,
         1331668248014130616L,
@@ -100,6 +102,10 @@ interface TestValues {
         1331668247316925661L,
         1331668247314038062L,
         1331668247314038062L,
+        1331668247317063795L,
+        1331668247317063795L,
+        1331668247314038062L,
+        1331668247314038062L,
         1331668247999256178L,
         1331668247999239403L,
         1331668247999250697L,
@@ -1093,10 +1099,12 @@ interface TestValues {
         1331668259054285979L,
         1331668259054285979L,
         1331668248014620024L,
-        1331668248014620024L,
         1331668259054285979L,
         1331668259054285979L,
         1331668259054285979L,
+        1331668259054285979L,
+        1331668248015333196L,
+        1331668259054285979L,
         1331668248014548923L,
         1331668248014188534L,
         1331668259054285979L,
@@ -1137,6 +1145,10 @@ interface TestValues {
         1331668259054285979L,
         1331668259054285979L,
         1331668259054285979L,
+        1331668259054285979L,
+        1331668259054285979L,
+        1331668259054285979L,
+        1331668259054285979L,
         1331668248016556933L,
         1331668248016556933L,
         1331668248016592456L,
@@ -2130,10 +2142,12 @@ interface TestValues {
         TmfStateValue.nullValue(),
         TmfStateValue.nullValue(),
         TmfStateValue.newValueInt(5),
-        TmfStateValue.newValueString("swapper/1"),
+        TmfStateValue.newValueString("swapper/0"),
         TmfStateValue.newValueInt(20),
         TmfStateValue.nullValue(),
         TmfStateValue.nullValue(),
+        TmfStateValue.newValueInt(5),
+        TmfStateValue.nullValue(),
         TmfStateValue.newValueInt(1432),
         TmfStateValue.newValueInt(4),
         TmfStateValue.nullValue(),
@@ -2174,6 +2188,10 @@ interface TestValues {
         TmfStateValue.newValueString("lttng-sessiond"),
         TmfStateValue.nullValue(),
         TmfStateValue.nullValue(),
+        TmfStateValue.newValueString("swapper/1"),
+        TmfStateValue.newValueInt(20),
+        TmfStateValue.nullValue(),
+        TmfStateValue.nullValue(),
         TmfStateValue.newValueInt(1),
         TmfStateValue.newValueInt(20),
         TmfStateValue.newValueString("sys_futex"),
@@ -3137,4 +3155,4 @@ interface TestValues {
         TmfStateValue.nullValue(),
         TmfStateValue.nullValue(),
     };
-}
\ No newline at end of file
+}
index ba9e4e7c25d17e069200d545053eb8817013ddb3..af93327d180fab86e3fb255d73a10dca8a7e0c27 100644 (file)
@@ -253,7 +253,7 @@ public class ControlFlowViewTest extends KernelTestBase {
         TreeCheckedCounter treeCheckCounter = new TreeCheckedCounter(treeBot);
         // get how many items there are
         Integer checked = UIThreadRunnable.syncExec(treeCheckCounter);
-        assertEquals("default", 200, checked.intValue());
+        assertEquals("default", 225, checked.intValue());
         // test "uncheck all button"
         bot.button(UNCHECK_ALL).click();
         checked = UIThreadRunnable.syncExec(treeCheckCounter);
@@ -261,15 +261,15 @@ public class ControlFlowViewTest extends KernelTestBase {
         // test check active
         bot.button(CHECK_ACTIVE).click();
         checked = UIThreadRunnable.syncExec(treeCheckCounter);
-        assertEquals(CHECK_ACTIVE, 43, checked.intValue());
+        assertEquals(CHECK_ACTIVE, 68, checked.intValue());
         // test check all
         bot.button(CHECK_ALL).click();
         checked = UIThreadRunnable.syncExec(treeCheckCounter);
-        assertEquals(CHECK_ALL, 200, checked.intValue());
+        assertEquals(CHECK_ALL, 225, checked.intValue());
         // test uncheck inactive
         bot.button(UNCHECK_INACTIVE).click();
         checked = UIThreadRunnable.syncExec(treeCheckCounter);
-        assertEquals(UNCHECK_INACTIVE, 43, checked.intValue());
+        assertEquals(UNCHECK_INACTIVE, 68, checked.intValue());
         // test check selected
         treeBot.select(1);
         bot.button(UNCHECK_ALL).click();
@@ -285,12 +285,12 @@ public class ControlFlowViewTest extends KernelTestBase {
         bot.button(CHECK_ALL).click();
         bot.button(UNCHECK_SELECTED).click();
         checked = UIThreadRunnable.syncExec(treeCheckCounter);
-        assertEquals(UNCHECK_SELECTED, 199, checked.intValue());
+        assertEquals(UNCHECK_SELECTED, 224, checked.intValue());
         // test uncheck subtree
         bot.button(CHECK_ALL).click();
         bot.button(UNCHECK_SUBTREE).click();
         checked = UIThreadRunnable.syncExec(treeCheckCounter);
-        assertEquals(UNCHECK_SELECTED, 199, checked.intValue());
+        assertEquals(UNCHECK_SELECTED, 224, checked.intValue());
         // test filter
         bot.button(UNCHECK_ALL).click();
         checked = UIThreadRunnable.syncExec(treeCheckCounter);
This page took 0.034512 seconds and 5 git commands to generate.