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