*** empty log message ***

svn path=/trunk/boinc/; revision=10225
This commit is contained in:
Rom Walton 2006-05-31 08:14:21 +00:00
parent f0eb685944
commit cf4c89d757
2 changed files with 36 additions and 4 deletions

View File

@ -5232,3 +5232,11 @@ David 30 May 2006
wrapper.C (removed)
tools/
backend_lib.C
Rom 29 May 2006
- Bug Fix: Wait until the exception monitor has finished initializing
before finishing boinc_diagnostics_init() in case the very next thing
the program does is throw an exception.
lib/
diagnostics_win.C

View File

@ -620,18 +620,23 @@ typedef struct tagTHREADNAME_INFO {
static LPTOP_LEVEL_EXCEPTION_FILTER pPreviousExceptionHandler = NULL;
LONG CALLBACK set_thread_name_exception_filter(PEXCEPTION_POINTERS pExPtrs) {
LONG WINAPI set_thread_name_exception_filter(PEXCEPTION_POINTERS pExPtrs) {
if ( 0x406D1388 == pExPtrs->ExceptionRecord->ExceptionCode) {
// This is the special exception code used to name threads
// within a debugger. If no debugger is attached, then
// continue execution of the application.
return EXCEPTION_CONTINUE_EXECUTION;
}
if (!pPreviousExceptionHandler) {
// This can happen if the default unhandled exception filter
// hasn't been initialized yet. No since dereferencing a
// NULL pointer.
return EXCEPTION_CONTINUE_SEARCH;
}
return pPreviousExceptionHandler(pExPtrs);
}
void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName )
{
void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName ) {
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = szThreadName;
@ -1303,6 +1308,7 @@ typedef struct _BOINC_WINDOWCAPTURE {
static HANDLE hExceptionMonitorThread = NULL;
static HANDLE hExceptionMonitorHalt = NULL;
static HANDLE hExceptionMonitorStartedEvent = NULL;
static HANDLE hExceptionDetectedEvent = NULL;
static HANDLE hExceptionQuitEvent = NULL;
static HANDLE hExceptionQuitFinishedEvent = NULL;
@ -1327,6 +1333,15 @@ int diagnostics_init_unhandled_exception_monitor() {
);
}
// The following event is thrown by the exception monitoring thread
// right before it waits for the hExceptionDetectedEvent event.
hExceptionMonitorStartedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!hExceptionMonitorStartedEvent) {
fprintf(
stderr, "diagnostics_init_unhandled_exception_monitor(): Creating hExceptionMonitorStartedEvent failed, GLE %d\n", GetLastError()
);
}
// The following event is thrown by a thread that has experienced an
// unhandled exception after storing its exception record but before
// it attempts to aquire the halt mutex.
@ -1376,6 +1391,12 @@ int diagnostics_init_unhandled_exception_monitor() {
stderr, "WARNING: BOINC Windows Runtime Debugger has been disabled.\n"
);
retval = ERR_THREAD;
} else {
// Wait until the exception monitor is ready for business.
//
WaitForSingleObject(hExceptionMonitorStartedEvent, INFINITE);
}
return retval;
@ -1790,11 +1811,14 @@ UINT WINAPI diagnostics_unhandled_exception_monitor(LPVOID lpParameter) {
// at bay until we are ready to deal with them.
WaitForSingleObject(hExceptionMonitorHalt, INFINITE);
// Which events do we want to wait for?
hEvents[0] = hExceptionQuitEvent;
hEvents[1] = hExceptionDetectedEvent;
// Notify the initialization thread that initialization is complete and now
// we are waiting for an exception event.
SetEvent(hExceptionMonitorStartedEvent);
while (bContinue) {
dwEvent = WaitForMultipleObjects(
2, // number of objects in array