1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 14:00:21 +02:00

(read_without_guile): New.

(signal_delivery_thread): Use it instead of
scm_leave_guile/read/scm_enter_guile.
This commit is contained in:
Marius Vollmer 2005-12-06 20:02:19 +00:00
parent 9fb5c8f95c
commit 324a5aa97a

View file

@ -120,11 +120,36 @@ take_signal (int signum)
#endif
}
typedef struct {
ssize_t res;
int fd;
char *buf;
size_t n;
} read_without_guile_data;
static void *
do_read_without_guile (void *raw_data)
{
read_without_guile_data *data = (read_without_guile_data *)data;
data->res = read (data->fd, data->buf, data->n);
return NULL;
}
static ssize_t
read_without_guile (int fd, char *buf, size_t n)
{
read_without_guile_data data;
data.fd = fd;
data.buf = buf;
data.n = n;
scm_without_guile (do_read_without_guile, &data);
return data.res;
}
static SCM
signal_delivery_thread (void *data)
{
sigset_t all_sigs;
scm_t_guile_ticket ticket;
int n, sig;
char sigbyte;
@ -133,10 +158,8 @@ signal_delivery_thread (void *data)
while (1)
{
ticket = scm_leave_guile ();
n = read (signal_pipe[0], &sigbyte, 1);
n = read_without_guile (signal_pipe[0], &sigbyte, 1);
sig = sigbyte;
scm_enter_guile (ticket);
if (n == 1 && sig >= 0 && sig < NSIG)
{
SCM h, t;