Просмотр исходного кода

* unblock signal in signalhandler, remove the sigprocmask call
from setjmp

peter 20 лет назад
Родитель
Сommit
16b121f8c4

+ 5 - 34
rtl/i386/setjump.inc

@@ -14,29 +14,6 @@
 
  **********************************************************************}
 
-{$ifdef needsigprocmask}
-const
-  JMPSIG_BLOCK   = 0;
-  JMPSIG_SETMASK = 2;
-
-
-{$ifdef FPC_USE_LIBC}
-  function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'sigprocmask';
-{$else}
-  function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'FPC_SYSC_SIGPROCMASK';
-{$endif}
-
-procedure savesigmask(var s:jmp_buf);
-begin
-  jmpsigprocmask(JMPSIG_BLOCK,nil,@s.sigmask);
-end;
-
-procedure restoresigmask(var s:jmp_buf);
-begin
-  jmpsigprocmask(JMPSIG_SETMASK,@s.sigmask,nil);
-end;
-{$endif needsigprocmask}
-
 Function SetJmp (Var S : Jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];
 asm
 {$ifndef REGCALL}
@@ -56,9 +33,6 @@ asm
 {$endif}
   movl %edi,16(%eax)
   movl 8(%eax),%edi
-{$ifdef needsigprocmask}
-  call savesigmask
-{$endif needsigprocmask}
   xorl %eax,%eax
 end['EAX'];
 
@@ -66,13 +40,6 @@ end['EAX'];
 Procedure longJmp (Var S : Jmp_buf; value : longint); assembler;[Public, alias : 'FPC_LONGJMP'];
 asm
 {$ifdef REGCALL}
-{$ifdef needsigprocmask}
-  movl %edx, %ebx
-  movl %eax, %esi
-  call restoresigmask
-  movl %ebx, %edx
-  movl %esi, %eax
-{$endif needsigprocmask}
   xchgl %edx,%eax
 {$else}
   movl 8(%ebp),%edx
@@ -92,7 +59,11 @@ end;
 
 {
   $Log$
-  Revision 1.8  2005-02-14 17:13:22  peter
+  Revision 1.9  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.8  2005/02/14 17:13:22  peter
     * truncate log
 
   Revision 1.7  2005/02/13 20:01:37  peter

+ 5 - 25
rtl/i386/setjumph.inc

@@ -14,34 +14,10 @@
 
  **********************************************************************}
 
-{$ifndef VER1_0}
-  {$if (FPC_VERSION>1) or ((FPC_RELEASE>=9) and (FPC_PATCH>6))}
-    {$ifdef linux}
-      {$define needsigprocmask}
-    {$endif}
-  {$endif}
-{$endif}
-
-{$ifdef needsigprocmask}
-const
-{$ifdef FPC_USE_LIBC}
-  jmpbufsigmaskwords = 1024 div 32;
-{$else}
-  jmpbufsigmaskwords = 128 div 32;
-{$endif}
-
-type
-  tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
-  pjmpsigset=^tjmpsigset;
-{$endif needsigprocmask}
-
 Type
   jmp_buf = packed record
     ebx,esi,edi : Longint;
     bp,sp,pc : Pointer;
-{$ifdef needsigprocmask}
-    sigmask : tjmpsigset;
-{$endif needsigprocmask}
     end;
   PJmp_buf = ^jmp_buf;
 
