diff --git a/Sources/Plasma/Apps/plClient/winmain.cpp b/Sources/Plasma/Apps/plClient/winmain.cpp index 56339071..e1acd0db 100644 --- a/Sources/Plasma/Apps/plClient/winmain.cpp +++ b/Sources/Plasma/Apps/plClient/winmain.cpp @@ -1638,24 +1638,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nC } } - // log stackdump.log text if the log exists - char stackDumpText[1024]; - wchar_t stackDumpTextW[1024]; - memset(stackDumpText, 0, arrsize(stackDumpText)); - memset(stackDumpTextW, 0, arrsize(stackDumpTextW) * sizeof(wchar_t)); - wchar_t fileAndPath[MAX_PATH]; - PathGetLogDirectory(fileAndPath, arrsize(fileAndPath)); - PathAddFilename(fileAndPath, fileAndPath, L"stackDump.log", arrsize(fileAndPath)); - FILE *stackDumpLog = _wfopen(fileAndPath, L"r"); - if(stackDumpLog) - { - fread(stackDumpText, 1, arrsize(stackDumpText) - 1, stackDumpLog); - StrToUnicode(stackDumpTextW, stackDumpText, arrsize(stackDumpText)); - NetCliAuthLogStackDump (stackDumpTextW); - fclose(stackDumpLog); - plFileUtils::RemoveFile(fileAndPath); - } - for (;;) { // Create Window if (!WinInit(hInst, nCmdShow) || gClient->GetDone()) diff --git a/Sources/Plasma/CoreLib/hsThread.h b/Sources/Plasma/CoreLib/hsThread.h index e36d131b..c27e2118 100644 --- a/Sources/Plasma/CoreLib/hsThread.h +++ b/Sources/Plasma/CoreLib/hsThread.h @@ -115,7 +115,11 @@ class hsMutex { public: hsMutex(); virtual ~hsMutex(); - + +#ifdef HS_BUILD_FOR_WIN32 + HANDLE GetHandle() const { return fMutexH; } +#endif + void Lock(); hsBool TryLock(); void Unlock(); @@ -157,6 +161,10 @@ public: hsSemaphore(int initialValue=0, const char* name=nil); ~hsSemaphore(); +#ifdef HS_BUILD_FOR_WIN32 + HANDLE GetHandle() const { return fSemaH; } +#endif + hsBool TryWait(); hsBool Wait(hsMilliseconds timeToWait = kPosInfinity32); void Signal(); @@ -183,6 +191,10 @@ public: hsEvent(); ~hsEvent(); +#ifdef HS_BUILD_FOR_WIN32 + HANDLE GetHandle() const { return fEvent; } +#endif + hsBool Wait(hsMilliseconds timeToWait = kPosInfinity32); void Signal(); }; diff --git a/Sources/Plasma/FeatureLib/pfCrashHandler/plCrashCli.cpp b/Sources/Plasma/FeatureLib/pfCrashHandler/plCrashCli.cpp index d5412d3b..881c761c 100644 --- a/Sources/Plasma/FeatureLib/pfCrashHandler/plCrashCli.cpp +++ b/Sources/Plasma/FeatureLib/pfCrashHandler/plCrashCli.cpp @@ -134,5 +134,7 @@ void plCrashCli::ReportCrash(PEXCEPTION_POINTERS e) void plCrashCli::WaitForHandle() { - fHandled->Wait(); + // Don't deadlock... Only wait if the CrashSrv is attached + if (fLink && fLink->fSrvReady) + fHandled->Wait(); } diff --git a/Sources/Plasma/FeatureLib/pfCrashHandler/plCrashSrv.cpp b/Sources/Plasma/FeatureLib/pfCrashHandler/plCrashSrv.cpp index 0efae16b..5d5926e2 100644 --- a/Sources/Plasma/FeatureLib/pfCrashHandler/plCrashSrv.cpp +++ b/Sources/Plasma/FeatureLib/pfCrashHandler/plCrashSrv.cpp @@ -108,10 +108,20 @@ void plCrashSrv::IHandleCrash() void plCrashSrv::HandleCrash() { - fCrashed->Wait(); // Wait for a crash if (!fLink) FATAL("plCrashMemLink is nil!"); - else if (fLink->fCrashed) + fLink->fSrvReady = true; // mark us as ready to receive crashes + +#ifdef HS_BUILD_FOR_WIN32 + // In Win32 land we have to hackily handle the client process exiting, so we'll wait on both + // the crashed semaphore and the client process... + HANDLE hack[2] = { fLink->fClientProcess, fCrashed->GetHandle() }; + DWORD result = WaitForMultipleObjects(arrsize(hack), hack, FALSE, INFINITE); + hsAssert(result != WAIT_FAILED, "WaitForMultipleObjects failed"); +#else + fCrashed->Wait(); +#endif + if (fLink->fCrashed) IHandleCrash(); fHandled->Signal(); // Tell CrashCli we handled it } diff --git a/Sources/Plasma/FeatureLib/pfCrashHandler/plCrash_Private.h b/Sources/Plasma/FeatureLib/pfCrashHandler/plCrash_Private.h index e96f8dc9..70e9ec33 100644 --- a/Sources/Plasma/FeatureLib/pfCrashHandler/plCrash_Private.h +++ b/Sources/Plasma/FeatureLib/pfCrashHandler/plCrash_Private.h @@ -59,6 +59,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com struct plCrashMemLink { bool fCrashed; + bool fSrvReady; #ifdef HS_BUILD_FOR_WIN32 HANDLE fClientProcess; uint32_t fClientProcessID;