diff options
author | Marius Vollmer <mvo@zagadka.de> | 2005-12-06 20:02:19 +0000 |
---|---|---|
committer | Marius Vollmer <mvo@zagadka.de> | 2005-12-06 20:02:19 +0000 |
commit | 324a5aa97aa23cfc962bc6b9e4717a127f533b94 (patch) | |
tree | c4147fa3e216f2ad35b2723b287471d0eaa348a3 /libguile/scmsigs.c | |
parent | 9fb5c8f95c70a13434c127fb6a1e7538ed14b9b9 (diff) | |
download | guile-324a5aa97aa23cfc962bc6b9e4717a127f533b94.tar.gz |
(read_without_guile): New.
(signal_delivery_thread): Use it instead of
scm_leave_guile/read/scm_enter_guile.
Diffstat (limited to 'libguile/scmsigs.c')
-rw-r--r-- | libguile/scmsigs.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/libguile/scmsigs.c b/libguile/scmsigs.c index 836da1357..59513cf6e 100644 --- a/libguile/scmsigs.c +++ b/libguile/scmsigs.c @@ -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; |