From 5f3cd4079c2272c6ac10ce6212ea7ea48cb1f1ce Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 8 Nov 2011 22:07:22 -0800 Subject: [PATCH] vm: make signal pipe nonblocking On the off chance the Factor end of the signal handler mechanism isn't listening, we don't want to tie up the VM because the pipe's buffer got full. --- vm/os-unix.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/vm/os-unix.cpp b/vm/os-unix.cpp index 59f8ee2bb6..0a1d13c312 100755 --- a/vm/os-unix.cpp +++ b/vm/os-unix.cpp @@ -180,12 +180,12 @@ void synchronous_signal_handler(int signal, siginfo_t *siginfo, void *uap) fatal_error("Foreign thread received signal", signal); } -void safe_write(int fd, void *data, ssize_t size); +void safe_write_nonblock(int fd, void *data, ssize_t size); static void enqueue_signal(factor_vm *vm, int signal) { if (vm->signal_pipe_output != 0) - safe_write(vm->signal_pipe_output, &signal, sizeof(int)); + safe_write_nonblock(vm->signal_pipe_output, &signal, sizeof(int)); } void enqueue_signal_handler(int signal, siginfo_t *siginfo, void *uap) @@ -279,6 +279,10 @@ static void safe_pipe(int *in, int *out) static void init_signal_pipe(factor_vm *vm) { safe_pipe(&vm->signal_pipe_input, &vm->signal_pipe_output); + + if(fcntl(vm->signal_pipe_output,F_SETFL,O_NONBLOCK) < 0) + fatal_error("Error with fcntl",errno); + vm->special_objects[OBJ_SIGNAL_PIPE] = tag_fixnum(vm->signal_pipe_input); } @@ -391,6 +395,12 @@ void safe_write(int fd, void *data, ssize_t size) fatal_error("error writing fd",errno); } +void safe_write_nonblock(int fd, void *data, ssize_t size) +{ + if(!check_write(fd,data,size) && errno != EAGAIN) + fatal_error("error writing fd",errno); +} + bool safe_read(int fd, void *data, ssize_t size) { ssize_t bytes = read(fd,data,size);