Make parallel unit testing work on windows
Review URL: https://codereview.chromium.org/14072002

git-svn-id: http://skia.googlecode.com/svn/trunk@8594 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/PathOpsSimplifyRectThreadedTest.cpp b/tests/PathOpsSimplifyRectThreadedTest.cpp
index 13f327a..bd8023c 100644
--- a/tests/PathOpsSimplifyRectThreadedTest.cpp
+++ b/tests/PathOpsSimplifyRectThreadedTest.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 #include "PathOpsExtendedTest.h"
+#include "PathOpsThreadedCommon.h"
 
 // four rects, of four sizes
 // for 3 smaller sizes, tall, wide
@@ -13,194 +14,180 @@
 // not included, square, tall, wide (2 bits)
 // cw or ccw (1 bit)
 
-static THREAD_TYPE testSimplify4x4RectsMain(void* data)
+static void testSimplify4x4RectsMain(PathOpsThreadState* data)
 {
     SkASSERT(data);
-    State4& state = *(State4*) data;
+    PathOpsThreadState& state = *data;
     char pathStr[1024];  // gdb: set print elements 400
     sk_bzero(pathStr, sizeof(pathStr));
-    do {
-        int aShape = state.a & 0x03;
-        SkPath::Direction aCW = state.a >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction;
-        int bShape = state.b & 0x03;
-        SkPath::Direction bCW = state.b >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction;
-        int cShape = state.c & 0x03;
-        SkPath::Direction cCW = state.c >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction;
-        int dShape = state.d & 0x03;
-        SkPath::Direction dCW = state.d >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction;
-        for (int aXAlign = 0 ; aXAlign < 5; ++aXAlign) {
-        for (int aYAlign = 0 ; aYAlign < 5; ++aYAlign)      {
-        for (int bXAlign = 0 ; bXAlign < 5; ++bXAlign)          {
-        for (int bYAlign = 0 ; bYAlign < 5; ++bYAlign)              {
-        for (int cXAlign = 0 ; cXAlign < 5; ++cXAlign)                  {
-        for (int cYAlign = 0 ; cYAlign < 5; ++cYAlign)                      {
-        for (int dXAlign = 0 ; dXAlign < 5; ++dXAlign)                          {
-        for (int dYAlign = 0 ; dYAlign < 5; ++dYAlign)                              {
-            SkPath path, out;
-            char* str = pathStr;
-            path.setFillType(SkPath::kWinding_FillType);
-            int l, t, r, b;
-            if (aShape) {
-                switch (aShape) {
-                    case 1:  // square
-                        l =  0; r = 60;
-                        t =  0; b = 60;
-                        aXAlign = 5;
-                        aYAlign = 5;
-                        break;
-                    case 2:
-                        l =  aXAlign * 12;
-                        r =  l + 30;
-                        t =  0; b = 60;
-                        aYAlign = 5;
-                        break;
-                    case 3:
-                        l =  0; r = 60;
-                        t =  aYAlign * 12;
-                        b =  l + 30;
-                        aXAlign = 5;
-                        break;
-                }
-                path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b),
-                        aCW);
-                str += sprintf(str, "    path.addRect(%d, %d, %d, %d,"
-                        " SkPath::kC%sW_Direction);\n", l, t, r, b, aCW ? "C" : "");
-            } else {
-                aXAlign = 5;
-                aYAlign = 5;
+    int aShape = state.fA & 0x03;
+    SkPath::Direction aCW = state.fA >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction;
+    int bShape = state.fB & 0x03;
+    SkPath::Direction bCW = state.fB >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction;
+    int cShape = state.fC & 0x03;
+    SkPath::Direction cCW = state.fC >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction;
+    int dShape = state.fD & 0x03;
+    SkPath::Direction dCW = state.fD >> 2 ? SkPath::kCCW_Direction : SkPath::kCW_Direction;
+    for (int aXAlign = 0; aXAlign < 5; ++aXAlign) {
+        for (int aYAlign = 0; aYAlign < 5; ++aYAlign) {
+            for (int bXAlign = 0; bXAlign < 5; ++bXAlign) {
+                for (int bYAlign = 0; bYAlign < 5; ++bYAlign) {
+                    for (int cXAlign = 0; cXAlign < 5; ++cXAlign) {
+                         for (int cYAlign = 0; cYAlign < 5; ++cYAlign) {
+                            for (int dXAlign = 0; dXAlign < 5; ++dXAlign) {
+    for (int dYAlign = 0; dYAlign < 5; ++dYAlign) {
+        SkPath path, out;
+        char* str = pathStr;
+        path.setFillType(SkPath::kWinding_FillType);
+        int l, t, r, b;
+        if (aShape) {
+            switch (aShape) {
+                case 1:  // square
+                    l =  0; r = 60;
+                    t =  0; b = 60;
+                    aXAlign = 5;
+                    aYAlign = 5;
+                    break;
+                case 2:
+                    l =  aXAlign * 12;
+                    r =  l + 30;
+                    t =  0; b = 60;
+                    aYAlign = 5;
+                    break;
+                case 3:
+                    l =  0; r = 60;
+                    t =  aYAlign * 12;
+                    b =  l + 30;
+                    aXAlign = 5;
+                    break;
             }
-            if (bShape) {
-                switch (bShape) {
-                    case 1:  // square
-                        l =  bXAlign * 10;
-                        r =  l + 20;
-                        t =  bYAlign * 10;
-                        b =  l + 20;
-                        break;
-                    case 2:
-                        l =  bXAlign * 10;
-                        r =  l + 20;
-                        t =  10; b = 40;
-                        bYAlign = 5;
-                        break;
-                    case 3:
-                        l =  10; r = 40;
-                        t =  bYAlign * 10;
-                        b =  l + 20;
-                        bXAlign = 5;
-                        break;
-                }
-                path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b),
-                        bCW);
-                str += sprintf(str, "    path.addRect(%d, %d, %d, %d,"
-                        " SkPath::kC%sW_Direction);\n", l, t, r, b, bCW ? "C" : "");
-            } else {
-                bXAlign = 5;
-                bYAlign = 5;
+            path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b),
+                    aCW);
+            str += sprintf(str, "    path.addRect(%d, %d, %d, %d,"
+                    " SkPath::kC%sW_Direction);\n", l, t, r, b, aCW ? "C" : "");
+        } else {
+            aXAlign = 5;
+            aYAlign = 5;
+        }
+        if (bShape) {
+            switch (bShape) {
+                case 1:  // square
+                    l =  bXAlign * 10;
+                    r =  l + 20;
+                    t =  bYAlign * 10;
+                    b =  l + 20;
+                    break;
+                case 2:
+                    l =  bXAlign * 10;
+                    r =  l + 20;
+                    t =  10; b = 40;
+                    bYAlign = 5;
+                    break;
+                case 3:
+                    l =  10; r = 40;
+                    t =  bYAlign * 10;
+                    b =  l + 20;
+                    bXAlign = 5;
+                    break;
             }
-            if (cShape) {
-                switch (cShape) {
-                    case 1:  // square
-                        l =  cXAlign * 6;
-                        r =  l + 12;
-                        t =  cYAlign * 6;
-                        b =  l + 12;
-                        break;
-                    case 2:
-                        l =  cXAlign * 6;
-                        r =  l + 12;
-                        t =  20; b = 30;
-                        cYAlign = 5;
-                        break;
-                    case 3:
-                        l =  20; r = 30;
-                        t =  cYAlign * 6;
-                        b =  l + 20;
-                        cXAlign = 5;
-                        break;
-                }
-                path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b),
-                        cCW);
-                str += sprintf(str, "    path.addRect(%d, %d, %d, %d,"
-                        " SkPath::kC%sW_Direction);\n", l, t, r, b, cCW ? "C" : "");
-            } else {
-                cXAlign = 5;
-                cYAlign = 5;
+            path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b),
+                    bCW);
+            str += sprintf(str, "    path.addRect(%d, %d, %d, %d,"
+                    " SkPath::kC%sW_Direction);\n", l, t, r, b, bCW ? "C" : "");
+        } else {
+            bXAlign = 5;
+            bYAlign = 5;
+        }
+        if (cShape) {
+            switch (cShape) {
+                case 1:  // square
+                    l =  cXAlign * 6;
+                    r =  l + 12;
+                    t =  cYAlign * 6;
+                    b =  l + 12;
+                    break;
+                case 2:
+                    l =  cXAlign * 6;
+                    r =  l + 12;
+                    t =  20; b = 30;
+                    cYAlign = 5;
+                    break;
+                case 3:
+                    l =  20; r = 30;
+                    t =  cYAlign * 6;
+                    b =  l + 20;
+                    cXAlign = 5;
+                    break;
             }
-            if (dShape) {
-                switch (dShape) {
-                    case 1:  // square
-                        l =  dXAlign * 4;
-                        r =  l + 9;
-                        t =  dYAlign * 4;
-                        b =  l + 9;
-                        break;
-                    case 2:
-                        l =  dXAlign * 6;
-                        r =  l + 9;
-                        t =  32; b = 36;
-                        dYAlign = 5;
-                        break;
-                    case 3:
-                        l =  32; r = 36;
-                        t =  dYAlign * 6;
-                        b =  l + 9;
-                        dXAlign = 5;
-                        break;
-                }
-                path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b),
-                        dCW);
-                str += sprintf(str, "    path.addRect(%d, %d, %d, %d,"
-                        " SkPath::kC%sW_Direction);\n", l, t, r, b, dCW ? "C" : "");
-            } else {
-                dXAlign = 5;
-                dYAlign = 5;
+            path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b),
+                    cCW);
+            str += sprintf(str, "    path.addRect(%d, %d, %d, %d,"
+                    " SkPath::kC%sW_Direction);\n", l, t, r, b, cCW ? "C" : "");
+        } else {
+            cXAlign = 5;
+            cYAlign = 5;
+        }
+        if (dShape) {
+            switch (dShape) {
+                case 1:  // square
+                    l =  dXAlign * 4;
+                    r =  l + 9;
+                    t =  dYAlign * 4;
+                    b =  l + 9;
+                    break;
+                case 2:
+                    l =  dXAlign * 6;
+                    r =  l + 9;
+                    t =  32; b = 36;
+                    dYAlign = 5;
+                    break;
+                case 3:
+                    l =  32; r = 36;
+                    t =  dYAlign * 6;
+                    b =  l + 9;
+                    dXAlign = 5;
+                    break;
             }
-            path.close();
-            outputProgress(state, pathStr, SkPath::kWinding_FillType);
-            testSimplify(path, false, out, state, pathStr);
-            state.testsRun++;
-            outputProgress(state, pathStr, SkPath::kEvenOdd_FillType);
-            testSimplify(path, true, out, state, pathStr);
-            state.testsRun++;
-                                    }
-                                }
+            path.addRect(SkIntToScalar(l), SkIntToScalar(t), SkIntToScalar(r), SkIntToScalar(b),
+                    dCW);
+            str += sprintf(str, "    path.addRect(%d, %d, %d, %d,"
+                    " SkPath::kC%sW_Direction);\n", l, t, r, b, dCW ? "C" : "");
+        } else {
+            dXAlign = 5;
+            dYAlign = 5;
+        }
+        path.close();
+        outputProgress(state.fPathStr, pathStr, SkPath::kWinding_FillType);
+        testSimplify(path, false, out, state, pathStr);
+        outputProgress(state.fPathStr, pathStr, SkPath::kEvenOdd_FillType);
+        testSimplify(path, true, out, state, pathStr);
+    }
                             }
                         }
                     }
                 }
             }
         }
