trim DM fat

- cuts out a few fringe features like logs and notes tallies
 - moves vetos and blacklisting earlier so they're never really seen
 - many string strength reductions, either to const SkString& or const char*

CQ_EXTRA_TRYBOTS=client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-MSAN-Trybot

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1727363004

Review URL: https://codereview.chromium.org/1727363004
This commit is contained in:
mtklein 2016-02-24 19:07:07 -08:00 committed by Commit bot
parent dcceacf574
commit 3eed7ddb25

112
dm/DM.cpp
View File

@ -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 int32_t gPending;
static SkTArray<SkString> gRunning;
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 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++) {