Index: dm/DM.cpp |
diff --git a/dm/DM.cpp b/dm/DM.cpp |
index d70914d0fd92a8ecf5e1eee498ec7583c7f758db..1e3e5d021ce945b9dd7c20e1913f12c339aae26a 100644 |
--- a/dm/DM.cpp |
+++ b/dm/DM.cpp |
@@ -73,6 +73,32 @@ using namespace DM; |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+static const SkMSec kStartMs = SkTime::GetMSecs(); |
+ |
+static FILE* gVLog; |
+ |
+template <typename... Args> |
+static void vlog(const char* fmt, Args&&... args) { |
+ if (gVLog) { |
+ fprintf(gVLog, "%s\t", HumanizeMs(SkTime::GetMSecs() - kStartMs).c_str()); |
+ fprintf(gVLog, fmt, args...); |
+ fflush(gVLog); |
+ } |
+} |
+ |
+template <typename... Args> |
+static void info(const char* fmt, Args&&... args) { |
+ vlog(fmt, args...); |
+ if (!FLAGS_quiet) { |
+ printf(fmt, args...); |
+ } |
+} |
+static void info(const char* fmt) { |
+ if (!FLAGS_quiet) { |
+ printf("%s", fmt); // Clang warns printf(fmt) is insecure. |
+ } |
+} |
+ |
SK_DECLARE_STATIC_MUTEX(gFailuresMutex); |
static SkTArray<SkString> gFailures; |
@@ -90,6 +116,7 @@ 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); |
+ vlog("done %s\n", id.c_str()); |
int pending; |
{ |
SkAutoTAcquire<SkSpinlock> lock(gMutex); |
@@ -110,22 +137,21 @@ static void done(const char* config, const char* src, const char* srcOptions, co |
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); |
+ vlog("start %s\n", id.c_str()); |
SkAutoTAcquire<SkSpinlock> lock(gMutex); |
gRunning.push_back(id); |
} |
static void print_status() { |
- static SkMSec start_ms = SkTime::GetMSecs(); |
- |
int curr = sk_tools::getCurrResidentSetSizeMB(), |
peak = sk_tools::getMaxResidentSetSizeMB(); |
- SkString elapsed = HumanizeMs(SkTime::GetMSecs() - start_ms); |
+ SkString elapsed = HumanizeMs(SkTime::GetMSecs() - kStartMs); |
SkAutoTAcquire<SkSpinlock> lock(gMutex); |
- SkDebugf("\n%s elapsed, %d active, %d queued, %dMB RAM, %dMB peak\n", |
- elapsed.c_str(), gRunning.count(), gPending - gRunning.count(), curr, peak); |
+ info("\n%s elapsed, %d active, %d queued, %dMB RAM, %dMB peak\n", |
+ elapsed.c_str(), gRunning.count(), gPending - gRunning.count(), curr, peak); |
for (auto& task : gRunning) { |
- SkDebugf("\t%s\n", task.c_str()); |
+ info("\t%s\n", task.c_str()); |
} |
} |
@@ -151,13 +177,13 @@ static std::atomic<bool> in_signal_handler{false}; |
if (!in_signal_handler.exchange(true)) { |
const DWORD code = e->ExceptionRecord->ExceptionCode; |
- SkDebugf("\nCaught exception %u", code); |
+ info("\nCaught exception %u", code); |
for (const auto& exception : kExceptions) { |
if (exception.code == code) { |
- SkDebugf(" %s", exception.name); |
+ info(" %s", exception.name); |
} |
} |
- SkDebugf("\n"); |
+ info("\n"); |
print_status(); |
} |
// Execute default exception handler... hopefully, exit. |
@@ -176,17 +202,17 @@ static std::atomic<bool> in_signal_handler{false}; |
signal(sig, [](int sig) { |
if (!in_signal_handler.exchange(true)) { |
SkAutoTAcquire<SkSpinlock> lock(gMutex); |
- SkDebugf("\nCaught signal %d [%s], was running:\n", sig, strsignal(sig)); |
+ info("\nCaught signal %d [%s], was running:\n", sig, strsignal(sig)); |
for (auto& task : gRunning) { |
- SkDebugf("\t%s\n", task.c_str()); |
+ info("\t%s\n", task.c_str()); |
} |
void* stack[64]; |
int count = backtrace(stack, SK_ARRAY_COUNT(stack)); |
char** symbols = backtrace_symbols(stack, count); |
- SkDebugf("\nStack trace:\n"); |
+ info("\nStack trace:\n"); |
for (int i = 0; i < count; i++) { |
- SkDebugf(" %s\n", symbols[i]); |
+ info(" %s\n", symbols[i]); |
} |
} |
_Exit(sig); |
@@ -242,8 +268,8 @@ static void gather_uninteresting_hashes() { |
if (!FLAGS_uninterestingHashesFile.isEmpty()) { |
SkAutoTUnref<SkData> data(SkData::NewFromFileName(FLAGS_uninterestingHashesFile[0])); |
if (!data) { |
- SkDebugf("WARNING: unable to read uninteresting hashes from %s\n", |
- FLAGS_uninterestingHashesFile[0]); |
+ info("WARNING: unable to read uninteresting hashes from %s\n", |
+ FLAGS_uninterestingHashesFile[0]); |
return; |
} |
SkTArray<SkString> hashes; |
@@ -251,8 +277,8 @@ static void gather_uninteresting_hashes() { |
for (const SkString& hash : hashes) { |
gUninterestingHashes.add(hash); |
} |
- SkDebugf("FYI: loaded %d distinct uninteresting hashes from %d lines\n", |
- gUninterestingHashes.count(), hashes.count()); |
+ info("FYI: loaded %d distinct uninteresting hashes from %d lines\n", |
+ gUninterestingHashes.count(), hashes.count()); |
} |
} |
@@ -403,12 +429,12 @@ static void push_android_codec_src(Path path, AndroidCodecSrc::Mode mode, |
static void push_codec_srcs(Path path) { |
SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str())); |
if (!encoded) { |
- SkDebugf("Couldn't read %s.", path.c_str()); |
+ info("Couldn't read %s.", path.c_str()); |
return; |
} |
SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
if (nullptr == codec.get()) { |
- SkDebugf("Couldn't create codec for %s.", path.c_str()); |
+ info("Couldn't create codec for %s.", path.c_str()); |
return; |
} |
@@ -704,7 +730,7 @@ static void push_sink(const SkCommandLineConfig& config, Sink* s) { |
SkString log; |
Error err = sink->draw(justOneRect, &bitmap, &stream, &log); |
if (err.isFatal()) { |
- SkDebugf("Could not run %s: %s\n", config.getTag().c_str(), err.c_str()); |
+ info("Could not run %s: %s\n", config.getTag().c_str(), err.c_str()); |
exit(1); |
} |
@@ -734,8 +760,8 @@ static Sink* create_sink(const SkCommandLineConfig* config) { |
} |
GrContextFactory testFactory; |
if (!testFactory.get(contextType, contextOptions)) { |
- SkDebugf("WARNING: can not create GPU context for config '%s'. " |
- "GM tests will be skipped.\n", gpuConfig->getTag().c_str()); |
+ info("WARNING: can not create GPU context for config '%s'. " |
+ "GM tests will be skipped.\n", gpuConfig->getTag().c_str()); |
return nullptr; |
} |
return new GPUSink(contextType, contextOptions, gpuConfig->getSamples(), |
@@ -803,8 +829,8 @@ static void gather_sinks() { |
const SkCommandLineConfig& config = *configs[i]; |
Sink* sink = create_sink(&config); |
if (sink == nullptr) { |
- SkDebugf("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(), |
- config.getTag().c_str()); |
+ info("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(), |
+ config.getTag().c_str()); |
continue; |
} |
@@ -813,8 +839,8 @@ static void gather_sinks() { |
const SkString& part = parts[j]; |
Sink* next = create_via(part, sink); |
if (next == nullptr) { |
- SkDebugf("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(), |
- part.c_str()); |
+ info("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(), |
+ part.c_str()); |
delete sink; |
sink = nullptr; |
break; |
@@ -986,11 +1012,11 @@ struct Task { |
task.src.options.c_str(), name.c_str()); |
Error err = task.sink->draw(*task.src, &bitmap, &stream, &log); |
if (!log.isEmpty()) { |
- SkDebugf("%s %s %s %s:\n%s\n", task.sink.tag.c_str() |
- , task.src.tag.c_str() |
- , task.src.options.c_str() |
- , name.c_str() |
- , log.c_str()); |
+ info("%s %s %s %s:\n%s\n", task.sink.tag.c_str() |
+ , task.src.tag.c_str() |
+ , task.src.options.c_str() |
+ , name.c_str() |
+ , log.c_str()); |
} |
if (!err.isEmpty()) { |
if (err.isFatal()) { |
@@ -1226,6 +1252,11 @@ int dm_main(); |
int dm_main() { |
setup_crash_handler(); |
+ if (FLAGS_verbose && !FLAGS_writePath.isEmpty()) { |
+ sk_mkdir(FLAGS_writePath[0]); |
+ gVLog = freopen(SkOSPath::Join(FLAGS_writePath[0], "verbose.log").c_str(), "w", stderr); |
+ } |
+ |
JsonWriter::DumpJson(); // It's handy for the bots to assume this is ~never missing. |
SkAutoGraphics ag; |
SkTaskGroup::Enabler enabled(FLAGS_threads); |
@@ -1235,7 +1266,7 @@ int dm_main() { |
SkString testResourcePath = GetResourcePath("color_wheel.png"); |
SkFILEStream testResource(testResourcePath.c_str()); |
if (!testResource.isValid()) { |
- SkDebugf("Some resources are missing. Do you need to set --resourcePath?\n"); |
+ info("Some resources are missing. Do you need to set --resourcePath?\n"); |
} |
} |
gather_gold(); |
@@ -1248,8 +1279,8 @@ int dm_main() { |
gather_tests(); |
gPending = gSrcs.count() * gSinks.count() + gParallelTests.count() + gSerialTests.count(); |
- SkDebugf("%d srcs * %d sinks + %d tests == %d tasks", |
- gSrcs.count(), gSinks.count(), gParallelTests.count() + gSerialTests.count(), gPending); |
+ info("%d srcs * %d sinks + %d tests == %d tasks", |
+ gSrcs.count(), gSinks.count(), gParallelTests.count() + gSerialTests.count(), gPending); |
SkAutoTDelete<SkThread> statusThread(start_status_thread()); |
// Kick off as much parallel work as we can, making note of any serial work we'll need to do. |
@@ -1294,11 +1325,11 @@ int dm_main() { |
sk_tool_utils::release_portable_typefaces(); |
if (gFailures.count() > 0) { |
- SkDebugf("Failures:\n"); |
+ info("Failures:\n"); |
for (int i = 0; i < gFailures.count(); i++) { |
- SkDebugf("\t%s\n", gFailures[i].c_str()); |
+ info("\t%s\n", gFailures[i].c_str()); |
} |
- SkDebugf("%d failures\n", gFailures.count()); |
+ info("%d failures\n", gFailures.count()); |
return 1; |
} |
@@ -1307,7 +1338,7 @@ int dm_main() { |
#endif // SK_PDF_IMAGE_STATS |
print_status(); |
- SkDebugf("Finished!\n"); |
+ info("Finished!\n"); |
return 0; |
} |