1
Fork 0
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:
Gary Houston 1997-05-31 19:02:38 +00:00
parent 19da35d025
commit e1a191a8ca
18 changed files with 557 additions and 634 deletions

View file

@ -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"
}