2
0
Эх сурвалжийг харах

* restore sigprocmask for linux

peter 20 жил өмнө
parent
commit
7395e7e546

+ 33 - 1
rtl/i386/setjump.inc

@@ -14,6 +14,24 @@
 
  **********************************************************************}
 
+{$ifdef needsigprocmask}
+const
+  JMPSIG_BLOCK   = 0;
+  JMPSIG_SETMASK = 2;
+
+function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'FPC_SYSC_SIGPROCMASK';
+
+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}
@@ -33,6 +51,9 @@ asm
 {$endif}
   movl %edi,16(%eax)
   movl 8(%eax),%edi
+{$ifdef needsigprocmask}
+  call savesigmask
+{$endif needsigprocmask}  
   xorl %eax,%eax
 end['EAX'];
 
@@ -40,11 +61,19 @@ 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
   movl 12(%ebp),%eax
 {$endif}
+
   movl (%edx),%ebx
   movl 4(%edx),%esi
   movl 8(%edx),%edi
@@ -58,7 +87,10 @@ end;
 
 {
   $Log$
-  Revision 1.5  2003-12-04 21:42:07  peter
+  Revision 1.6  2005-01-20 16:38:28  peter
+    * restore sigprocmask for linux
+
+  Revision 1.5  2003/12/04 21:42:07  peter
     * register calling updates
 
   Revision 1.4  2003/11/11 21:08:17  peter

+ 25 - 1
rtl/i386/setjumph.inc

@@ -14,10 +14,31 @@
 
  **********************************************************************}
 
+{$ifdef linux}
+  {$define needsigprocmask}
+{$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;
 
@@ -26,7 +47,10 @@ Procedure longjmp (Var S : Jmp_buf; value : longint);
 
 {
   $Log$
-  Revision 1.4  2002-09-15 10:04:31  carl
+  Revision 1.5  2005-01-20 16:38:28  peter
+    * restore sigprocmask for linux
+
+  Revision 1.4  2002/09/15 10:04:31  carl
     * make the record packed (just in case)
 
   Revision 1.3  2002/09/07 16:01:19  peter

+ 4 - 5
rtl/sparc/setjump.inc

@@ -19,10 +19,6 @@
 #define RW_FP [%fp + 0x48]
 }
 
-{$ifdef linux}
-  {$define needsigprocmask}
-{$endif}
-
 {$ifdef needsigprocmask}
 const
   JMPSIG_BLOCK   = 1;
@@ -128,7 +124,10 @@ function setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC
 
 {
   $Log$
-  Revision 1.9  2004-09-12 12:04:22  peter
+  Revision 1.10  2005-01-20 16:38:28  peter
+    * restore sigprocmask for linux
+
+  Revision 1.9  2004/09/12 12:04:22  peter
     * restore traps when returning with longjmp
 
   Revision 1.8  2004/05/31 10:43:00  peter

+ 18 - 1
rtl/sparc/setjumph.inc

@@ -36,12 +36,23 @@ 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}
     JB_SP,
@@ -50,14 +61,20 @@ type
     {program counter}
     JB_PV:Pointer;
     
+{$ifdef needsigprocmask}
     sigmask : tjmpsigset;
+{$endif needsigprocmask}
   end;
   Pjmp_buf=^jmp_buf;
+  
 function setjmp(var S:jmp_buf):longint;
 procedure longjmp(var S:jmp_buf;value:longint);
 {
   $Log$
-  Revision 1.5  2004-09-12 12:04:23  peter
+  Revision 1.6  2005-01-20 16:38:28  peter
+    * restore sigprocmask for linux
+
+  Revision 1.5  2004/09/12 12:04:23  peter
     * restore traps when returning with longjmp
 
   Revision 1.4  2003/01/05 21:32:35  mazen