Browse Source

Merge pull request #196 from Hoikas/minidump

pfCrash Fixes
Branan Purvine-Riley 12 years ago
parent
commit
a31f14a9bd
  1. 18
      Sources/Plasma/Apps/plClient/winmain.cpp
  2. 14
      Sources/Plasma/CoreLib/hsThread.h
  3. 4
      Sources/Plasma/FeatureLib/pfCrashHandler/plCrashCli.cpp
  4. 14
      Sources/Plasma/FeatureLib/pfCrashHandler/plCrashSrv.cpp
  5. 1
      Sources/Plasma/FeatureLib/pfCrashHandler/plCrash_Private.h

18
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())

14
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();
};

4
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();
}

14
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
}

1
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;

Loading…
Cancel
Save