| Index: dm/DM.cpp
|
| diff --git a/dm/DM.cpp b/dm/DM.cpp
|
| index d931a9a8e981d599e69643df4ba958c58b529f06..5981c7473b9066d7875f906764ad8b28e935f532 100644
|
| --- a/dm/DM.cpp
|
| +++ b/dm/DM.cpp
|
| @@ -116,11 +116,19 @@ static void fail(const SkString& err) {
|
| gFailures.push_back(err);
|
| }
|
|
|
| +struct Running {
|
| + SkString id;
|
| + SkThreadID thread;
|
| +
|
| + void dump() const {
|
| + info("\t%s\n", id.c_str());
|
| + }
|
| +};
|
|
|
| // We use a spinlock to make locking this in a signal handler _somewhat_ safe.
|
| static SkSpinlock gMutex;
|
| -static int32_t gPending;
|
| -static SkTArray<SkString> gRunning;
|
| +static int32_t gPending;
|
| +static SkTArray<Running> 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);
|
| @@ -129,7 +137,7 @@ static void done(const char* config, const char* src, const char* srcOptions, co
|
| {
|
| SkAutoMutexAcquire lock(gMutex);
|
| for (int i = 0; i < gRunning.count(); i++) {
|
| - if (gRunning[i] == id) {
|
| + if (gRunning[i].id == id) {
|
| gRunning.removeShuffle(i);
|
| break;
|
| }
|
| @@ -147,7 +155,7 @@ static void start(const char* config, const char* src, const char* srcOptions, c
|
| SkString id = SkStringPrintf("%s %s %s %s", config, src, srcOptions, name);
|
| vlog("start %s\n", id.c_str());
|
| SkAutoMutexAcquire lock(gMutex);
|
| - gRunning.push_back(id);
|
| + gRunning.push_back({id,SkGetThreadID()});
|
| }
|
|
|
| static void print_status() {
|
| @@ -159,10 +167,23 @@ static void print_status() {
|
| 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) {
|
| - info("\t%s\n", task.c_str());
|
| + task.dump();
|
| }
|
| }
|
|
|
| +#if !defined(SK_BUILD_FOR_ANDROID)
|
| + static void find_culprit() {
|
| + // Assumes gMutex is locked.
|
| + SkThreadID thisThread = SkGetThreadID();
|
| + for (auto& task : gRunning) {
|
| + if (task.thread == thisThread) {
|
| + info("Likely culprit:\n");
|
| + task.dump();
|
| + }
|
| + }
|
| + }
|
| +#endif
|
| +
|
| #if defined(SK_BUILD_FOR_WIN32)
|
| static LONG WINAPI crash_handler(EXCEPTION_POINTERS* e) {
|
| static const struct {
|
| @@ -189,8 +210,9 @@ static void print_status() {
|
| }
|
| info(", was running:\n");
|
| for (auto& task : gRunning) {
|
| - info("\t%s\n", task.c_str());
|
| + task.dump();
|
| }
|
| + find_culprit();
|
| fflush(stdout);
|
|
|
| // Execute default exception handler... hopefully, exit.
|
| @@ -208,8 +230,9 @@ static void print_status() {
|
|
|
| info("\nCaught signal %d [%s], was running:\n", sig, strsignal(sig));
|
| for (auto& task : gRunning) {
|
| - info("\t%s\n", task.c_str());
|
| + task.dump();
|
| }
|
| + find_culprit();
|
|
|
| void* stack[64];
|
| int count = backtrace(stack, SK_ARRAY_COUNT(stack));
|
|
|