diff options
Diffstat (limited to 'dm')
-rw-r--r-- | dm/DM.cpp | 114 |
1 files changed, 38 insertions, 76 deletions
@@ -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++) { |