mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-22 08:46:17 +08:00
* 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.
This commit is contained in:
parent
e45ab89012
commit
c3d62298ba
@ -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>
|
Thu Jan 11 13:17:00 2001 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler.h (fhandler_base): New method `fixup_mmap_after_fork'.
|
* fhandler.h (fhandler_base): New method `fixup_mmap_after_fork'.
|
||||||
|
@ -27,9 +27,9 @@ DWORD __stdcall WFMO (DWORD, CONST HANDLE *, BOOL, DWORD) __attribute__ ((regpar
|
|||||||
#define _DEBUG_H_
|
#define _DEBUG_H_
|
||||||
|
|
||||||
void threadname_init ();
|
void threadname_init ();
|
||||||
HANDLE __stdcall makethread (LPTHREAD_START_ROUTINE, LPVOID, DWORD, const char *);
|
HANDLE __stdcall makethread (LPTHREAD_START_ROUTINE, LPVOID, DWORD, const char *) __attribute__ ((regparm(3)));
|
||||||
const char * __stdcall threadname (DWORD, int lockit = TRUE);
|
const char * __stdcall threadname (DWORD, int lockit = TRUE) __attribute__ ((regparm(2)));
|
||||||
void __stdcall regthread (const char *, DWORD);
|
void __stdcall regthread (const char *, DWORD) __attribute__ ((regparm(1)));
|
||||||
int __stdcall iscygthread ();
|
int __stdcall iscygthread ();
|
||||||
|
|
||||||
#ifndef DEBUGGING
|
#ifndef DEBUGGING
|
||||||
|
@ -31,6 +31,7 @@ extern "C" {
|
|||||||
static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *);
|
static int handle_exceptions (EXCEPTION_RECORD *, void *, CONTEXT *, void *);
|
||||||
extern void sigreturn ();
|
extern void sigreturn ();
|
||||||
extern void sigdelayed ();
|
extern void sigdelayed ();
|
||||||
|
extern void sigdelayed0 ();
|
||||||
extern void siglast ();
|
extern void siglast ();
|
||||||
extern DWORD __no_sig_start, __no_sig_end;
|
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
|
sigsave.oldmask = myself->getsigmask (); // Remember for restoration
|
||||||
/* FIXME: Not multi-thread aware */
|
/* FIXME: Not multi-thread aware */
|
||||||
sigsave.newmask = myself->getsigmask () | siga.sa_mask | SIGTOMASK (sig);
|
sigsave.newmask = myself->getsigmask () | siga.sa_mask | SIGTOMASK (sig);
|
||||||
|
sigsave.sa_flags = siga.sa_flags;
|
||||||
sigsave.func = (void (*)(int)) handler;
|
sigsave.func = (void (*)(int)) handler;
|
||||||
sigsave.sig = sig;
|
sigsave.sig = sig;
|
||||||
sigsave.saved_errno = -1; // Flag: no errno to save
|
sigsave.saved_errno = -1; // Flag: no errno to save
|
||||||
@ -987,6 +989,7 @@ sig_handle (int sig)
|
|||||||
|
|
||||||
stop:
|
stop:
|
||||||
handler = (void *) sig_handle_tty_stop;
|
handler = (void *) sig_handle_tty_stop;
|
||||||
|
thissig = myself->getsig (SIGSTOP);
|
||||||
|
|
||||||
dosig:
|
dosig:
|
||||||
/* Dispatch to the appropriate function. */
|
/* Dispatch to the appropriate function. */
|
||||||
@ -1091,6 +1094,16 @@ reset_signal_arrived ()
|
|||||||
sigproc_printf ("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 ()
|
void unused_sig_wrapper ()
|
||||||
{
|
{
|
||||||
/* Signal cleanup stuff. Cleans up stack (too bad that we didn't
|
/* Signal cleanup stuff. Cleans up stack (too bad that we didn't
|
||||||
@ -1123,6 +1136,7 @@ _sigreturn:
|
|||||||
__no_sig_start:
|
__no_sig_start:
|
||||||
_sigdelayed:
|
_sigdelayed:
|
||||||
pushl %2 # original return address
|
pushl %2 # original return address
|
||||||
|
_sigdelayed0:
|
||||||
pushl %%ebp
|
pushl %%ebp
|
||||||
movl %%esp,%%ebp
|
movl %%esp,%%ebp
|
||||||
pushf
|
pushf
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* perthread.h: Header file for cygwin synchronization primitives.
|
/* 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>
|
Written by Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
@ -96,6 +96,7 @@ struct signal_dispatch
|
|||||||
void (*func) (int);
|
void (*func) (int);
|
||||||
int sig;
|
int sig;
|
||||||
int saved_errno;
|
int saved_errno;
|
||||||
|
int sa_flags;
|
||||||
DWORD oldmask;
|
DWORD oldmask;
|
||||||
DWORD newmask;
|
DWORD newmask;
|
||||||
DWORD retaddr;
|
DWORD retaddr;
|
||||||
|
@ -262,8 +262,7 @@ sigaction (int sig, const struct sigaction *newact, struct sigaction *oldact)
|
|||||||
|
|
||||||
if (newact)
|
if (newact)
|
||||||
{
|
{
|
||||||
if ((sig == SIGKILL || sig == SIGSTOP || sig == SIGCONT) &&
|
if ((sig == SIGKILL || sig == SIGSTOP) && newact->sa_handler != SIG_DFL)
|
||||||
newact->sa_handler != SIG_DFL)
|
|
||||||
{
|
{
|
||||||
set_errno (EINVAL);
|
set_errno (EINVAL);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -562,6 +562,7 @@ sigproc_init ()
|
|||||||
}
|
}
|
||||||
memset (w, 0, sizeof *w); // Just to be safe
|
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);
|
sigproc_printf ("process/signal handling enabled(%x)", myself->process_state);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -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)));
|
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_fork ();
|
||||||
void __stdcall signal_fixup_after_exec (bool);
|
void __stdcall signal_fixup_after_exec (bool);
|
||||||
|
extern "C" int __stdcall call_signal_handler ();
|
||||||
|
|
||||||
extern char myself_nowait_dummy[];
|
extern char myself_nowait_dummy[];
|
||||||
extern char myself_nowait_nonmain_dummy[];
|
extern char myself_nowait_nonmain_dummy[];
|
||||||
|
@ -220,6 +220,8 @@ _read (int fd, void *ptr, size_t len)
|
|||||||
{
|
{
|
||||||
sigframe thisframe (mainthread);
|
sigframe thisframe (mainthread);
|
||||||
extern int sigcatchers;
|
extern int sigcatchers;
|
||||||
|
|
||||||
|
beg:
|
||||||
if (fdtab.not_open (fd))
|
if (fdtab.not_open (fd))
|
||||||
{
|
{
|
||||||
set_errno (EBADF);
|
set_errno (EBADF);
|
||||||
@ -257,8 +259,11 @@ _read (int fd, void *ptr, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
syscall_printf ("%d = read (%d<%s>, %p, %d), errno %d", res, fd, fh->get_name (),
|
if (res < 0 && WaitForSingleObject (signal_arrived, 0) == WAIT_OBJECT_0 &&
|
||||||
ptr, len, get_errno ());
|
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;
|
MALLOC_CHECK;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user