From 7528c2d25d81d4a551b3170c61df3059a83ea198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Tue, 18 Feb 1997 21:05:32 -0800 Subject: [PATCH] wake_up_backend implemented through a pipe Rev: src/backend.c:1.9 Rev: src/backend.h:1.2 Rev: src/modules/call_out/call_out.c:1.8 Rev: src/signal_handler.c:1.8 --- src/backend.c | 27 ++++++++++++++++++++++++++- src/backend.h | 1 + src/modules/call_out/call_out.c | 7 ++++++- src/signal_handler.c | 2 ++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/backend.c b/src/backend.c index fd5bd945c5..f020322d25 100644 --- a/src/backend.c +++ b/src/backend.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: backend.c,v 1.8 1997/01/26 22:47:03 per Exp $"); +RCSID("$Id: backend.c,v 1.9 1997/02/19 05:05:19 hubbe Exp $"); #include "backend.h" #include <errno.h> #ifdef HAVE_SYS_TYPES_H @@ -44,6 +44,8 @@ void *write_callback_data[MAX_OPEN_FILEDESCRIPTORS]; static int max_fd; struct timeval current_time; struct timeval next_timeout; +static int wakeup_pipe[2]; +static int may_need_wakeup=0; static struct callback_list backend_callbacks; @@ -54,10 +56,31 @@ struct callback *add_backend_callback(callback_func call, return add_to_callback(&backend_callbacks, call, arg, free_func); } +static void wakeup_callback(int fd, void *foo) +{ + char buffer[1024]; + read(fd, buffer, sizeof(buffer)); /* Clear 'flag' */ +} + +/* This is used by threaded programs and signals to wake up the + * master 'thread'. + */ +void wake_up_backend(void) +{ + char foo=0; + if(may_need_wakeup) + write(wakeup_pipe[1], &foo ,1); +} + void init_backend() { FD_ZERO(&selectors.read); FD_ZERO(&selectors.write); + if(pipe(wakeup_pipe) < 0) + fatal("Couldn't create backend wakup pipe, errno=%d.\n",errno); + set_nonblocking(wakeup_pipe[0],1); + set_nonblocking(wakeup_pipe[1],1); + set_read_callback(wakeup_pipe[0], wakeup_callback, 0); } void set_read_callback(int fd,file_callback cb,void *data) @@ -199,6 +222,7 @@ void backend() next_timeout.tv_sec = 7 * 24 * 60 * 60; /* See you in a week */ my_add_timeval(&next_timeout, ¤t_time); + may_need_wakeup=1; call_callback(& backend_callbacks, (void *)0); check_threads_etc(); @@ -224,6 +248,7 @@ void backend() i=select(max_fd+1, &sets.read, &sets.write, 0, &next_timeout); GETTIMEOFDAY(¤t_time); THREADS_DISALLOW(); + may_need_wakeup=0; if(i>=0) { diff --git a/src/backend.h b/src/backend.h index ab6051fe04..f571718588 100644 --- a/src/backend.h +++ b/src/backend.h @@ -19,6 +19,7 @@ struct selectors; struct callback *add_backend_callback(callback_func call, void *arg, callback_func free_func); +void wake_up_backend(void); void init_backend(); void set_read_callback(int fd,file_callback cb,void *data); void set_write_callback(int fd,file_callback cb,void *data); diff --git a/src/modules/call_out/call_out.c b/src/modules/call_out/call_out.c index 7c02d4db4a..1bc9082a08 100644 --- a/src/modules/call_out/call_out.c +++ b/src/modules/call_out/call_out.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: call_out.c,v 1.7 1997/02/11 08:39:34 hubbe Exp $"); +RCSID("$Id: call_out.c,v 1.8 1997/02/19 05:05:32 hubbe Exp $"); #include "array.h" #include "dynamic_buffer.h" #include "object.h" @@ -190,6 +190,11 @@ static struct array * new_call_out(int num_arg,struct svalue *argp) num_pending_calls++; adjust_up(num_pending_calls-1); verify_call_outs(); + +#ifdef _REENTRANT + wake_up_backend(); +#endif + return new->args; } diff --git a/src/signal_handler.c b/src/signal_handler.c index c8986c6d79..25e8c7bb98 100644 --- a/src/signal_handler.c +++ b/src/signal_handler.c @@ -227,6 +227,8 @@ static RETSIGTYPE receive_signal(int signum) if(signum==SIGCHLD) sig_child(signum); + wake_up_backend(); + #ifndef SIGNAL_ONESHOT my_signal(signum, receive_signal); #endif -- GitLab