mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-21 16:26:12 +08:00
* sigproc.cc (wait_sig): Remove unneeded for loop iteration.
* exceptions.cc (interrupt_setup): Don't set signal mask here or races occur with main thread. Set it in sigdelayed instead. (sigreturn): Reflect change in stack order of ebp and flags. (sigdelayed): Set stack frame correctly. Call set_process_mask here with flags for last trapped signal. (signal_dispatch): Add newmask. * sigproc.cc (wait_sig): Eliminate ill-considered attempt to halt looping signal processors.
This commit is contained in:
parent
cb6f4dbd0c
commit
0d675c5d7f
@ -1,3 +1,18 @@
|
|||||||
|
Thu Nov 16 00:15:59 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* sigproc.cc (wait_sig): Remove unneeded for loop iteration.
|
||||||
|
|
||||||
|
Wed Nov 15 21:02:56 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* exceptions.cc (interrupt_setup): Don't set signal mask here or races
|
||||||
|
occur with main thread. Set it in sigdelayed instead.
|
||||||
|
(sigreturn): Reflect change in stack order of ebp and flags.
|
||||||
|
(sigdelayed): Set stack frame correctly. Call set_process_mask here
|
||||||
|
with flags for last trapped signal.
|
||||||
|
(signal_dispatch): Add newmask.
|
||||||
|
* sigproc.cc (wait_sig): Eliminate ill-considered attempt to halt
|
||||||
|
looping signal processors.
|
||||||
|
|
||||||
Wed Nov 15 22:08:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
Wed Nov 15 22:08:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* uinfo.cc (internal_getlogin): Change parameter list to reflect
|
* uinfo.cc (internal_getlogin): Change parameter list to reflect
|
||||||
|
@ -624,7 +624,7 @@ interrupt_setup (int sig, struct sigaction& siga, void *handler,
|
|||||||
sigsave.retaddr_on_stack = retaddr_on_stack;
|
sigsave.retaddr_on_stack = 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 */
|
||||||
set_process_mask (myself->getsigmask () | siga.sa_mask | SIGTOMASK (sig));
|
sigsave.newmask = myself->getsigmask () | siga.sa_mask | SIGTOMASK (sig);
|
||||||
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
|
||||||
@ -687,6 +687,7 @@ interrupt_on_return (sigthread *th, int sig, struct sigaction& siga, void *handl
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sigproc_printf ("couldn't find a stack frame, i %d\n", i);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -806,7 +807,7 @@ set_pending:
|
|||||||
LeaveCriticalSection (&th->lock);
|
LeaveCriticalSection (&th->lock);
|
||||||
|
|
||||||
if (!hth)
|
if (!hth)
|
||||||
sigproc_printf ("modified main-thread stack");
|
sigproc_printf ("didn't suspend main thread, th %p", th);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res = ResumeThread (hth);
|
res = ResumeThread (hth);
|
||||||
@ -856,8 +857,7 @@ ctrl_c_handler (DWORD type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set the signal mask for this process.
|
/* Set the signal mask for this process.
|
||||||
* Note that some signals are unmaskable, as in UNIX.
|
Note that some signals are unmaskable, as in UNIX. */
|
||||||
*/
|
|
||||||
extern "C" void __stdcall
|
extern "C" void __stdcall
|
||||||
set_process_mask (sigset_t newmask)
|
set_process_mask (sigset_t newmask)
|
||||||
{
|
{
|
||||||
@ -1105,43 +1105,38 @@ _sigreturn:
|
|||||||
popl %%edx
|
popl %%edx
|
||||||
popl %%edi
|
popl %%edi
|
||||||
popl %%esi
|
popl %%esi
|
||||||
popl %%ebp
|
|
||||||
popf
|
popf
|
||||||
|
popl %%ebp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
__no_sig_start:
|
__no_sig_start:
|
||||||
_sigdelayed:
|
_sigdelayed:
|
||||||
pushl %2 # original return address
|
pushl %2 # original return address
|
||||||
pushf
|
|
||||||
pushl %%ebp
|
pushl %%ebp
|
||||||
|
movl %%esp,%%ebp
|
||||||
|
pushf
|
||||||
pushl %%esi
|
pushl %%esi
|
||||||
pushl %%edi
|
pushl %%edi
|
||||||
pushl %%edx
|
pushl %%edx
|
||||||
pushl %%ecx
|
pushl %%ecx
|
||||||
pushl %%ebx
|
pushl %%ebx
|
||||||
pushl %%eax
|
pushl %%eax
|
||||||
pushl %7 # saved errno
|
pushl %7 # saved errno
|
||||||
pushl %3 # oldmask
|
pushl %3 # oldmask
|
||||||
pushl %4 # signal argument
|
pushl %4 # signal argument
|
||||||
pushl $_sigreturn
|
pushl $_sigreturn
|
||||||
pushl %%ebp
|
|
||||||
movl %%esp,%%esp
|
|
||||||
|
|
||||||
call _reset_signal_arrived@0
|
call _reset_signal_arrived@0
|
||||||
movl $0,%0
|
movl $0,%0
|
||||||
|
|
||||||
cmpl $0,_pending_signals
|
pushl %8
|
||||||
je 2f
|
call _set_process_mask@4
|
||||||
pushl $0
|
|
||||||
call _sig_dispatch_pending@4
|
|
||||||
|
|
||||||
2: popl %%ebp
|
|
||||||
jmp *%5
|
jmp *%5
|
||||||
__no_sig_end:
|
__no_sig_end:
|
||||||
|
|
||||||
" : "=m" (sigsave.sig) : "m" (&_impure_ptr->_errno),
|
" : "=m" (sigsave.sig) : "m" (&_impure_ptr->_errno),
|
||||||
"g" (sigsave.retaddr), "g" (sigsave.oldmask), "g" (sigsave.sig),
|
"g" (sigsave.retaddr), "g" (sigsave.oldmask), "g" (sigsave.sig),
|
||||||
"g" (sigsave.func), "o" (pid_offset), "g" (sigsave.saved_errno)
|
"g" (sigsave.func), "o" (pid_offset), "g" (sigsave.saved_errno), "g" (sigsave.newmask)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -314,7 +314,7 @@ fork_child (HANDLE& hParent, dll *&first_dll, bool& load_dlls)
|
|||||||
static void
|
static void
|
||||||
slow_pid_reuse (HANDLE h)
|
slow_pid_reuse (HANDLE h)
|
||||||
{
|
{
|
||||||
static NO_COPY HANDLE last_fork_procs[64] = {0};
|
static NO_COPY HANDLE last_fork_procs[128] = {0};
|
||||||
static NO_COPY unsigned nfork_procs = 0;
|
static NO_COPY unsigned nfork_procs = 0;
|
||||||
|
|
||||||
if (nfork_procs >= (sizeof (last_fork_procs) / sizeof (last_fork_procs [0])))
|
if (nfork_procs >= (sizeof (last_fork_procs) / sizeof (last_fork_procs [0])))
|
||||||
|
@ -97,6 +97,7 @@ struct signal_dispatch
|
|||||||
int sig;
|
int sig;
|
||||||
int saved_errno;
|
int saved_errno;
|
||||||
DWORD oldmask;
|
DWORD oldmask;
|
||||||
|
DWORD newmask;
|
||||||
DWORD retaddr;
|
DWORD retaddr;
|
||||||
DWORD *retaddr_on_stack;
|
DWORD *retaddr_on_stack;
|
||||||
};
|
};
|
||||||
|
@ -70,8 +70,8 @@ HANDLE NO_COPY signal_arrived; // Event signaled when a signal has
|
|||||||
|
|
||||||
#define Static static NO_COPY
|
#define Static static NO_COPY
|
||||||
|
|
||||||
Static DWORD proc_loop_wait = 500; // Wait for subprocesses to exit
|
Static DWORD proc_loop_wait = 1000; // Wait for subprocesses to exit
|
||||||
Static DWORD sig_loop_wait = 500; // Wait for signals to arrive
|
Static DWORD sig_loop_wait = INFINITE; // Wait for signals to arrive
|
||||||
|
|
||||||
Static HANDLE sigcatch_nonmain = NULL; // The semaphore signaled when
|
Static HANDLE sigcatch_nonmain = NULL; // The semaphore signaled when
|
||||||
// signals are available for
|
// signals are available for
|
||||||
@ -1109,7 +1109,7 @@ wait_sig (VOID *)
|
|||||||
|
|
||||||
HANDLE catchem[] = {sigcatch_main, sigcatch_nonmain, sigcatch_nosync};
|
HANDLE catchem[] = {sigcatch_main, sigcatch_nonmain, sigcatch_nosync};
|
||||||
sigproc_printf ("Ready. dwProcessid %d", myself->dwProcessId);
|
sigproc_printf ("Ready. dwProcessid %d", myself->dwProcessId);
|
||||||
for (int i = 0; ; i++)
|
for (;;)
|
||||||
{
|
{
|
||||||
DWORD rc = WaitForMultipleObjects (3, catchem, FALSE, sig_loop_wait);
|
DWORD rc = WaitForMultipleObjects (3, catchem, FALSE, sig_loop_wait);
|
||||||
|
|
||||||
@ -1196,18 +1196,7 @@ wait_sig (VOID *)
|
|||||||
|
|
||||||
/* FIXME: The dispatched stuff probably isn't needed anymore. */
|
/* FIXME: The dispatched stuff probably isn't needed anymore. */
|
||||||
if (dispatched >= 0 && pending_signals < 0 && !saw_pending_signals)
|
if (dispatched >= 0 && pending_signals < 0 && !saw_pending_signals)
|
||||||
{
|
pending_signals = 0;
|
||||||
pending_signals = 0;
|
|
||||||
/* FIXME FIXME FIXME FIXME FIXME
|
|
||||||
This is a real kludge designed to handle runaway processes who
|
|
||||||
missed a signal and never processed a signal handler. We have
|
|
||||||
to reset signal_arrived or stuff goes crazy. */
|
|
||||||
if (i >= 20)
|
|
||||||
{
|
|
||||||
i = 0;
|
|
||||||
ResetEvent (signal_arrived);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nzombies && saw_sigchld && !dispatched_sigchld)
|
if (nzombies && saw_sigchld && !dispatched_sigchld)
|
||||||
proc_subproc (PROC_CLEARWAIT, 0);
|
proc_subproc (PROC_CLEARWAIT, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user