* fixes for signal handling.

This commit is contained in:
marco 2003-10-27 17:12:45 +00:00
parent 896f306291
commit aebc04656f
4 changed files with 117 additions and 13 deletions

View File

@ -508,11 +508,52 @@ begin
reenable_signal:=geterrno=0;
end;
procedure SignalToRunerror(Sig: cint; var info : tsiginfo_t;Var SigContext:SigContextRec); cdecl;
var
res : word;
begin
res:=0;
case sig of
SIGFPE :
begin
Case Info.si_code Of
FPE_INTDIV : Res:=200; {integer divide fault. Div0?}
FPE_FLTOVF : Res:=205; {Overflow trap}
FPE_FLTUND : Res:=206; {Stack over/underflow}
FPE_FLTRES : Res:=216; {Device not available}
FPE_FLTINV : Res:=216; {Invalid floating point operation}
Else
Res:=208; {coprocessor error}
End;
sysResetFPU;
End;
SIGILL,
SIGBUS,
SIGSEGV :
res:=216;
end;
{$ifdef FPC_USE_SIGPROCMASK}
reenable_signal(sig);
{$endif }
{ give runtime error at the position where the signal was raised }
if res<>0 then
begin
{$ifdef I386}
HandleErrorAddrFrame(res,Pointer(SigContext.sc_eip),pointer(SigContext.sc_ebp));
{$else}
HandleError(res);
{$endif}
end;
end;
{
procedure SignalToRunerror(signo: cint); cdecl;
var
res : word;
begin
res:=0;
if signo = SIGFPE then
begin
res := 200;
@ -528,7 +569,7 @@ begin
HandleError(res);
end;
end;
}
var
act: SigActionRec;
@ -541,7 +582,8 @@ begin
{ all flags and information set to zero }
FillChar(act, sizeof(SigActionRec),0);
{ initialize handler }
act.sa_handler := @SignalToRunError;
act.sa_handler :=@SignalToRunError;
act.sa_flags:=SA_SIGINFO;
FpSigAction(SIGFPE,act,oldact);
FpSigAction(SIGSEGV,act,oldact);
FpSigAction(SIGBUS,act,oldact);
@ -628,7 +670,10 @@ End.
{
$Log$
Revision 1.4 2003-10-26 17:01:04 marco
Revision 1.5 2003-10-27 17:12:45 marco
* fixes for signal handling.
Revision 1.4 2003/10/26 17:01:04 marco
* moved sigprocmask to system
Revision 1.3 2003/09/27 13:04:58 peter

View File

@ -121,23 +121,55 @@ type sigset_t = array[0..3] of Longint;
fpr_pad : array[0..63] of char;
end;
Sigval = Record
Case Boolean OF
{ Members as suggested by Annex C of POSIX 1003.1b. }
false : (sigval_int : Longint);
True : (sigval_ptr : Pointer);
End;
TSigInfo_t = record
si_signo, { signal number }
si_errno, { errno association }
{
* Cause of signal, one of the SI_ macros or signal-specific
* values, i.e. one of the FPE_... values for SIGFPE. This
* value is equivalent to the second argument to an old-style
* FreeBSD signal handler.
}
si_code, { signal code }
si_pid : Longint; { sending process }
si_uid : Cardinal; { sender's ruid }
si_status : Longint; { exit value }
si_addr : Pointer; { faulting instruction }
si_value : SigVal; { signal value }
si_band : Cardinal; { band event for SIGPOLL }
__spare : array[0..6] of Longint; { gimme some slack
}
end;
SignalHandler = Procedure(Sig : Longint);cdecl;
PSignalHandler = ^SignalHandler;
SignalRestorer = Procedure;cdecl;
PSignalRestorer = ^SignalRestorer;
TSigAction = procedure(Sig: Longint; SigContext: SigContextRec;someptr:pointer);cdecl;
TSigAction = procedure(Sig: Longint; var sininfo:tsiginfo_t;var SigContext: SigContextRec);cdecl;
TSigset=sigset_t;
sigset=tsigset;
PSigSet = ^TSigSet;
SigActionRec = packed record
{ Handler : record
{ Handler : record
case byte of
0: (Sh: SignalHandler);
1: (Sa: TSigAction);
end;}
sa_handler : signalhandler;
sa_handler : tsigAction;
Sa_Flags : Longint;
Sa_Mask : TSigSet;
end;
@ -149,11 +181,24 @@ type sigset_t = array[0..3] of Longint;
If Act is non-nil, it is used to specify the new action.
If OldAct is non-nil the previous action is saved there.
}
const
FPE_INTOVF =1; { integer overflow }
FPE_INTDIV =2; { integer divide by zero }
FPE_FLTDIV =3; { floating point divide by zero }
FPE_FLTOVF =4; { floating point overflow }
FPE_FLTUND =5; { floating point underflow }
FPE_FLTRES =6; { floating point inexact result }
FPE_FLTINV =7; { invalid floating point operation }
FPE_FLTSUB =8; { subscript out of range }
{
$Log$
Revision 1.7 2003-01-05 19:02:29 marco
Revision 1.8 2003-10-27 17:12:45 marco
* fixes for signal handling.
Revision 1.7 2003/01/05 19:02:29 marco
* Should now work with baseunx. (gmake all works)
Revision 1.6 2002/10/26 18:27:52 marco

View File

@ -65,8 +65,6 @@ begin
ThreadRoot:=nil;
ThreadsInited:=true;
// This will install SIGCHLD signal handler
// signal() installs "one-shot" handler,
// so it is better to install and set up handler with sigaction()
@ -74,8 +72,9 @@ begin
GetMem(Act, SizeOf(SigActionRec));
GetMem(OldAct, SizeOf(SigActionRec));
Act^.sa_handler := @SIGCHLDHandler;
fillchar(Act^.sa_mask,sizeof(sigset_t),#0);
signalhandler(Act^.sa_handler) := @SIGCHLDHandler;
fillchar(Act^.sa_mask,sizeof(sigset_t),#0);
Act^.sa_flags := SA_NOCLDSTOP {or SA_NOMASK or SA_RESTART};
//Do not block all signals ??. Don't need if SA_NOMASK in flags
@ -297,7 +296,10 @@ end;
{
$Log$
Revision 1.2 2003-10-09 10:55:20 marco
Revision 1.3 2003-10-27 17:12:45 marco
* fixes for signal handling.
Revision 1.2 2003/10/09 10:55:20 marco
* fix for moving classes to rtl while cycling with 1.0 start
Revision 1.1 2003/10/06 21:01:06 peter

View File

@ -115,11 +115,16 @@ begin
end;
Function FpSignal(signum:longint;Handler:signalhandler):signalhandler;
// should be moved out of generic files. Too specific.
var sa,osa : sigactionrec;
begin
{$Ifdef BSD}
sa.sa_handler:=tsigaction(handler);
{$else}
sa.sa_handler:=handler;
{$endif}
FillChar(sa.sa_mask,sizeof(sigset),#0);
sa.sa_flags := 0;
{ if (sigintr and signum) =0 then
@ -130,7 +135,11 @@ begin
if getErrNo<>0 then
fpsignal:=NIL
else
{$ifdef BSD}
fpsignal:=signalhandler(osa.sa_handler);
{$else}
fpsignal:=osa.sa_handler;
{$endif}
end;
function xFpread(fd: cint; buf: pchar; nbytes : size_t): ssize_t; external name 'FPC_SYSC_READ';
@ -310,7 +319,10 @@ end;
{
$Log$
Revision 1.6 2003-10-13 11:37:57 marco
Revision 1.7 2003-10-27 17:12:45 marco
* fixes for signal handling.
Revision 1.6 2003/10/13 11:37:57 marco
* more small fixes
Revision 1.5 2003/10/12 14:37:10 marco