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, &current_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(&current_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