Index: dm/DM.cpp |
diff --git a/dm/DM.cpp b/dm/DM.cpp |
index 41e4c8dc3eae4a6c56b399bb963414b15f4c0197..41063b7e8642946a4532aa7df72021edae276fd3 100644 |
--- a/dm/DM.cpp |
+++ b/dm/DM.cpp |
@@ -83,8 +83,9 @@ static void fail(ImplicitString err) { |
static int32_t gPending = 0; // Atomic. Total number of running and queued tasks. |
-SK_DECLARE_STATIC_MUTEX(gRunningMutex); |
-static SkTArray<SkString> gRunning; |
+SK_DECLARE_STATIC_MUTEX(gRunningAndTallyMutex); |
+static SkTArray<SkString> gRunning; |
+static SkTHashMap<SkString, int> gNoteTally; |
static void done(double ms, |
ImplicitString config, ImplicitString src, ImplicitString srcOptions, |
@@ -92,29 +93,32 @@ static void done(double ms, |
SkString id = SkStringPrintf("%s %s %s %s", config.c_str(), src.c_str(), |
srcOptions.c_str(), name.c_str()); |
{ |
- SkAutoMutexAcquire lock(gRunningMutex); |
+ SkAutoMutexAcquire lock(gRunningAndTallyMutex); |
for (int i = 0; i < gRunning.count(); i++) { |
if (gRunning[i] == id) { |
gRunning.removeShuffle(i); |
break; |
} |
} |
- } |
- if (!FLAGS_verbose) { |
- note = ""; |
+ if (!note.isEmpty()) { |
+ if (int* tally = gNoteTally.find(note)) { |
+ *tally += 1; |
+ } else { |
+ gNoteTally.set(note, 1); |
+ } |
+ } |
} |
if (!log.isEmpty()) { |
log.prepend("\n"); |
} |
auto pending = sk_atomic_dec(&gPending)-1; |
- if (!FLAGS_quiet) { |
- SkDebugf("%s(%4d/%-4dMB %6d) %s\t%s%s%s", FLAGS_verbose ? "\n" : kSkOverwriteLine |
+ if (!FLAGS_quiet && note.isEmpty()) { |
+ SkDebugf("%s(%4d/%-4dMB %6d) %s\t%s%s", FLAGS_verbose ? "\n" : kSkOverwriteLine |
, sk_tools::getCurrResidentSetSizeMB() |
, sk_tools::getMaxResidentSetSizeMB() |
, pending |
, HumanizeMs(ms).c_str() |
, id.c_str() |
- , note.c_str() |
, log.c_str()); |
} |
// We write our dm.json file every once in a while in case we crash. |
@@ -128,7 +132,7 @@ 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()); |
- SkAutoMutexAcquire lock(gRunningMutex); |
+ SkAutoMutexAcquire lock(gRunningAndTallyMutex); |
gRunning.push_back(id); |
} |
@@ -1041,7 +1045,7 @@ static void start_keepalive() { |
#endif |
SkString running; |
{ |
- SkAutoMutexAcquire lock(gRunningMutex); |
+ SkAutoMutexAcquire lock(gRunningAndTallyMutex); |
for (int i = 0; i < gRunning.count(); i++) { |
running.appendf("\n\t%s", gRunning[i].c_str()); |
} |
@@ -1118,6 +1122,13 @@ 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"); |