Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Unified Diff: tools/skpdiff/SkDiffContext.cpp

Issue 27541003: add initial support ofr multi-threaded execution (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/skpdiff/SkDiffContext.h ('k') | tools/skpdiff/skpdiff_main.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/skpdiff/SkDiffContext.cpp
diff --git a/tools/skpdiff/SkDiffContext.cpp b/tools/skpdiff/SkDiffContext.cpp
index 88941cab0f2e207ca074e18f4f9259a6faabab01..07d304b64cb2e0fac003848c8cfa1e7d2bb80fed 100644
--- a/tools/skpdiff/SkDiffContext.cpp
+++ b/tools/skpdiff/SkDiffContext.cpp
@@ -8,8 +8,10 @@
#include "SkBitmap.h"
#include "SkImageDecoder.h"
#include "SkOSFile.h"
+#include "SkRunnable.h"
#include "SkStream.h"
#include "SkTDict.h"
+#include "SkThreadPool.h"
#include "SkDiffContext.h"
#include "SkImageDiffer.h"
@@ -22,6 +24,7 @@ SkDiffContext::SkDiffContext() {
fRecords = NULL;
fDiffers = NULL;
fDifferCount = 0;
+ fThreadCount = SkThreadPool::kThreadPerCore;
}
SkDiffContext::~SkDiffContext() {
@@ -93,8 +96,29 @@ void SkDiffContext::addDiff(const char* baselinePath, const char* testPath) {
differ->deleteDiff(diffID);
}
}
+
+ // if we get a difference and we want the alpha mask then compute it here.
}
+class SkThreadedDiff : public SkRunnable {
+public:
+ SkThreadedDiff() : fDiffContext(NULL) { }
+
+ void setup(SkDiffContext* diffContext, const SkString& baselinePath, const SkString& testPath) {
+ fDiffContext = diffContext;
+ fBaselinePath = baselinePath;
+ fTestPath = testPath;
+ }
+
+ virtual void run() SK_OVERRIDE {
+ fDiffContext->addDiff(fBaselinePath.c_str(), fTestPath.c_str());
mtklein 2013/10/23 02:47:12 I'm crashing all over the place when I run skpdiff
+ }
+
+private:
+ SkDiffContext* fDiffContext;
+ SkString fBaselinePath;
+ SkString fTestPath;
+};
void SkDiffContext::diffDirectories(const char baselinePath[], const char testPath[]) {
// Get the files in the baseline, we will then look for those inside the test path
@@ -104,9 +128,12 @@ void SkDiffContext::diffDirectories(const char baselinePath[], const char testPa
return;
}
- for (int baselineIndex = 0; baselineIndex < baselineEntries.count(); baselineIndex++) {
- SkDebugf("[%i/%i] ", baselineIndex, baselineEntries.count());
- const char* baseFilename = baselineEntries[baselineIndex].c_str();
+ SkThreadPool threadPool(fThreadCount);
+ SkTArray<SkThreadedDiff> runnableDiffs;
+ runnableDiffs.reset(baselineEntries.count());
+
+ for (int x = 0; x < baselineEntries.count(); x++) {
+ const char* baseFilename = baselineEntries[x].c_str();
// Find the real location of each file to compare
SkString baselineFile = SkOSPath::SkPathJoin(baselinePath, baseFilename);
@@ -115,11 +142,14 @@ void SkDiffContext::diffDirectories(const char baselinePath[], const char testPa
// Check that the test file exists and is a file
if (sk_exists(testFile.c_str()) && !sk_isdir(testFile.c_str())) {
// Queue up the comparison with the differ
- this->addDiff(baselineFile.c_str(), testFile.c_str());
+ runnableDiffs[x].setup(this, baselineFile, testFile);
+ threadPool.add(&runnableDiffs[x]);
} else {
SkDebugf("Baseline file \"%s\" has no corresponding test file\n", baselineFile.c_str());
}
}
+
+ threadPool.wait();
mtklein 2013/10/23 02:47:12 These wait() calls are harmless, but you can cut t
}
@@ -144,13 +174,16 @@ void SkDiffContext::diffPatterns(const char baselinePattern[], const char testPa
return;
}
- for (int entryIndex = 0; entryIndex < baselineEntries.count(); entryIndex++) {
- SkDebugf("[%i/%i] ", entryIndex, baselineEntries.count());
- const char* baselineFilename = baselineEntries[entryIndex].c_str();
- const char* testFilename = testEntries [entryIndex].c_str();
+ SkThreadPool threadPool(fThreadCount);
+ SkTArray<SkThreadedDiff> runnableDiffs;
+ runnableDiffs.reset(baselineEntries.count());
- this->addDiff(baselineFilename, testFilename);
+ for (int x = 0; x < baselineEntries.count(); x++) {
+ runnableDiffs[x].setup(this, baselineEntries[x], testEntries[x]);
+ threadPool.add(&runnableDiffs[x]);
}
+
+ threadPool.wait();
}
void SkDiffContext::outputRecords(SkWStream& stream, bool useJSONP) {
@@ -164,6 +197,7 @@ void SkDiffContext::outputRecords(SkWStream& stream, bool useJSONP) {
while (NULL != currentRecord) {
stream.writeText(" {\n");
+ SkString differenceAbsPath = get_absolute_path(currentRecord->fDifferencePath);
SkString baselineAbsPath = get_absolute_path(currentRecord->fBaselinePath);
SkString testAbsPath = get_absolute_path(currentRecord->fTestPath);
@@ -181,6 +215,10 @@ void SkDiffContext::outputRecords(SkWStream& stream, bool useJSONP) {
stream.writeText(baseName.c_str());
stream.writeText("\",\n");
+ stream.writeText(" \"differencePath\": \"");
+ stream.writeText(differenceAbsPath.c_str());
+ stream.writeText("\",\n");
+
stream.writeText(" \"baselinePath\": \"");
stream.writeText(baselineAbsPath.c_str());
stream.writeText("\",\n");
« no previous file with comments | « tools/skpdiff/SkDiffContext.h ('k') | tools/skpdiff/skpdiff_main.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698