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