]> sourceware.org Git - newlib-cygwin.git/commitdiff
* debug.h: Add regparm attributes to some functions.
authorChristopher Faylor <me@cgf.cx>
Fri, 12 Jan 2001 05:38:25 +0000 (05:38 +0000)
committerChristopher Faylor <me@cgf.cx>
Fri, 12 Jan 2001 05:38:25 +0000 (05:38 +0000)
* signal.cc (sigaction): Don't treat SIGCONT specially.
* exceptions.cc (interrupt_setup): Save sa_flags of interrupted signal for
later use.
(sig_handler): Default any stopping signal to SIGSTOP.
(call_signal_handler): New function.
(sigdelayed0): New function.
* sigproc.cc (sigproc_init): Initialize SIGSTOP sigaction for special behavior.
* sigproc.h: Define call_signal_handler.
* syscalls.cc (_read): Allow restartable signal behavior.

winsup/cygwin/ChangeLog
winsup/cygwin/debug.h
winsup/cygwin/exceptions.cc
winsup/cygwin/perthread.h
winsup/cygwin/signal.cc
winsup/cygwin/sigproc.cc
winsup/cygwin/sigproc.h
winsup/cygwin/syscalls.cc

index a44049f91d038f3d6259d75bd7b55174c11f8afb..506f5229c0656895e6a0937213a5bd935ff4425f 100644 (file)
@@ -1,3 +1,17 @@
+Fri Jan 12 00:35:15 2001  Christopher Faylor <cgf@cygnus.com>
+
+       * debug.h: Add regparm attributes to some functions.
+
+       * signal.cc (sigaction): Don't treat SIGCONT specially.
+
+       * exceptions.cc (interrupt_setup): Save sa_flags of interrupted signal for later use.
+       (sig_handler): Default any stopping signal to SIGSTOP.
+       (call_signal_handler): New function.
+       (sigdelayed0): New function.
+       * sigproc.cc (sigproc_init): Initialize SIGSTOP sigaction for special behavior.
+       * sigproc.h: Define call_signal_handler.
+       * syscalls.cc (_read): Allow restartable signal behavior.
+
 Thu Jan 11 13:17:00 2001  Corinna Vinschen <corinna@vinschen.de>
 
        * fhandler.h (fhandler_base): New method `fixup_mmap_after_fork'.
index ff4313f7729b3427e59eb429c65f3e18d982cba1..2f06286c73e343341d036b0e9f04e9bd399b72b1 100644 (file)
@@ -27,9 +27,9 @@ DWORD __stdcall WFMO (DWORD, CONST HANDLE *, BOOL, DWORD) __attribute__ ((regpar
 #define _DEBUG_H_
 
 void threadname_init ();
-HANDLE __stdcall makethread (LPTHREAD_START_ROUTINE, LPVOID, DWORD, const char *);
-const char * __stdcall threadname (DWORD, int lockit = TRUE);
-void __stdcall regthread (const char *, DWORD);
+HANDLE __stdcall makethread (LPTHREAD_START_ROUTINE, LPVOID, DWORD, const char *) __attribute__ ((regparm(3)));
+const char * __stdcall threadname (DWORD, int lockit = TRUE) __attribute__ ((regparm(2)));
+void __stdcall regthread (const char *, DWORD) __attribute__ ((regparm(1)));
 int __stdcall iscygthread ();
 
 #ifndef DEBUGGING
index c053cd938136dba2d67d86a4b1ca646001902ec8..fd7de95fb809a4795bb7eecab967591589184682 100644 (file)
@@ -31,6 +31,7 @@ extern "C" {
 static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *);
 extern void sigreturn ();
 extern void sigdelayed ();
+extern void sigdelayed0 ();
 extern void siglast ();
 extern DWORD __no_sig_start, __no_sig_end;
 };
@@ -634,6 +635,7 @@ interrupt_setup (int sig, void *handler, DWORD retaddr, DWORD *retaddr_on_stack,
   sigsave.oldmask = myself->getsigmask ();     // Remember for restoration
   /* FIXME: Not multi-thread aware */
   sigsave.newmask = myself->getsigmask () | siga.sa_mask | SIGTOMASK (sig);
+  sigsave.sa_flags = siga.sa_flags;
   sigsave.func = (void (*)(int)) handler;
   sigsave.sig = sig;
   sigsave.saved_errno = -1;            // Flag: no errno to save
@@ -987,6 +989,7 @@ sig_handle (int sig)
 
 stop:
   handler = (void *) sig_handle_tty_stop;
+  thissig = myself->getsig (SIGSTOP);
 
 dosig:
   /* Dispatch to the appropriate function. */
@@ -1091,6 +1094,16 @@ reset_signal_arrived ()
   sigproc_printf ("reset signal_arrived");
 }
 
+int __stdcall
+call_signal_handler ()
+{
+  int sa_flags = sigsave.sa_flags;
+  sigproc_printf ("sa_flags %p", sa_flags);
+  *sigsave.retaddr_on_stack = sigsave.retaddr;
+  sigdelayed0 ();
+  return sa_flags & SA_RESTART;
+}
+
 void unused_sig_wrapper ()
 {
 /* Signal cleanup stuff.  Cleans up stack (too bad that we didn't
@@ -1123,6 +1136,7 @@ _sigreturn:
 __no_sig_start:
 _sigdelayed:
        pushl   %2                      # original return address
+_sigdelayed0:
        pushl   %%ebp
        movl    %%esp,%%ebp
        pushf
index 89b97d4fb9463142773db4f0fc1c6de06cad8c33..889a5d8c4fa496ede748ac45867591279e62e85d 100644 (file)
@@ -1,6 +1,6 @@
 /* perthread.h: Header file for cygwin synchronization primitives.
 
-   Copyright 2000 Cygnus Solutions.
+   Copyright 2000, 2001 Red Hat, Inc.
 
    Written by Christopher Faylor <cgf@cygnus.com>
 
@@ -96,6 +96,7 @@ struct signal_dispatch
   void (*func) (int);
   int sig;
   int saved_errno;
+  int sa_flags;
   DWORD oldmask;
   DWORD newmask;
   DWORD retaddr;
index f1a5131e1888e2d52cc5bdb5a3589b0fc6a20317..23bc9f470d011f593a05fd284cfd8cef2cb65123 100644 (file)
@@ -262,8 +262,7 @@ sigaction (int sig, const struct sigaction *newact, struct sigaction *oldact)
 
   if (newact)
     {
-      if ((sig == SIGKILL || sig == SIGSTOP || sig == SIGCONT) &&
-         newact->sa_handler != SIG_DFL)
+      if ((sig == SIGKILL || sig == SIGSTOP) && newact->sa_handler != SIG_DFL)
        {
          set_errno (EINVAL);
          return -1;
index ceea74833b1253cc07b74bb015fe97a7a10de4fa..21b325dde0c05512522e78aa40e82341e4a8de53 100644 (file)
@@ -562,6 +562,7 @@ sigproc_init ()
     }
   memset (w, 0, sizeof *w);    // Just to be safe
 
+  myself->getsig (SIGSTOP).sa_flags = SA_RESTART | SA_NODEFER;
   sigproc_printf ("process/signal handling enabled(%x)", myself->process_state);
   return;
 }
index 6e471dd2fe33e7897db4713364c461ecf0592833..a5b72bca216aa814770fcf1a54c7d6fda82ec5e5 100644 (file)
@@ -98,6 +98,7 @@ BOOL __stdcall pid_exists (pid_t) __attribute__ ((regparm(1)));
 int __stdcall sig_send (_pinfo *, int, DWORD ebp = (DWORD) __builtin_frame_address (0))  __attribute__ ((regparm(3)));
 void __stdcall signal_fixup_after_fork ();
 void __stdcall signal_fixup_after_exec (bool);
+extern "C" int __stdcall call_signal_handler ();
 
 extern char myself_nowait_dummy[];
 extern char myself_nowait_nonmain_dummy[];
index 1cf7d6284d51dafd99a83455200b258b39945413..0f68344228c764f97726a268491e275a591effb9 100644 (file)
@@ -220,6 +220,8 @@ _read (int fd, void *ptr, size_t len)
 {
   sigframe thisframe (mainthread);
   extern int sigcatchers;
+
+beg:
   if (fdtab.not_open (fd))
     {
       set_errno (EBADF);
@@ -257,8 +259,11 @@ _read (int fd, void *ptr, size_t len)
     }
 
 out:
-  syscall_printf ("%d = read (%d<%s>, %p, %d), errno %d", res, fd, fh->get_name (),
-                 ptr, len, get_errno ());
+  if (res < 0 && WaitForSingleObject (signal_arrived, 0) == WAIT_OBJECT_0 &&
+      call_signal_handler ())
+    goto beg;
+  syscall_printf ("%d = read (%d<%s>, %p, %d), bin %d, errno %d", res, fd, fh->get_name (),
+                 ptr, len, fh->get_r_binary (), get_errno ());
   MALLOC_CHECK;
   return res;
 }
This page took 0.04154 seconds and 5 git commands to generate.