mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-14 15:40:19 +02:00
* scmsigs.h, async.h: updated.
* _scm.h: if HAVE_RESTARTS is defined then don't use a SYSCALL loop. * posix.c (scm_uname): interpret only negative values as an error. Solaris normally returns a positive value. * script.c (scm_compile_shell_switches): if we are not going into an interactive repl, set scm_mask_ints to zero so that asyncs can run. * simpos.c (scm_system): don't ignore/unignore signals around the "system" call. * posix.c (scm_open_pipe): don't ignore/unignore signals around the "popen" call. * init.c (scm_boot_guile_1): don't call scm_init_signals, it's done in boot-9.scm instead. * scmsigs.c, async.c: Major rewriting of signal handling code. (scm_sigaction): new procedure. (scm_sleep): don't wrap sleep in SCM_SYSCALL, it would mess up the timing. (scm_raise): return unspecified, throw error on failure. * boot-9.scm: signal-handler, alarm-thunk: removed. don't define ticks-interrupt etc. top-repl: install signal handlers for SIGINT, SIGFPE, SIGSEGV, SIGBUS during call to scm-style-repl. * acconfig.h: mention HAVE_RESTARTS. * configure.in: check for sigaction and restartable system calls.
This commit is contained in:
parent
19da35d025
commit
e1a191a8ca
18 changed files with 557 additions and 634 deletions
157
libguile/async.c
157
libguile/async.c
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1995,1996 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -100,26 +100,8 @@ static unsigned int scm_switch_clock = 0;
|
|||
static unsigned int scm_switch_rate = 0;
|
||||
static unsigned int scm_desired_switch_rate = 0;
|
||||
|
||||
static SCM system_signal_asyncs[SCM_NUM_SIGS];
|
||||
static SCM handler_var;
|
||||
static SCM symbol_signal;
|
||||
|
||||
|
||||
struct scm_async
|
||||
{
|
||||
int got_it; /* needs to be delivered? */
|
||||
SCM thunk; /* the handler. */
|
||||
};
|
||||
|
||||
|
||||
static long scm_tc16_async;
|
||||
|
||||
#define SCM_ASYNCP(X) (scm_tc16_async == SCM_GCTYP16 (X))
|
||||
#define SCM_ASYNC(X) ((struct scm_async *)SCM_CDR (X))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static int asyncs_pending SCM_P ((void));
|
||||
|
@ -281,30 +263,8 @@ scm_switch ()
|
|||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void scm_deliver_signal SCM_P ((int num));
|
||||
|
||||
static void
|
||||
scm_deliver_signal (num)
|
||||
int num;
|
||||
{
|
||||
SCM handler;
|
||||
handler = SCM_CDR (handler_var);
|
||||
if (handler != SCM_BOOL_F)
|
||||
scm_apply (handler, SCM_MAKINUM (num), scm_listofnull);
|
||||
else
|
||||
{
|
||||
scm_mask_ints = 0;
|
||||
scm_throw (symbol_signal,
|
||||
scm_listify (SCM_MAKINUM (num), SCM_UNDEFINED));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static int print_async SCM_P ((SCM exp, SCM port, scm_print_state *pstate));
|
||||
|
||||
static int
|
||||
|
@ -514,66 +474,6 @@ scm_set_switch_rate (n)
|
|||
|
||||
|
||||
|
||||
|
||||
static SCM scm_sys_hup_async_thunk SCM_P ((void));
|
||||
|
||||
static SCM
|
||||
scm_sys_hup_async_thunk ()
|
||||
{
|
||||
scm_deliver_signal (SCM_HUP_SIGNAL);
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
|
||||
static SCM scm_sys_int_async_thunk SCM_P ((void));
|
||||
|
||||
static SCM
|
||||
scm_sys_int_async_thunk ()
|
||||
{
|
||||
scm_deliver_signal (SCM_INT_SIGNAL);
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
|
||||
static SCM scm_sys_fpe_async_thunk SCM_P ((void));
|
||||
|
||||
static SCM
|
||||
scm_sys_fpe_async_thunk ()
|
||||
{
|
||||
scm_deliver_signal (SCM_FPE_SIGNAL);
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
|
||||
static SCM scm_sys_bus_async_thunk SCM_P ((void));
|
||||
|
||||
static SCM
|
||||
scm_sys_bus_async_thunk ()
|
||||
{
|
||||
scm_deliver_signal (SCM_BUS_SIGNAL);
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
|
||||
static SCM scm_sys_segv_async_thunk SCM_P ((void));
|
||||
|
||||
static SCM
|
||||
scm_sys_segv_async_thunk ()
|
||||
{
|
||||
scm_deliver_signal (SCM_SEGV_SIGNAL);
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
|
||||
static SCM scm_sys_alrm_async_thunk SCM_P ((void));
|
||||
|
||||
static SCM
|
||||
scm_sys_alrm_async_thunk ()
|
||||
{
|
||||
scm_deliver_signal (SCM_ALRM_SIGNAL);
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
/* points to the GC system-async, so that scm_gc_end can find it. */
|
||||
SCM scm_gc_async;
|
||||
|
||||
|
@ -597,32 +497,6 @@ scm_sys_gc_async_thunk (void)
|
|||
|
||||
|
||||
|
||||
SCM
|
||||
scm_take_signal (n)
|
||||
int n;
|
||||
{
|
||||
SCM ignored;
|
||||
if (!scm_ints_disabled)
|
||||
{
|
||||
/* For reasons of speed, the SCM_NEWCELL macro doesn't defer
|
||||
interrupts. Instead, it first sets its argument to point to
|
||||
the first cell in the list, and then advances the freelist
|
||||
pointer to the next cell. Now, if this procedure is
|
||||
interrupted, the only anomalous state possible is to have
|
||||
both SCM_NEWCELL's argument and scm_freelist pointing to the
|
||||
same cell. To deal with this case, we always throw away the
|
||||
first cell in scm_freelist here.
|
||||
|
||||
At least, that's the theory. I'm not convinced that that's
|
||||
the only anomalous path we need to worry about. */
|
||||
SCM_NEWCELL (ignored);
|
||||
}
|
||||
scm_system_async_mark (system_signal_asyncs[SCM_SIG_ORD(n)]);
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SCM_PROC(s_unmask_signals, "unmask-signals", 0, 0, 0, scm_unmask_signals);
|
||||
|
||||
SCM
|
||||
|
@ -649,39 +523,10 @@ scm_init_async ()
|
|||
{
|
||||
SCM a_thunk;
|
||||
scm_tc16_async = scm_newsmob (&async_smob);
|
||||
symbol_signal = SCM_CAR (scm_sysintern ("signal", SCM_UNDEFINED));
|
||||
scm_permanent_object (symbol_signal);
|
||||
|
||||
/* These are in the opposite order of delivery priortity.
|
||||
*
|
||||
* Error conditions are given low priority:
|
||||
*/
|
||||
a_thunk = scm_make_gsubr ("%hup-thunk", 0, 0, 0, scm_sys_hup_async_thunk);
|
||||
system_signal_asyncs[SCM_SIG_ORD(SCM_HUP_SIGNAL)] = scm_system_async (a_thunk);
|
||||
a_thunk = scm_make_gsubr ("%int-thunk", 0, 0, 0, scm_sys_int_async_thunk);
|
||||
system_signal_asyncs[SCM_SIG_ORD(SCM_INT_SIGNAL)] = scm_system_async (a_thunk);
|
||||
a_thunk = scm_make_gsubr ("%fpe-thunk", 0, 0, 0, scm_sys_fpe_async_thunk);
|
||||
system_signal_asyncs[SCM_SIG_ORD(SCM_FPE_SIGNAL)] = scm_system_async (a_thunk);
|
||||
a_thunk = scm_make_gsubr ("%bus-thunk", 0, 0, 0, scm_sys_bus_async_thunk);
|
||||
system_signal_asyncs[SCM_SIG_ORD(SCM_BUS_SIGNAL)] = scm_system_async (a_thunk);
|
||||
a_thunk = scm_make_gsubr ("%segv-thunk", 0, 0, 0, scm_sys_segv_async_thunk);
|
||||
system_signal_asyncs[SCM_SIG_ORD(SCM_SEGV_SIGNAL)] = scm_system_async (a_thunk);
|
||||
|
||||
scm_gc_vcell = scm_sysintern ("gc-thunk", SCM_BOOL_F);
|
||||
a_thunk = scm_make_gsubr ("%gc-thunk", 0, 0, 0, scm_sys_gc_async_thunk);
|
||||
scm_gc_async = scm_system_async (a_thunk);
|
||||
|
||||
/* Clock and PC driven conditions are given highest priority. */
|
||||
/*
|
||||
a_thunk = scm_make_gsubr ("%tick-thunk", 0, 0, 0, scm_sys_tick_async_thunk);
|
||||
system_signal_asyncs[SCM_SIG_ORD(SCM_TICK_SIGNAL)] = scm_system_async (a_thunk);
|
||||
*/
|
||||
|
||||
a_thunk = scm_make_gsubr ("%alrm-thunk", 0, 0, 0, scm_sys_alrm_async_thunk);
|
||||
system_signal_asyncs[SCM_SIG_ORD(SCM_ALRM_SIGNAL)] = scm_system_async (a_thunk);
|
||||
|
||||
handler_var = scm_sysintern ("signal-handler", SCM_UNDEFINED);
|
||||
SCM_SETCDR (handler_var, SCM_BOOL_F);
|
||||
scm_permanent_object (handler_var);
|
||||
#include "async.x"
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue