summaryrefslogtreecommitdiff
path: root/libguile/scmsigs.c
diff options
context:
space:
mode:
authorMarius Vollmer <mvo@zagadka.de>2005-12-06 20:02:19 +0000
committerMarius Vollmer <mvo@zagadka.de>2005-12-06 20:02:19 +0000
commit324a5aa97aa23cfc962bc6b9e4717a127f533b94 (patch)
treec4147fa3e216f2ad35b2723b287471d0eaa348a3 /libguile/scmsigs.c
parent9fb5c8f95c70a13434c127fb6a1e7538ed14b9b9 (diff)
downloadguile-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.c31
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;