diff --git a/src/backend.c b/src/backend.c
index fd5bd945c506cbd4606ab5542c5dc9fe33470aca..f020322d25a9bd7811810624d6c1ea4344940e1b 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 ab6051fe045ea9e783962d3ff5051b1e9fb4c6eb..f57171858860ee703d023c87663cf3a7c0647cdc 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 7c02d4db4a85ec338a1e7e4fdbd53804e5062896..1bc9082a088438243c83baed92331a49790fbf7c 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 c8986c6d79c41e6920b3950e62b31ad448aeeb7f..25e8c7bb983bcdc7218c5c33e7257aefb42f9954 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