@@ -50,7 +26,11 @@ Procedure longjmp (Var S : Jmp_buf; value : longint);
 
 {
   $Log$
-  Revision 1.7  2005-02-14 17:13:22  peter
+  Revision 1.8  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.7  2005/02/14 17:13:22  peter
     * truncate log
 
   Revision 1.6  2005/01/24 16:54:16  peter

+ 7 - 2
rtl/linux/arm/sighnd.inc

@@ -34,14 +34,19 @@ begin
     SIGSEGV :
         res:=216;
   end;
-{ give runtime error at the position where the signal was raised }
+  reenable_signal(sig);
+  { give runtime error at the position where the signal was raised }
   if res<>0 then
     HandleErrorAddrFrame(res,pointer(uContext^.uc_mcontext.arm_ip),pointer(uContext^.uc_mcontext.arm_fp));
 end;
 
 {
   $Log$
-  Revision 1.4  2005-02-14 17:13:30  peter
+  Revision 1.5  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.4  2005/02/14 17:13:30  peter
     * truncate log
 
   Revision 1.3  2005/01/30 18:01:15  peter

+ 6 - 1
rtl/linux/i386/sighnd.inc

@@ -68,6 +68,7 @@ begin
     SIGSEGV :
         res:=216;
   end;
+  reenable_signal(sig);
 { give runtime error at the position where the signal was raised }
   if res<>0 then
     HandleErrorAddrFrame(res,pointer(SigContext^.eip),pointer(SigContext^.ebp));
@@ -75,7 +76,11 @@ end;
 
 {
   $Log$
-  Revision 1.7  2005-02-17 18:05:57  peter
+  Revision 1.8  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.7  2005/02/17 18:05:57  peter
     * change order of if to prevent always stack overflow instead
       of generic fpu error when multiple states are set
 

+ 6 - 1
rtl/linux/powerpc/sighnd.inc

@@ -46,6 +46,7 @@ begin
     SIGSEGV :
         res:=216;
   end;
+  reenable_signal(sig);
   { give runtime error at the position where the signal was raised }
   if res<>0 then
     HandleErrorAddrFrame(res,pointer(SigContext^.pt_regs^.nip),pointer(SigContext^.pt_regs^.gpr[1]));
@@ -53,7 +54,11 @@ end;
 
 {
   $Log$
-  Revision 1.6  2005-02-14 17:13:30  peter
+  Revision 1.7  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.6  2005/02/14 17:13:30  peter
     * truncate log
 
   Revision 1.5  2005/01/30 18:01:15  peter

+ 6 - 1
rtl/linux/sparc/sighnd.inc

@@ -66,6 +66,7 @@ begin
           res:=216;
         end;
   end;
+  reenable_signal(sig);
   { give runtime error at the position where the signal was raised }
   if res<>0 then
     HandleErrorAddrFrame(res,addr,nil);
@@ -73,7 +74,11 @@ end;
 
 {
   $Log$
-  Revision 1.9  2005-02-14 17:13:30  peter
+  Revision 1.10  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.9  2005/02/14 17:13:30  peter
     * truncate log
 
   Revision 1.8  2005/02/05 23:46:12  peter

+ 21 - 1
rtl/linux/system.pp

@@ -96,6 +96,22 @@ End;
                          SystemUnit Initialization
 *****************************************************************************}
 
+function  reenable_signal(sig : longint) : boolean;
+var
+  e : TSigSet;
+  i,j : byte;
+begin
+  fillchar(e,sizeof(e),#0);
+  { set is 1 based PM }
+  dec(sig);
+  i:=sig mod 32;
+  j:=sig div 32;
+  e[j]:=1 shl i;
+  fpsigprocmask(SIG_UNBLOCK,@e,nil);
+  reenable_signal:=geterrno=0;
+end;
+
+
 // signal handler is arch dependant due to processorexception to language
 // exception translation
 
@@ -238,7 +254,11 @@ End.
 
 {
   $Log$
-  Revision 1.24  2005-02-14 17:13:30  peter
+  Revision 1.25  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.24  2005/02/14 17:13:30  peter
     * truncate log
 
   Revision 1.23  2005/02/13 21:47:56  peter

+ 5 - 15
rtl/linux/x86_64/sighnd.inc

@@ -32,20 +32,6 @@ function GetFPUState(const SigContext : TSigContext) : word;
   {$endif SYSTEM_DEBUG}
   end;
 
-function  reenable_signal(sig : longint) : boolean;
-var
-  e,olde : TSigSet;
-  i,j : byte;
-begin
-  fillchar(e,sizeof(e),#0);
-  { set is 1 based PM }
-  dec(sig);
-  i:=sig mod 32;
-  j:=sig div 32;
-  e[j]:=1 shl i;
-  fpsigprocmask(SIG_UNBLOCK,@e,nil);
-  reenable_signal:=geterrno=0;
-end;
 
 procedure SignalToRunerror(sig : longint; SigInfo: PSigInfo; SigContext: PSigContext); cdecl;
   var
@@ -91,7 +77,11 @@ procedure SignalToRunerror(sig : longint; SigInfo: PSigInfo; SigContext: PSigCon
 
 {
   $Log$
-  Revision 1.4  2005-02-14 17:13:30  peter
+  Revision 1.5  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.4  2005/02/14 17:13:30  peter
     * truncate log
 
   Revision 1.3  2005/01/30 18:01:15  peter

+ 5 - 36
rtl/sparc/setjump.inc

@@ -19,30 +19,6 @@
 #define RW_FP [%fp + 0x48]
 }
 
-{$ifdef needsigprocmask}
-const
-  JMPSIG_BLOCK   = 1;
-  JMPSIG_SETMASK = 4;
-
-{$ifdef FPC_USE_LIBC}
-  function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'sigprocmask';
-{$else}
-  function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'FPC_SYSC_SIGPROCMASK';
-{$endif}
-
-procedure savesigmask(var s:jmp_buf);
-begin
-  jmpsigprocmask(JMPSIG_BLOCK,nil,@s.sigmask);
-end;
-
-procedure restoresigmask(var s:jmp_buf);
-begin
-  jmpsigprocmask(JMPSIG_SETMASK,@s.sigmask,nil);
-end;
-{$endif needsigprocmask}
-
-
-
 procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,alias:'FPC_LONGJMP'];
   asm
     // Store our arguments in global registers so we can still
@@ -88,12 +64,6 @@ procedure longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,
     sub     %fp, 64, %sp    // Allocate a register frame.
     st      %g3, [%fp+48]   // Set saved FP on restore below.
 
-{$ifdef needsigprocmask}
-    mov   %o1,%o0
-    call  restoresigmask
-    nop
-{$endif needsigprocmask}
-
     ld      [%o1+8], %o7    // Set return PC.
 
     retl
@@ -117,18 +87,17 @@ function setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC
     st      %sp, [%o0]
     st      %fp, [%o0+4]
 
-{$ifdef needsigprocmask}
-    call   savesigmask
-    nop
-{$endif needsigprocmask}
-
     ld      [%o0+8], %o7
     mov     %g0, %o0
   end;
 
 {
   $Log$
-  Revision 1.12  2005-02-14 17:13:31  peter
+  Revision 1.13  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.12  2005/02/14 17:13:31  peter
     * truncate log
 
   Revision 1.11  2005/02/13 20:01:38  peter

+ 5 - 19
rtl/sparc/setjumph.inc

@@ -38,20 +38,6 @@ Guardian:/usr/local/src/glibc-2.2.3/sysdeps/sparc/sparc32# more __longjmp.S
 {@Define the machine-dependent type `jmp_buf'.  SPARC version.}
 
 
-{$ifdef linux}
-  {$define needsigprocmask}
-{$endif}
-
-
-{$ifdef needsigprocmask}
-const
-  jmpbufsigmaskwords = 128 div 32;
-
-type
-  tjmpsigset=array[0..jmpbufsigmaskwords-1] of longint;
-  pjmpsigset=^tjmpsigset;
-{$endif needsigprocmask}
-
 type
   jmp_buf=packed record
     {stack pointer}
@@ -60,10 +46,6 @@ type
     JB_FP,
     {program counter}
     JB_PV:Pointer;
-
-{$ifdef needsigprocmask}
-    sigmask : tjmpsigset;
-{$endif needsigprocmask}
   end;
   Pjmp_buf=^jmp_buf;
 
@@ -71,7 +53,11 @@ function setjmp(var S:jmp_buf):longint;
 procedure longjmp(var S:jmp_buf;value:longint);
 {
   $Log$
-  Revision 1.7  2005-02-14 17:13:31  peter
+  Revision 1.8  2005-04-24 21:19:22  peter
+    * unblock signal in signalhandler, remove the sigprocmask call
+      from setjmp
+
+  Revision 1.7  2005/02/14 17:13:31  peter
     * truncate log
 
   Revision 1.6  2005/01/20 16:38:28  peter