xref: /aoo41x/main/sal/osl/os2/signal.c (revision 647f063d)
1*647f063dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*647f063dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*647f063dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*647f063dSAndrew Rist  * distributed with this work for additional information
6*647f063dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*647f063dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*647f063dSAndrew Rist  * "License"); you may not use this file except in compliance
9*647f063dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*647f063dSAndrew Rist  *
11*647f063dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*647f063dSAndrew Rist  *
13*647f063dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*647f063dSAndrew Rist  * software distributed under the License is distributed on an
15*647f063dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*647f063dSAndrew Rist  * KIND, either express or implied.  See the License for the
17*647f063dSAndrew Rist  * specific language governing permissions and limitations
18*647f063dSAndrew Rist  * under the License.
19*647f063dSAndrew Rist  *
20*647f063dSAndrew Rist  *************************************************************/
21*647f063dSAndrew Rist 
22*647f063dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir 
25cdf0e10cSrcweir /* system headers */
26cdf0e10cSrcweir #include "system.h"
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <osl/diagnose.h>
29cdf0e10cSrcweir #include <osl/mutex.h>
30cdf0e10cSrcweir #include <osl/signal.h>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir typedef struct _oslSignalHandlerImpl
33cdf0e10cSrcweir {
34cdf0e10cSrcweir 	oslSignalHandlerFunction      Handler;
35cdf0e10cSrcweir 	void*			        	  pData;
36cdf0e10cSrcweir 	struct _oslSignalHandlerImpl* pNext;
37cdf0e10cSrcweir } oslSignalHandlerImpl;
38cdf0e10cSrcweir 
39cdf0e10cSrcweir static sal_Bool				  bErrorReportingEnabled = sal_True;
40cdf0e10cSrcweir static sal_Bool  			  bInitSignal = sal_False;
41cdf0e10cSrcweir static oslMutex 			  SignalListMutex;
42cdf0e10cSrcweir static oslSignalHandlerImpl*  SignalList;
43cdf0e10cSrcweir 
44cdf0e10cSrcweir /*static*//* ULONG _Export APIENTRY SignalHandlerFunction(PEXCEPTIONREPORTRECORD pERepRec,
45cdf0e10cSrcweir                                             PEXCEPTIONREGISTRATIONRECORD,
46cdf0e10cSrcweir                                             PCONTEXTRECORD, PVOID);
47cdf0e10cSrcweir */
48cdf0e10cSrcweir /*static*/ ULONG __declspec(dllexport) APIENTRY SignalHandlerFunction(PEXCEPTIONREPORTRECORD pERepRec,
49cdf0e10cSrcweir                                             PEXCEPTIONREGISTRATIONRECORD,
50cdf0e10cSrcweir                                             PCONTEXTRECORD, PVOID);
51cdf0e10cSrcweir static EXCEPTIONREGISTRATIONRECORD ExcptHandler = { 0, SignalHandlerFunction };
52cdf0e10cSrcweir 
InitSignal(void)53cdf0e10cSrcweir static sal_Bool InitSignal( void )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir 	SignalListMutex = osl_createMutex();
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 	ExcptHandler.ExceptionHandler = (_ERR *) &SignalHandlerFunction;
58cdf0e10cSrcweir 	/* DosSetExceptionHandler(&ExcptHandler); */
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 	return sal_True;
61cdf0e10cSrcweir }
62cdf0e10cSrcweir 
DeInitSignal(void)63cdf0e10cSrcweir static sal_Bool DeInitSignal( void )
64cdf0e10cSrcweir {
65cdf0e10cSrcweir 	/* DosUnsetExceptionHandler(&ExcptHandler); */
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 	osl_destroyMutex(SignalListMutex);
68cdf0e10cSrcweir 
69cdf0e10cSrcweir 	return sal_False;
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
CallSignalHandler(oslSignalInfo * pInfo)72cdf0e10cSrcweir static oslSignalAction CallSignalHandler(oslSignalInfo *pInfo)
73cdf0e10cSrcweir {
74cdf0e10cSrcweir 	oslSignalHandlerImpl* pHandler = SignalList;
75cdf0e10cSrcweir 	oslSignalAction Action = osl_Signal_ActCallNextHdl;
76cdf0e10cSrcweir 
77cdf0e10cSrcweir 	while (pHandler != NULL)
78cdf0e10cSrcweir 	{
79cdf0e10cSrcweir 		if ((Action = pHandler->Handler(pHandler->pData, pInfo)) != osl_Signal_ActCallNextHdl)
80cdf0e10cSrcweir 			break;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 		pHandler = pHandler->pNext;
83cdf0e10cSrcweir 	}
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 	return Action;
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir /*****************************************************************************/
89cdf0e10cSrcweir /* SignalHandlerFunction	*/
90cdf0e10cSrcweir /*****************************************************************************/
SignalHandlerFunction(PEXCEPTIONREPORTRECORD pERepRec,PEXCEPTIONREGISTRATIONRECORD pERegRec,PCONTEXTRECORD pConRec,PVOID pReserved)91cdf0e10cSrcweir /*static*/ ULONG __declspec(dllexport) APIENTRY SignalHandlerFunction(PEXCEPTIONREPORTRECORD pERepRec,
92cdf0e10cSrcweir                                             PEXCEPTIONREGISTRATIONRECORD pERegRec,
93cdf0e10cSrcweir                                             PCONTEXTRECORD pConRec, PVOID pReserved)
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 	oslSignalInfo	 Info;
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 	Info.UserSignal = pERepRec->ExceptionNum;
98cdf0e10cSrcweir 	Info.UserData   = NULL;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 	switch (pERepRec->ExceptionNum)
101cdf0e10cSrcweir 	{
102cdf0e10cSrcweir 		case XCPT_ACCESS_VIOLATION:
103cdf0e10cSrcweir 			Info.Signal = osl_Signal_AccessViolation;
104cdf0e10cSrcweir 			break;
105cdf0e10cSrcweir 
106cdf0e10cSrcweir 		case XCPT_INTEGER_DIVIDE_BY_ZERO:
107cdf0e10cSrcweir 			Info.Signal = osl_Signal_IntegerDivideByZero;
108cdf0e10cSrcweir 			break;
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 		case XCPT_BREAKPOINT:
111cdf0e10cSrcweir 			Info.Signal = osl_Signal_DebugBreak;
112cdf0e10cSrcweir 			break;
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 		default:
115cdf0e10cSrcweir 			Info.Signal = osl_Signal_System;
116cdf0e10cSrcweir 			break;
117cdf0e10cSrcweir 	}
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	switch (CallSignalHandler(&Info))
120cdf0e10cSrcweir 	{
121cdf0e10cSrcweir 		case osl_Signal_ActCallNextHdl:
122cdf0e10cSrcweir 			return (XCPT_CONTINUE_SEARCH);
123cdf0e10cSrcweir 
124cdf0e10cSrcweir 		case osl_Signal_ActAbortApp:
125cdf0e10cSrcweir 			return (XCPT_CONTINUE_SEARCH);
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 		case osl_Signal_ActKillApp:
128cdf0e10cSrcweir 			exit(255);
129cdf0e10cSrcweir 			break;
130cdf0e10cSrcweir 	}
131cdf0e10cSrcweir 
132cdf0e10cSrcweir 	return (XCPT_CONTINUE_SEARCH);
133cdf0e10cSrcweir }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir /*****************************************************************************/
136cdf0e10cSrcweir /* osl_addSignalHandler */
137cdf0e10cSrcweir /*****************************************************************************/
osl_addSignalHandler(oslSignalHandlerFunction Handler,void * pData)138cdf0e10cSrcweir oslSignalHandler SAL_CALL osl_addSignalHandler(oslSignalHandlerFunction Handler, void* pData)
139cdf0e10cSrcweir {
140cdf0e10cSrcweir 	oslSignalHandlerImpl* pHandler;
141cdf0e10cSrcweir 
142cdf0e10cSrcweir 	OSL_ASSERT(Handler != NULL);
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	if (! bInitSignal)
145cdf0e10cSrcweir 		bInitSignal = InitSignal();
146cdf0e10cSrcweir 
147cdf0e10cSrcweir 	pHandler = (oslSignalHandlerImpl*) calloc(1, sizeof(oslSignalHandlerImpl));
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 	if (pHandler != NULL)
150cdf0e10cSrcweir 	{
151cdf0e10cSrcweir 		pHandler->Handler = Handler;
152cdf0e10cSrcweir 		pHandler->pData   = pData;
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 		osl_acquireMutex(SignalListMutex);
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 		pHandler->pNext = SignalList;
157cdf0e10cSrcweir 		SignalList      = pHandler;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 		osl_releaseMutex(SignalListMutex);
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 		return (pHandler);
162cdf0e10cSrcweir 	}
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 	return (NULL);
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir /*****************************************************************************/
168cdf0e10cSrcweir /* osl_removeSignalHandler */
169cdf0e10cSrcweir /*****************************************************************************/
osl_removeSignalHandler(oslSignalHandler Handler)170cdf0e10cSrcweir sal_Bool SAL_CALL osl_removeSignalHandler(oslSignalHandler Handler)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir 	oslSignalHandlerImpl *pHandler, *pPrevious = NULL;
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 	OSL_ASSERT(Handler != NULL);
175cdf0e10cSrcweir 
176cdf0e10cSrcweir 	if (! bInitSignal)
177cdf0e10cSrcweir 		bInitSignal = InitSignal();
178cdf0e10cSrcweir 
179cdf0e10cSrcweir 	osl_acquireMutex(SignalListMutex);
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 	pHandler = SignalList;
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	while (pHandler != NULL)
184cdf0e10cSrcweir 	{
185cdf0e10cSrcweir 		if (pHandler == Handler)
186cdf0e10cSrcweir 		{
187cdf0e10cSrcweir 			if (pPrevious)
188cdf0e10cSrcweir 				pPrevious->pNext = pHandler->pNext;
189cdf0e10cSrcweir 			else
190cdf0e10cSrcweir 				SignalList = pHandler->pNext;
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 			osl_releaseMutex(SignalListMutex);
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 			if (SignalList == NULL )
195cdf0e10cSrcweir 				bInitSignal = DeInitSignal();
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 			free(pHandler);
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 			return (sal_True);
200cdf0e10cSrcweir 		}
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 		pPrevious = pHandler;
203cdf0e10cSrcweir 		pHandler  = pHandler->pNext;
204cdf0e10cSrcweir 	}
205cdf0e10cSrcweir 
206cdf0e10cSrcweir 	osl_releaseMutex(SignalListMutex);
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	return (sal_False);
209cdf0e10cSrcweir }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir /*****************************************************************************/
212cdf0e10cSrcweir /* osl_raiseSignal */
213cdf0e10cSrcweir /*****************************************************************************/
osl_raiseSignal(sal_Int32 UserSignal,void * UserData)214cdf0e10cSrcweir oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData)
215cdf0e10cSrcweir {
216cdf0e10cSrcweir 	oslSignalInfo   Info;
217cdf0e10cSrcweir 	oslSignalAction Action;
218cdf0e10cSrcweir 
219cdf0e10cSrcweir 	if (! bInitSignal)
220cdf0e10cSrcweir 		bInitSignal = InitSignal();
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 	osl_acquireMutex(SignalListMutex);
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 	Info.Signal     = osl_Signal_User;
225cdf0e10cSrcweir 	Info.UserSignal = UserSignal;
226cdf0e10cSrcweir 	Info.UserData   = UserData;
227cdf0e10cSrcweir 
228cdf0e10cSrcweir 	Action = CallSignalHandler(&Info);
229cdf0e10cSrcweir 
230cdf0e10cSrcweir 	osl_releaseMutex(SignalListMutex);
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 	return (Action);
233cdf0e10cSrcweir }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir /*****************************************************************************/
236cdf0e10cSrcweir /* osl_setErrorReporting */
237cdf0e10cSrcweir /*****************************************************************************/
osl_setErrorReporting(sal_Bool bEnable)238cdf0e10cSrcweir sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable )
239cdf0e10cSrcweir {
240cdf0e10cSrcweir 	sal_Bool bOld = bErrorReportingEnabled;
241cdf0e10cSrcweir 	bErrorReportingEnabled = bEnable;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 	return bOld;
244cdf0e10cSrcweir }
245cdf0e10cSrcweir 
246