-    } while (runNextTestSet(state));
-    THREAD_RETURN
+    }
 }
 
 static void TestSimplifyRectsThreaded(skiatest::Reporter* reporter)
 {
-    int testsRun = 0;
-    if (gShowTestProgress) SkDebugf("%s\n", __FUNCTION__);
-#ifdef SK_DEBUG
-    gDebugMaxWindSum = 4;
-    gDebugMaxWindValue = 4;
-#endif
-    const char testLineStr[] = "testLine";
-    initializeTests(reporter, testLineStr, sizeof(testLineStr));
+    int threadCount = initializeTests("testLine");
+    PathOpsThreadedTestRunner testRunner(reporter, threadCount);
     for (int a = 0; a < 8; ++a) {  // outermost
         for (int b = a ; b < 8; ++b) {
             for (int c = b ; c < 8; ++c) {
                 for (int d = c; d < 8; ++d) {
-                    testsRun += dispatchTest4(testSimplify4x4RectsMain, a, b, c, d);
+                        *testRunner.fRunnables.append() = SkNEW_ARGS(PathOpsThreadedRunnable,
+                                (&testSimplify4x4RectsMain, a, b, c, d, &testRunner));
                 }
-                if (!gAllowExtendedTest) goto finish;
-                if (gShowTestProgress) SkDebugf(".");
+                if (!reporter->allowExtendedTest()) goto finish;
             }
-            if (gShowTestProgress) SkDebugf("%d", b);
         }
-        if (gShowTestProgress) SkDebugf("\n%d", a);
     }
 finish:
-    testsRun += waitForCompletion();
-    if (gShowTestProgress) SkDebugf("%s tests=%d\n", __FUNCTION__, testsRun);
+    testRunner.render();
 }
 
 #include "TestClassDef.h"