Index: dm/DM.cpp |
diff --git a/dm/DM.cpp b/dm/DM.cpp |
index 5c27c450ba52c9a3bda1537bc7ece6d747409e66..f37fc8b7fff8eeab49ac62ce5f0a098580aacb03 100644 |
--- a/dm/DM.cpp |
+++ b/dm/DM.cpp |
@@ -71,12 +71,10 @@ using namespace DM; |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
-static double now_ms() { return SkTime::GetNSecs() * 1e-6; } |
- |
SK_DECLARE_STATIC_MUTEX(gFailuresMutex); |
static SkTArray<SkString> gFailures; |
-static void fail(ImplicitString err) { |
+static void fail(const SkString& err) { |
SkAutoMutexAcquire lock(gFailuresMutex); |
SkDebugf("\n\nFAILURE: %s\n\n", err.c_str()); |
gFailures.push_back(err); |
@@ -85,15 +83,11 @@ static void fail(ImplicitString err) { |
// We use a spinlock to make locking this in a signal handler _somewhat_ safe. |
SK_DECLARE_STATIC_SPINLOCK(gMutex); |
-static int32_t gPending; |
-static SkTArray<SkString> gRunning; |
-static SkTHashMap<SkString, int> gNoteTally; |
- |
-static void done(double ms, |
- ImplicitString config, ImplicitString src, ImplicitString srcOptions, |
- ImplicitString name, ImplicitString note, ImplicitString log) { |
- SkString id = SkStringPrintf("%s %s %s %s", config.c_str(), src.c_str(), |
- srcOptions.c_str(), name.c_str()); |
+static int32_t gPending; |
+static SkTArray<SkString> gRunning; |
+ |
+static void done(const char* config, const char* src, const char* srcOptions, const char* name) { |
+ SkString id = SkStringPrintf("%s %s %s %s", config, src, srcOptions, name); |
int pending; |
{ |
SkAutoTAcquire<SkPODSpinlock> lock(gMutex); |
@@ -103,13 +97,6 @@ static void done(double ms, |
break; |
} |
} |
- if (!note.isEmpty()) { |
- if (int* tally = gNoteTally.find(note)) { |
- *tally += 1; |
- } else { |
- gNoteTally.set(note, 1); |
- } |
- } |
pending = --gPending; |
} |
// We write our dm.json file every once in a while in case we crash. |
@@ -119,10 +106,8 @@ static void done(double ms, |
} |
} |
-static void start(ImplicitString config, ImplicitString src, |
- ImplicitString srcOptions, ImplicitString name) { |
- SkString id = SkStringPrintf("%s %s %s %s", config.c_str(), src.c_str(), |
- srcOptions.c_str(), name.c_str()); |
+static void start(const char* config, const char* src, const char* srcOptions, const char* name) { |
+ SkString id = SkStringPrintf("%s %s %s %s", config, src, srcOptions, name); |
SkAutoTAcquire<SkPODSpinlock> lock(gMutex); |
gRunning.push_back(id); |
} |
@@ -165,8 +150,9 @@ static void print_status() { |
struct Gold : public SkString { |
Gold() : SkString("") {} |
- Gold(ImplicitString sink, ImplicitString src, ImplicitString srcOptions, |
- ImplicitString name, ImplicitString md5) |
+ Gold(const SkString& sink, const SkString& src, |
+ const SkString& srcOptions, const SkString& name, |
+ const SkString& md5) |
: SkString("") { |
this->append(sink); |
this->append(src); |
@@ -221,8 +207,8 @@ static void gather_uninteresting_hashes() { |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
struct TaggedSrc : public SkAutoTDelete<Src> { |
- ImplicitString tag; |
- ImplicitString options; |
+ SkString tag; |
+ SkString options; |
}; |
struct TaggedSink : public SkAutoTDelete<Sink> { |
@@ -239,10 +225,10 @@ static bool in_shard() { |
return N++ % FLAGS_shards == FLAGS_shard; |
} |
-static void push_src(ImplicitString tag, ImplicitString options, Src* s) { |
+static void push_src(const char* tag, ImplicitString options, Src* s) { |
SkAutoTDelete<Src> src(s); |
if (in_shard() && |
- FLAGS_src.contains(tag.c_str()) && |
+ FLAGS_src.contains(tag) && |
!SkCommandLineFlags::ShouldSkip(FLAGS_match, src->name().c_str())) { |
TaggedSrc& s = gSrcs.push_back(); |
s.reset(src.detach()); |
@@ -856,19 +842,17 @@ static bool match(const char* needle, const char* haystack) { |
return 0 == strcmp("_", needle) || nullptr != strstr(haystack, needle); |
} |
-static ImplicitString is_blacklisted(const char* sink, const char* src, |
- const char* srcOptions, const char* name) { |
+static bool is_blacklisted(const char* sink, const char* src, |
+ const char* srcOptions, const char* name) { |
for (int i = 0; i < FLAGS_blacklist.count() - 3; i += 4) { |
if (match(FLAGS_blacklist[i+0], sink) && |
match(FLAGS_blacklist[i+1], src) && |
match(FLAGS_blacklist[i+2], srcOptions) && |
match(FLAGS_blacklist[i+3], name)) { |
- return SkStringPrintf("%s %s %s %s", |
- FLAGS_blacklist[i+0], FLAGS_blacklist[i+1], |
- FLAGS_blacklist[i+2], FLAGS_blacklist[i+3]); |
+ return true; |
} |
} |
- return ""; |
+ return false; |
} |
// Even when a Task Sink reports to be non-threadsafe (e.g. GPU), we know things like |
@@ -885,23 +869,12 @@ struct Task { |
static void Run(const Task& task) { |
SkString name = task.src->name(); |
- // We'll skip drawing this Src/Sink pair if: |
- // - the Src vetoes the Sink; |
- // - this Src / Sink combination is on the blacklist; |
- // - it's a dry run. |
- SkString note(task.src->veto(task.sink->flags()) ? " (veto)" : ""); |
- SkString whyBlacklisted = is_blacklisted(task.sink.tag.c_str(), task.src.tag.c_str(), |
- task.src.options.c_str(), name.c_str()); |
- if (!whyBlacklisted.isEmpty()) { |
- note.appendf(" (--blacklist %s)", whyBlacklisted.c_str()); |
- } |
- |
SkString log; |
- auto timerStart = now_ms(); |
- if (!FLAGS_dryRun && note.isEmpty()) { |
+ if (!FLAGS_dryRun) { |
SkBitmap bitmap; |
SkDynamicMemoryWStream stream; |
- start(task.sink.tag.c_str(), task.src.tag, task.src.options, name.c_str()); |
+ start(task.sink.tag.c_str(), task.src.tag.c_str(), |
+ task.src.options.c_str(), name.c_str()); |
Error err = task.sink->draw(*task.src, &bitmap, &stream, &log); |
if (!err.isEmpty()) { |
if (err.isFatal()) { |
@@ -912,10 +885,8 @@ struct Task { |
name.c_str(), |
err.c_str())); |
} else { |
- note.appendf(" (skipped: %s)", err.c_str()); |
- auto elapsed = now_ms() - timerStart; |
- done(elapsed, task.sink.tag.c_str(), task.src.tag, task.src.options, |
- name, note, log); |
+ done(task.sink.tag.c_str(), task.src.tag.c_str(), |
+ task.src.options.c_str(), name.c_str()); |
return; |
} |
} |
@@ -955,8 +926,8 @@ struct Task { |
} |
if (!FLAGS_readPath.isEmpty() && |
- !gGold.contains(Gold(task.sink.tag.c_str(), task.src.tag.c_str(), |
- task.src.options.c_str(), name, md5))) { |
+ !gGold.contains(Gold(task.sink.tag, task.src.tag, |
+ task.src.options, name, md5))) { |
fail(SkStringPrintf("%s not found for %s %s %s %s in %s", |
md5.c_str(), |
task.sink.tag.c_str(), |
@@ -977,9 +948,7 @@ struct Task { |
} |
}); |
} |
- auto elapsed = now_ms() - timerStart; |
- done(elapsed, task.sink.tag.c_str(), task.src.tag.c_str(), task.src.options.c_str(), |
- name, note, log); |
+ done(task.sink.tag.c_str(), task.src.tag.c_str(), task.src.options.c_str(), name.c_str()); |
} |
static void WriteToDisk(const Task& task, |
@@ -989,7 +958,7 @@ struct Task { |
const SkBitmap* bitmap) { |
JsonWriter::BitmapResult result; |
result.name = task.src->name(); |
- result.config = task.sink.tag.c_str(); |
+ result.config = task.sink.tag; |
result.sourceType = task.src.tag; |
result.sourceOptions = task.src.options; |
result.ext = ext; |
@@ -1089,19 +1058,12 @@ static void run_test(skiatest::Test test) { |
bool verbose() const override { return FLAGS_veryVerbose; } |
} reporter; |
- SkString note; |
- SkString whyBlacklisted = is_blacklisted("_", "tests", "_", test.name); |
- if (!whyBlacklisted.isEmpty()) { |
- note.appendf(" (--blacklist %s)", whyBlacklisted.c_str()); |
- } |
- |
- auto timerStart = now_ms(); |
- if (!FLAGS_dryRun && whyBlacklisted.isEmpty()) { |
+ if (!FLAGS_dryRun && !is_blacklisted("_", "tests", "_", test.name)) { |
start("unit", "test", "", test.name); |
GrContextFactory factory; |
test.proc(&reporter, &factory); |
} |
- done(now_ms()-timerStart, "unit", "test", "", test.name, note, ""); |
+ done("unit", "test", "", test.name); |
} |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
@@ -1173,6 +1135,14 @@ int dm_main() { |
for (auto& sink : gSinks) |
for (auto& src : gSrcs) { |
+ if (src->veto(sink->flags()) || |
+ is_blacklisted(sink.tag.c_str(), src.tag.c_str(), |
+ src.options.c_str(), src->name().c_str())) { |
+ SkAutoTAcquire<SkPODSpinlock> lock(gMutex); |
+ gPending--; |
+ continue; |
+ } |
+ |
Task task(src, sink); |
if (src->serial() || sink->serial()) { |
serial.push_back(task); |
@@ -1198,14 +1168,6 @@ int dm_main() { |
// At this point we're back in single-threaded land. |
sk_tool_utils::release_portable_typefaces(); |
- if (FLAGS_verbose && gNoteTally.count() > 0) { |
- SkDebugf("\nNote tally:\n"); |
- gNoteTally.foreach([](const SkString& note, int* tally) { |
- SkDebugf("%dx\t%s\n", *tally, note.c_str()); |
- }); |
- } |
- |
- SkDebugf("\n"); |
if (gFailures.count() > 0) { |
SkDebugf("Failures:\n"); |
for (int i = 0; i < gFailures.count(); i++) { |