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/PathOpsThreadedCommon.h b/tests/PathOpsThreadedCommon.h
new file mode 100644
index 0000000..7f57a7b
--- /dev/null
+++ b/tests/PathOpsThreadedCommon.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#ifndef PathOpsThreadedCommon_DEFINED
+#define PathOpsThreadedCommon_DEFINED
+
+#include "SkCountdown.h"
+#include "SkRunnable.h"
+#include "SkTDArray.h"
+#include "SkThreadPool.h"
+
+#define PATH_STR_SIZE 512
+
+class PathOpsThreadedRunnable;
+class skiatest::Reporter;
+
+struct PathOpsThreadState {
+    unsigned char fA;
+    unsigned char fB;
+    unsigned char fC;
+    unsigned char fD;
+    char* fPathStr;
+    skiatest::Reporter* fReporter;
+    SkBitmap* fBitmap;
+};
+
+class PathOpsThreadedTestRunner {
+public:
+    PathOpsThreadedTestRunner(skiatest::Reporter* reporter, int threadCount)
+        : fNumThreads(threadCount)
+        , fThreadPool(threadCount)
+        , fCountdown(threadCount)
+        , fReporter(reporter) {
+    }
+
+    ~PathOpsThreadedTestRunner();
+
+    void render();
+
+public:
+    int fNumThreads;
+    SkTDArray<PathOpsThreadedRunnable*> fRunnables;
+    SkThreadPool fThreadPool;
+    SkCountdown fCountdown;
+    skiatest::Reporter* fReporter;
+};
+
+class PathOpsThreadedRunnable : public SkRunnable {
+public:
+    PathOpsThreadedRunnable(void (*testFun)(PathOpsThreadState*), int a, int b, int c, int d,
+            PathOpsThreadedTestRunner* runner) {
+        fState.fA = a;
+        fState.fB = b;
+        fState.fC = c;
+        fState.fD = d;
+        fState.fReporter = runner->fReporter;
+        fTestFun = testFun;
+        fDone = &runner->fCountdown;
+    }
+
+    virtual void run() SK_OVERRIDE {
+        SkBitmap bitmap;
+        fState.fBitmap = &bitmap;
+        char pathStr[PATH_STR_SIZE];
+        fState.fPathStr = pathStr;
+        (*fTestFun)(&fState);
+        fDone->run();
+    }
+
+private:
+    PathOpsThreadState fState;
+    void (*fTestFun)(PathOpsThreadState*);
+    SkRunnable* fDone;
+};
+
+#endif