Index: tests/skia_test.cpp |
diff --git a/tests/skia_test.cpp b/tests/skia_test.cpp |
index fd56cc71fbfb064917583c35441bf9fcd44f2284..6330b326a883a6cb26551ca4f985571c144410f7 100644 |
--- a/tests/skia_test.cpp |
+++ b/tests/skia_test.cpp |
@@ -7,6 +7,10 @@ |
#include "SkCommandLineFlags.h" |
#include "SkGraphics.h" |
+#include "SkRunnable.h" |
+#include "SkThreadPool.h" |
+#include "SkTArray.h" |
+#include "SkTemplates.h" |
#include "Test.h" |
#include "SkOSFile.h" |
@@ -63,14 +67,13 @@ static const char* result2string(Reporter::Result result) { |
class DebugfReporter : public Reporter { |
public: |
DebugfReporter(bool allowExtendedTest, bool allowThreaded) |
- : fIndex(0) |
+ : fNextIndex(0) |
, fTotal(0) |
, fAllowExtendedTest(allowExtendedTest) |
, fAllowThreaded(allowThreaded) { |
} |
- void setIndexOfTotal(int index, int total) { |
- fIndex = index; |
+ void setTotal(int total) { |
fTotal = total; |
} |
@@ -84,18 +87,22 @@ public: |
protected: |
virtual void onStart(Test* test) { |
- SkDebugf("[%d/%d] %s...\n", fIndex+1, fTotal, test->getName()); |
+ const int index = sk_atomic_inc(&fNextIndex); |
+ SkDebugf("[%d/%d] %s...\n", index+1, fTotal, test->getName()); |
} |
virtual void onReport(const char desc[], Reporter::Result result) { |
SkDebugf("\t%s: %s\n", result2string(result), desc); |
} |
- virtual void onEnd(Test*) { |
- if (!this->getCurrSuccess()) { |
- SkDebugf("---- FAILED\n"); |
+ |
+ virtual void onEnd(Test* test) { |
+ if (!test->passed()) { |
+ SkDebugf("---- FAILED\n"); |
} |
} |
+ |
private: |
- int fIndex, fTotal; |
+ int32_t fNextIndex; |
+ int fTotal; |
bool fAllowExtendedTest; |
bool fAllowThreaded; |
}; |
@@ -132,8 +139,29 @@ DEFINE_string2(match, m, NULL, "substring of test name to run."); |
DEFINE_string2(tmpDir, t, NULL, "tmp directory for tests to use."); |
DEFINE_string2(resourcePath, i, NULL, "directory for test resources."); |
DEFINE_bool2(extendedTest, x, false, "run extended tests for pathOps."); |
-DEFINE_bool2(threaded, z, false, "allow tests to use multiple threads."); |
+DEFINE_bool2(threaded, z, false, "allow tests to use multiple threads internally."); |
DEFINE_bool2(verbose, v, false, "enable verbose output."); |
+DEFINE_int32(threads, 8, |
+ "If >0, run threadsafe tests on a threadpool with this many threads."); |
+ |
+// Deletes self when run. |
+class SkTestRunnable : public SkRunnable { |
+public: |
+ // Takes ownership of test. |
+ SkTestRunnable(Test* test, int32_t* failCount) : fTest(test), fFailCount(failCount) {} |
+ |
+ virtual void run() { |
+ fTest->run(); |
+ if(!fTest->passed()) { |
+ sk_atomic_inc(fFailCount); |
+ } |
+ SkDELETE(this); |
+ } |
+ |
+private: |
+ SkAutoTDelete<Test> fTest; |
+ int32_t* fFailCount; |
+}; |
int tool_main(int argc, char** argv); |
int tool_main(int argc, char** argv) { |
@@ -179,28 +207,36 @@ int tool_main(int argc, char** argv) { |
DebugfReporter reporter(FLAGS_extendedTest, FLAGS_threaded); |
Iter iter(&reporter); |
- Test* test; |
const int count = Iter::Count(); |
- int index = 0; |
- int failCount = 0; |
+ reporter.setTotal(count); |
+ int32_t failCount = 0; |
int skipCount = 0; |
- while ((test = iter.next()) != NULL) { |
- reporter.setIndexOfTotal(index, count); |
+ |
+ SkAutoTDelete<SkThreadPool> threadpool(SkNEW_ARGS(SkThreadPool, (FLAGS_threads))); |
+ SkTArray<Test*> unsafeTests; // Always passes ownership to an SkTestRunnable |
+ for (int i = 0; i < count; i++) { |
+ SkAutoTDelete<Test> test(iter.next()); |
if (!FLAGS_match.isEmpty() && !strstr(test->getName(), FLAGS_match[0])) { |
++skipCount; |
+ } else if (!test->isThreadsafe()) { |
+ unsafeTests.push_back() = test.detach(); |
} else { |
- if (!test->run()) { |
- ++failCount; |
- } |
+ threadpool->add(SkNEW_ARGS(SkTestRunnable, (test.detach(), &failCount))); |
} |
- SkDELETE(test); |
- index += 1; |
} |
+ // Run the tests that aren't threadsafe. |
+ for (int i = 0; i < unsafeTests.count(); i++) { |
+ SkNEW_ARGS(SkTestRunnable, (unsafeTests[i], &failCount))->run(); |
+ } |
+ |
+ // Blocks until threaded tests finish. |
+ threadpool.free(); |
+ |
SkDebugf("Finished %d tests, %d failures, %d skipped.\n", |
count, failCount, skipCount); |
- int testCount = reporter.countTests(); |
+ const int testCount = reporter.countTests(); |
if (FLAGS_verbose && testCount > 0) { |
SkDebugf("Ran %d Internal tests.\n", testCount); |
} |