mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 06:20:23 +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:
parent
9fb5c8f95c
commit
324a5aa97a
1 changed files with 27 additions and 4 deletions
|
@ -120,11 +120,36 @@ take_signal (int signum)
|
||||||
#endif
|
#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
|
static SCM
|
||||||
signal_delivery_thread (void *data)
|
signal_delivery_thread (void *data)
|
||||||
{
|
{
|
||||||
sigset_t all_sigs;
|
sigset_t all_sigs;
|
||||||
scm_t_guile_ticket ticket;
|
|
||||||
int n, sig;
|
int n, sig;
|
||||||
char sigbyte;
|
char sigbyte;
|
||||||
|
|
||||||
|
@ -133,10 +158,8 @@ signal_delivery_thread (void *data)
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
ticket = scm_leave_guile ();
|
n = read_without_guile (signal_pipe[0], &sigbyte, 1);
|
||||||
n = read (signal_pipe[0], &sigbyte, 1);
|
|
||||||
sig = sigbyte;
|
sig = sigbyte;
|
||||||
scm_enter_guile (ticket);
|
|
||||||
if (n == 1 && sig >= 0 && sig < NSIG)
|
if (n == 1 && sig >= 0 && sig < NSIG)
|
||||||
{
|
{
|
||||||
SCM h, t;
|
SCM h, t;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue