1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir /* system headers */ 29*cdf0e10cSrcweir #include "system.h" 30*cdf0e10cSrcweir #include <tchar.h> 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include "file_url.h" 33*cdf0e10cSrcweir #include "path_helper.hxx" 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir #include <osl/diagnose.h> 36*cdf0e10cSrcweir #include <osl/mutex.h> 37*cdf0e10cSrcweir #include <osl/signal.h> 38*cdf0e10cSrcweir #ifndef __MINGW32__ 39*cdf0e10cSrcweir #include <DbgHelp.h> 40*cdf0e10cSrcweir #endif 41*cdf0e10cSrcweir #include <ErrorRep.h> 42*cdf0e10cSrcweir #include <systools/win32/uwinapi.h> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir typedef struct _oslSignalHandlerImpl 45*cdf0e10cSrcweir { 46*cdf0e10cSrcweir oslSignalHandlerFunction Handler; 47*cdf0e10cSrcweir void* pData; 48*cdf0e10cSrcweir struct _oslSignalHandlerImpl* pNext; 49*cdf0e10cSrcweir } oslSignalHandlerImpl; 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir static sal_Bool bErrorReportingEnabled = sal_True; 52*cdf0e10cSrcweir static sal_Bool bInitSignal = sal_False; 53*cdf0e10cSrcweir static oslMutex SignalListMutex; 54*cdf0e10cSrcweir static oslSignalHandlerImpl* SignalList; 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir static long WINAPI SignalHandlerFunction(LPEXCEPTION_POINTERS lpEP); 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir static sal_Bool InitSignal(void) 59*cdf0e10cSrcweir { 60*cdf0e10cSrcweir HMODULE hFaultRep; 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir SignalListMutex = osl_createMutex(); 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir SetUnhandledExceptionFilter(SignalHandlerFunction); 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir hFaultRep = LoadLibrary( "faultrep.dll" ); 67*cdf0e10cSrcweir if ( hFaultRep ) 68*cdf0e10cSrcweir { 69*cdf0e10cSrcweir #ifdef __MINGW32__ 70*cdf0e10cSrcweir typedef BOOL (WINAPI *pfn_ADDEREXCLUDEDAPPLICATIONW)(LPCWSTR); 71*cdf0e10cSrcweir #endif 72*cdf0e10cSrcweir pfn_ADDEREXCLUDEDAPPLICATIONW pfn = (pfn_ADDEREXCLUDEDAPPLICATIONW)GetProcAddress( hFaultRep, "AddERExcludedApplicationW" ); 73*cdf0e10cSrcweir if ( pfn ) 74*cdf0e10cSrcweir pfn( L"SOFFICE.EXE" ); 75*cdf0e10cSrcweir FreeLibrary( hFaultRep ); 76*cdf0e10cSrcweir } 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir return sal_True; 79*cdf0e10cSrcweir } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir static sal_Bool DeInitSignal(void) 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir SetUnhandledExceptionFilter(NULL); 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir osl_destroyMutex(SignalListMutex); 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir return sal_False; 88*cdf0e10cSrcweir } 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir static oslSignalAction CallSignalHandler(oslSignalInfo *pInfo) 91*cdf0e10cSrcweir { 92*cdf0e10cSrcweir oslSignalHandlerImpl* pHandler = SignalList; 93*cdf0e10cSrcweir oslSignalAction Action = osl_Signal_ActCallNextHdl; 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir while (pHandler != NULL) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir if ((Action = pHandler->Handler(pHandler->pData, pInfo)) != osl_Signal_ActCallNextHdl) 98*cdf0e10cSrcweir break; 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir pHandler = pHandler->pNext; 101*cdf0e10cSrcweir } 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir return Action; 104*cdf0e10cSrcweir } 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir /*****************************************************************************/ 107*cdf0e10cSrcweir /* SignalHandlerFunction */ 108*cdf0e10cSrcweir /*****************************************************************************/ 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir #define REPORTENV_PARAM "-crashreportenv:" 111*cdf0e10cSrcweir #define REPORTENV_PARAM2 "/crashreportenv:" 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir static BOOL ReportCrash( LPEXCEPTION_POINTERS lpEP ) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir BOOL fSuccess = FALSE; 116*cdf0e10cSrcweir BOOL fAutoReport = FALSE; 117*cdf0e10cSrcweir TCHAR szBuffer[1024]; 118*cdf0e10cSrcweir ::osl::LongPathBuffer< sal_Char > aPath( MAX_LONG_PATH ); 119*cdf0e10cSrcweir LPTSTR lpFilePart; 120*cdf0e10cSrcweir PROCESS_INFORMATION ProcessInfo; 121*cdf0e10cSrcweir STARTUPINFO StartupInfo; 122*cdf0e10cSrcweir int argi; 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir if ( !bErrorReportingEnabled ) 125*cdf0e10cSrcweir return FALSE; 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir /* Check if crash reporter was disabled by command line */ 128*cdf0e10cSrcweir 129*cdf0e10cSrcweir for ( argi = 1; argi < __argc; argi++ ) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir if ( 132*cdf0e10cSrcweir 0 == stricmp( __argv[argi], "-nocrashreport" ) || 133*cdf0e10cSrcweir 0 == stricmp( __argv[argi], "/nocrashreport" ) 134*cdf0e10cSrcweir ) 135*cdf0e10cSrcweir return FALSE; 136*cdf0e10cSrcweir else if ( 137*cdf0e10cSrcweir 0 == stricmp( __argv[argi], "-autocrashreport" ) || 138*cdf0e10cSrcweir 0 == stricmp( __argv[argi], "/autocrashreport" ) 139*cdf0e10cSrcweir ) 140*cdf0e10cSrcweir fAutoReport = TRUE; 141*cdf0e10cSrcweir else if ( 142*cdf0e10cSrcweir 0 == strnicmp( __argv[argi], REPORTENV_PARAM, strlen(REPORTENV_PARAM) ) || 143*cdf0e10cSrcweir 0 == strnicmp( __argv[argi], REPORTENV_PARAM2, strlen(REPORTENV_PARAM2) ) 144*cdf0e10cSrcweir ) 145*cdf0e10cSrcweir { 146*cdf0e10cSrcweir const char *envparam = __argv[argi] + strlen(REPORTENV_PARAM); 147*cdf0e10cSrcweir const char *delim = strchr(envparam, '=' ); 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir if ( delim ) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir CHAR *lpVariable; 152*cdf0e10cSrcweir CHAR *lpValue; 153*cdf0e10cSrcweir const char *variable = envparam; 154*cdf0e10cSrcweir size_t variable_len = delim - envparam; 155*cdf0e10cSrcweir const char *value = delim + 1; 156*cdf0e10cSrcweir size_t value_len = strlen(envparam) - variable_len - 1; 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir if ( '\"' == *value ) 159*cdf0e10cSrcweir { 160*cdf0e10cSrcweir const char *quote; 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir value++; 163*cdf0e10cSrcweir value_len--; 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir quote = strchr( value, '\"' ); 166*cdf0e10cSrcweir if ( quote ) 167*cdf0e10cSrcweir value_len = quote - value; 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir lpVariable = reinterpret_cast< CHAR* >( _alloca( variable_len + 1 ) ); 171*cdf0e10cSrcweir memcpy( lpVariable, variable, variable_len ); 172*cdf0e10cSrcweir lpVariable[variable_len] = 0; 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir lpValue = reinterpret_cast< CHAR* >( _alloca( value_len + 1) ); 175*cdf0e10cSrcweir memcpy( lpValue, value, value_len ); 176*cdf0e10cSrcweir lpValue[value_len] = 0; 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir SetEnvironmentVariable( lpVariable, lpValue ); 179*cdf0e10cSrcweir } 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir if ( SearchPath( NULL, TEXT( "crashrep.exe" ), NULL, aPath.getBufSizeInSymbols(), aPath, &lpFilePart ) ) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir ZeroMemory( &StartupInfo, sizeof(StartupInfo) ); 186*cdf0e10cSrcweir StartupInfo.cb = sizeof(StartupInfo.cb); 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir sntprintf( szBuffer, elementsof(szBuffer), 190*cdf0e10cSrcweir _T("%s -p %u -excp 0x%p -t %u%s"), 191*cdf0e10cSrcweir static_cast<sal_Char*>( aPath ), 192*cdf0e10cSrcweir GetCurrentProcessId(), 193*cdf0e10cSrcweir lpEP, 194*cdf0e10cSrcweir GetCurrentThreadId(), 195*cdf0e10cSrcweir fAutoReport ? _T(" -noui -send") : _T(" -noui") ); 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir if ( 198*cdf0e10cSrcweir CreateProcess( 199*cdf0e10cSrcweir NULL, 200*cdf0e10cSrcweir szBuffer, 201*cdf0e10cSrcweir NULL, 202*cdf0e10cSrcweir NULL, 203*cdf0e10cSrcweir FALSE, 204*cdf0e10cSrcweir #ifdef UNICODE 205*cdf0e10cSrcweir CREATE_UNICODE_ENVIRONMENT, 206*cdf0e10cSrcweir #else 207*cdf0e10cSrcweir 0, 208*cdf0e10cSrcweir #endif 209*cdf0e10cSrcweir NULL, NULL, &StartupInfo, &ProcessInfo ) 210*cdf0e10cSrcweir ) 211*cdf0e10cSrcweir { 212*cdf0e10cSrcweir DWORD dwExitCode; 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir WaitForSingleObject( ProcessInfo.hProcess, INFINITE ); 215*cdf0e10cSrcweir if ( GetExitCodeProcess( ProcessInfo.hProcess, &dwExitCode ) && 0 == dwExitCode ) 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir fSuccess = TRUE; 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir } 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir return fSuccess; 223*cdf0e10cSrcweir } 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir /*****************************************************************************/ 226*cdf0e10cSrcweir /* SignalHandlerFunction */ 227*cdf0e10cSrcweir /*****************************************************************************/ 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir static BOOL WINAPI IsWin95A(void) 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir OSVERSIONINFO ovi; 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir ZeroMemory( &ovi, sizeof(ovi) ); 234*cdf0e10cSrcweir ovi.dwOSVersionInfoSize = sizeof(ovi); 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir if ( GetVersionEx( &ovi ) ) 237*cdf0e10cSrcweir /* See MSDN January 2000 documentation of GetVersionEx */ 238*cdf0e10cSrcweir return (ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && 239*cdf0e10cSrcweir (ovi.dwMajorVersion <= 4) && 240*cdf0e10cSrcweir (ovi.dwMinorVersion == 0) && 241*cdf0e10cSrcweir (ovi.dwBuildNumber == 0x040003B6); 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir /* Something wrent wrong. So assume we have an older operating prior Win95 */ 244*cdf0e10cSrcweir 245*cdf0e10cSrcweir return TRUE; 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir /* magic Microsoft C++ compiler exception constant */ 249*cdf0e10cSrcweir #define EXCEPTION_MSC_CPP_EXCEPTION 0xe06d7363 250*cdf0e10cSrcweir 251*cdf0e10cSrcweir static long WINAPI SignalHandlerFunction(LPEXCEPTION_POINTERS lpEP) 252*cdf0e10cSrcweir { 253*cdf0e10cSrcweir static sal_Bool bNested = sal_False; 254*cdf0e10cSrcweir sal_Bool bRaiseCrashReporter = sal_False; 255*cdf0e10cSrcweir oslSignalInfo Info; 256*cdf0e10cSrcweir oslSignalAction Action; 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir Info.UserSignal = lpEP->ExceptionRecord->ExceptionCode; 259*cdf0e10cSrcweir Info.UserData = NULL; 260*cdf0e10cSrcweir 261*cdf0e10cSrcweir switch (lpEP->ExceptionRecord->ExceptionCode) 262*cdf0e10cSrcweir { 263*cdf0e10cSrcweir /* Transform unhandled exceptions into access violations. 264*cdf0e10cSrcweir Microsoft C++ compiler (add more for other compilers if necessary). 265*cdf0e10cSrcweir */ 266*cdf0e10cSrcweir case EXCEPTION_MSC_CPP_EXCEPTION: 267*cdf0e10cSrcweir case EXCEPTION_ACCESS_VIOLATION: 268*cdf0e10cSrcweir Info.Signal = osl_Signal_AccessViolation; 269*cdf0e10cSrcweir bRaiseCrashReporter = sal_True; 270*cdf0e10cSrcweir break; 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir case EXCEPTION_INT_DIVIDE_BY_ZERO: 273*cdf0e10cSrcweir Info.Signal = osl_Signal_IntegerDivideByZero; 274*cdf0e10cSrcweir bRaiseCrashReporter = sal_True; 275*cdf0e10cSrcweir break; 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir case EXCEPTION_FLT_DIVIDE_BY_ZERO: 278*cdf0e10cSrcweir Info.Signal = osl_Signal_FloatDivideByZero; 279*cdf0e10cSrcweir bRaiseCrashReporter = sal_True; 280*cdf0e10cSrcweir break; 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir case EXCEPTION_BREAKPOINT: 283*cdf0e10cSrcweir Info.Signal = osl_Signal_DebugBreak; 284*cdf0e10cSrcweir break; 285*cdf0e10cSrcweir 286*cdf0e10cSrcweir default: 287*cdf0e10cSrcweir Info.Signal = osl_Signal_System; 288*cdf0e10cSrcweir bRaiseCrashReporter = sal_True; 289*cdf0e10cSrcweir break; 290*cdf0e10cSrcweir } 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir if ( !bNested ) 293*cdf0e10cSrcweir { 294*cdf0e10cSrcweir bNested = sal_True; 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir if ( bRaiseCrashReporter && ReportCrash( lpEP ) || IsWin95A() ) 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir CallSignalHandler(&Info); 299*cdf0e10cSrcweir Action = osl_Signal_ActKillApp; 300*cdf0e10cSrcweir } 301*cdf0e10cSrcweir else 302*cdf0e10cSrcweir Action = CallSignalHandler(&Info); 303*cdf0e10cSrcweir } 304*cdf0e10cSrcweir else 305*cdf0e10cSrcweir Action = osl_Signal_ActKillApp; 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir switch ( Action ) 309*cdf0e10cSrcweir { 310*cdf0e10cSrcweir case osl_Signal_ActCallNextHdl: 311*cdf0e10cSrcweir return (EXCEPTION_CONTINUE_SEARCH); 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir case osl_Signal_ActAbortApp: 314*cdf0e10cSrcweir return (EXCEPTION_EXECUTE_HANDLER); 315*cdf0e10cSrcweir 316*cdf0e10cSrcweir case osl_Signal_ActKillApp: 317*cdf0e10cSrcweir SetErrorMode(SEM_NOGPFAULTERRORBOX); 318*cdf0e10cSrcweir exit(255); 319*cdf0e10cSrcweir break; 320*cdf0e10cSrcweir default: 321*cdf0e10cSrcweir break; 322*cdf0e10cSrcweir } 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir return (EXCEPTION_CONTINUE_EXECUTION); 325*cdf0e10cSrcweir } 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir /*****************************************************************************/ 328*cdf0e10cSrcweir /* osl_addSignalHandler */ 329*cdf0e10cSrcweir /*****************************************************************************/ 330*cdf0e10cSrcweir oslSignalHandler SAL_CALL osl_addSignalHandler(oslSignalHandlerFunction Handler, void* pData) 331*cdf0e10cSrcweir { 332*cdf0e10cSrcweir oslSignalHandlerImpl* pHandler; 333*cdf0e10cSrcweir 334*cdf0e10cSrcweir OSL_ASSERT(Handler != NULL); 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir if (! bInitSignal) 337*cdf0e10cSrcweir bInitSignal = InitSignal(); 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir pHandler = reinterpret_cast< oslSignalHandlerImpl* >( calloc( 1, sizeof(oslSignalHandlerImpl) ) ); 340*cdf0e10cSrcweir 341*cdf0e10cSrcweir if (pHandler != NULL) 342*cdf0e10cSrcweir { 343*cdf0e10cSrcweir pHandler->Handler = Handler; 344*cdf0e10cSrcweir pHandler->pData = pData; 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir osl_acquireMutex(SignalListMutex); 347*cdf0e10cSrcweir 348*cdf0e10cSrcweir pHandler->pNext = SignalList; 349*cdf0e10cSrcweir SignalList = pHandler; 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir osl_releaseMutex(SignalListMutex); 352*cdf0e10cSrcweir 353*cdf0e10cSrcweir return (pHandler); 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir return (NULL); 357*cdf0e10cSrcweir } 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir /*****************************************************************************/ 360*cdf0e10cSrcweir /* osl_removeSignalHandler */ 361*cdf0e10cSrcweir /*****************************************************************************/ 362*cdf0e10cSrcweir sal_Bool SAL_CALL osl_removeSignalHandler(oslSignalHandler Handler) 363*cdf0e10cSrcweir { 364*cdf0e10cSrcweir oslSignalHandlerImpl *pHandler, *pPrevious = NULL; 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir OSL_ASSERT(Handler != NULL); 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir if (! bInitSignal) 369*cdf0e10cSrcweir bInitSignal = InitSignal(); 370*cdf0e10cSrcweir 371*cdf0e10cSrcweir osl_acquireMutex(SignalListMutex); 372*cdf0e10cSrcweir 373*cdf0e10cSrcweir pHandler = SignalList; 374*cdf0e10cSrcweir 375*cdf0e10cSrcweir while (pHandler != NULL) 376*cdf0e10cSrcweir { 377*cdf0e10cSrcweir if (pHandler == Handler) 378*cdf0e10cSrcweir { 379*cdf0e10cSrcweir if (pPrevious) 380*cdf0e10cSrcweir pPrevious->pNext = pHandler->pNext; 381*cdf0e10cSrcweir else 382*cdf0e10cSrcweir SignalList = pHandler->pNext; 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir osl_releaseMutex(SignalListMutex); 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir if (SignalList == NULL) 387*cdf0e10cSrcweir bInitSignal = DeInitSignal(); 388*cdf0e10cSrcweir 389*cdf0e10cSrcweir free(pHandler); 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir return (sal_True); 392*cdf0e10cSrcweir } 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir pPrevious = pHandler; 395*cdf0e10cSrcweir pHandler = pHandler->pNext; 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir osl_releaseMutex(SignalListMutex); 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir return (sal_False); 401*cdf0e10cSrcweir } 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir /*****************************************************************************/ 404*cdf0e10cSrcweir /* osl_raiseSignal */ 405*cdf0e10cSrcweir /*****************************************************************************/ 406*cdf0e10cSrcweir oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData) 407*cdf0e10cSrcweir { 408*cdf0e10cSrcweir oslSignalInfo Info; 409*cdf0e10cSrcweir oslSignalAction Action; 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir if (! bInitSignal) 412*cdf0e10cSrcweir bInitSignal = InitSignal(); 413*cdf0e10cSrcweir 414*cdf0e10cSrcweir osl_acquireMutex(SignalListMutex); 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir Info.Signal = osl_Signal_User; 417*cdf0e10cSrcweir Info.UserSignal = UserSignal; 418*cdf0e10cSrcweir Info.UserData = UserData; 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir Action = CallSignalHandler(&Info); 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir osl_releaseMutex(SignalListMutex); 423*cdf0e10cSrcweir 424*cdf0e10cSrcweir return (Action); 425*cdf0e10cSrcweir } 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir /*****************************************************************************/ 428*cdf0e10cSrcweir /* osl_setErrorReporting */ 429*cdf0e10cSrcweir /*****************************************************************************/ 430*cdf0e10cSrcweir sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable ) 431*cdf0e10cSrcweir { 432*cdf0e10cSrcweir sal_Bool bOld = bErrorReportingEnabled; 433*cdf0e10cSrcweir bErrorReportingEnabled = bEnable; 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir return bOld; 436*cdf0e10cSrcweir } 437