]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
work_thread.c, ntpd.h, ntpd.c, ntp_io.c, ChangeLog, iosignal.h, iosignal.c:
authorFrank Kardel <kardel@ntp.org>
Sat, 20 Jul 2013 08:25:40 +0000 (08:25 +0000)
committerFrank Kardel <kardel@ntp.org>
Sat, 20 Jul 2013 08:25:40 +0000 (08:25 +0000)
  [Bug 2425] fix async io setup for worker thread

bk: 51ea4984LzAkJk9V9dLBiej99B1wbA

ChangeLog
include/iosignal.h
include/ntpd.h
libntp/iosignal.c
libntp/work_thread.c
ntpd/ntp_io.c
ntpd/ntpd.c

index 83639413eff5c556159ea24a905845721e5013d1..fbe04298b7b386829f6ed633acb4b480ed405b12 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+* [Bug 2425] setup SIGIO/SIGPOLL for asyncio on the read side
+of a socketpair for the worker thread.
 * [Bug 2427] configure fails to detect recvmsg() on Solaris.
 (4.2.7p372) 2013/07/17 Released by Harlan Stenn <stenn@ntp.org>
 * [Bug 1466] Oncore should set FLAG_PPS.
index 02d589923fb761660a967ee51c0ca8707b337c02..fc37277108ca733ece701d7fc4d5fe4f94124929 100644 (file)
 
 extern int             using_sigio;
 
+typedef void (input_handler_t)(l_fp *);
+extern input_handler_t input_handler;
+
 extern void            block_sigio     (void);
 extern void            unblock_sigio   (void);
 extern int             init_clock_sig  (struct refclockio *);
 extern void            init_socket_sig (int);
-extern void            set_signal      (void);
-RETSIGTYPE             sigio_handler   (int);
+extern void            set_signal      (input_handler_t *);
 
 # define BLOCKIO()     block_sigio()
 # define UNBLOCKIO()   unblock_sigio()
index e1d903c5053c2c0320f24cf882bf28a9d7b33e17..2066441a8c67c7d5b72ac53eab96aac9331551a7 100644 (file)
@@ -120,7 +120,6 @@ extern      void    interface_update        (interface_receiver_t, void *);
 
 extern void    init_io         (void);
 extern void    io_open_sockets (void);
-extern void    input_handler   (l_fp *);
 extern void    io_clr_stats    (void);
 extern void    io_setbclient   (void);
 extern void    io_unsetbclient (void);
index 0176d8cbe7fe23826c7133cf9ec60a089d1c9b59..8749a23b8e81f885b61a2d0806ad4902c8290d3f 100644 (file)
 #include "iosignal.h"
 
 #if defined(HAVE_SIGNALED_IO)
+static RETSIGTYPE sigio_handler        (int);
+
+/* consistency safegurad to catch BLOCK/UNBLOCK oversights */
 static int sigio_block_count = 0;
+
+/* main inputhandler to be called on SIGIO */
+static input_handler_t *input_handler_callback = NULL;
+
 # if defined(HAVE_SIGACTION)
 /*
  * If sigaction() is used for signal handling and a signal is
@@ -59,7 +66,6 @@ static int sigio_block_count = 0;
  */
 static int sigio_handler_active = 0;
 # endif
-extern void    input_handler   (l_fp *);
 
 /*
  * SIGPOLL and SIGIO ROUTINES.
@@ -100,7 +106,7 @@ init_clock_sig(
                pgrp = getpid();
                if (ioctl(rio->fd, FIOSSAIOOWN, (char *)&pgrp) == -1)
                {
-                       msyslog(LOG_ERR, "ioctl(FIOSSAIOOWN) fails for clock I/O: %m");
+                       msyslog(LOG_ERR, "ioctl(FIOSSAIOOWN) fails for clock I/O: %m - EXITING");
                        exit(1);
                        /*NOTREACHED*/
                }
@@ -110,14 +116,14 @@ init_clock_sig(
                 */
                if (ioctl(rio->fd, FIOSNBIO, (char *)&on) == -1)
                {
-                       msyslog(LOG_ERR, "ioctl(FIOSNBIO) fails for clock I/O: %m");
+                       msyslog(LOG_ERR, "ioctl(FIOSNBIO) fails for clock I/O: %m - EXITING");
                        exit(1);
                        /*NOTREACHED*/
                }
 
                if (ioctl(rio->fd, FIOSSAIOSTAT, (char *)&on) == -1)
                {
-                       msyslog(LOG_ERR, "ioctl(FIOSSAIOSTAT) fails for clock I/O: %m");
+                       msyslog(LOG_ERR, "ioctl(FIOSSAIOSTAT) fails for clock I/O: %m - EXITING");
                        exit(1);
                        /*NOTREACHED*/
                }
@@ -204,7 +210,7 @@ init_socket_sig(
                if (ioctl(fd, I_SETSIG, S_INPUT) < 0)
                {
                        msyslog(LOG_ERR,
-                               "init_socket_sig: ioctl(I_SETSIG, S_INPUT) failed: %m");
+                               "init_socket_sig: ioctl(I_SETSIG, S_INPUT) failed: %m - EXITING");
                        exit(1);
                }
        }
@@ -218,7 +224,7 @@ init_socket_sig(
 #  if defined(FIOASYNC)
                if (ioctl(fd, FIOASYNC, (char *)&on) == -1)
                {
-                       msyslog(LOG_ERR, "ioctl(FIOASYNC) fails: %m");
+                       msyslog(LOG_ERR, "ioctl(FIOASYNC) fails: %m - EXITING");
                        exit(1);
                        /*NOTREACHED*/
                }
@@ -228,13 +234,13 @@ init_socket_sig(
 
                        if ((flags = fcntl(fd, F_GETFL, 0)) == -1)
                        {
-                               msyslog(LOG_ERR, "fcntl(F_GETFL) fails: %m");
+                               msyslog(LOG_ERR, "fcntl(F_GETFL) fails: %m - EXITING");
                                exit(1);
                                /*NOTREACHED*/
                        }
                        if (fcntl(fd, F_SETFL, flags|FASYNC) < 0)
                        {
-                               msyslog(LOG_ERR, "fcntl(...|FASYNC) fails: %m");
+                               msyslog(LOG_ERR, "fcntl(...|FASYNC) fails: %m - EXITING");
                                exit(1);
                                /*NOTREACHED*/
                        }
@@ -252,21 +258,21 @@ init_socket_sig(
 #  if defined(SIOCSPGRP)
                if (ioctl(fd, SIOCSPGRP, (char *)&pgrp) == -1)
                {
-                       msyslog(LOG_ERR, "ioctl(SIOCSPGRP) fails: %m");
+                       msyslog(LOG_ERR, "ioctl(SIOCSPGRP) fails: %m - EXITING");
                        exit(1);
                        /*NOTREACHED*/
                }
 #  elif defined(FIOSETOWN)
                if (ioctl(fd, FIOSETOWN, (char*)&pgrp) == -1)
                {
-                       msyslog(LOG_ERR, "ioctl(FIOSETOWN) fails: %m");
+                       msyslog(LOG_ERR, "ioctl(FIOSETOWN) fails: %m - EXITING");
                        exit(1);
                        /*NOTREACHED*/
                }
 #  elif defined(F_SETOWN)
                if (fcntl(fd, F_SETOWN, pgrp) == -1)
                {
-                       msyslog(LOG_ERR, "fcntl(F_SETOWN) fails: %m");
+                       msyslog(LOG_ERR, "fcntl(F_SETOWN) fails: %m - EXITING");
                        exit(1);
                        /*NOTREACHED*/
                }
@@ -277,7 +283,7 @@ init_socket_sig(
 # endif /* USE_UDP_SIGPOLL */
 }
 
-RETSIGTYPE
+static RETSIGTYPE
 sigio_handler(
        int sig
        )
@@ -293,7 +299,8 @@ sigio_handler(
            msyslog(LOG_ERR, "sigio_handler: sigio_handler_active != 1");
 # endif
 
-       (void)input_handler(&ts);
+       INSIST(input_handler_callback != NULL);
+       (*input_handler_callback)(&ts);
 
 # if defined(HAVE_SIGACTION)
        sigio_handler_active--;
@@ -309,8 +316,12 @@ sigio_handler(
  */
 # ifdef HAVE_SIGACTION
 void
-set_signal(void)
+set_signal(input_handler_t *input)
 {
+       INSIST(input != NULL);
+       
+       input_handler_callback = input;
+
        using_sigio = TRUE;
 #  ifdef USE_SIGIO
        (void) signal_no_reset(SIGIO, sigio_handler);
@@ -480,8 +491,12 @@ block_sigio(void)
 }
 
 void
-set_signal(void)
+set_signal(input_handler_t *input)
 {
+       INSIST(input != NULL);
+
+       input_handler_callback = input;
+
        using_sigio = TRUE;
        (void) signal_no_reset(SIGIO, sigio_handler);
 }
index cf41de9c4e80af1507547186204ff40b8a5ef441..9c313333cb7756367ec9f8d8b68502fecf5b8d9e 100644 (file)
@@ -13,6 +13,7 @@
 #include <pthread.h>
 #endif
 
+#include "iosignal.h"
 #include "ntp_stdlib.h"
 #include "ntp_malloc.h"
 #include "ntp_syslog.h"
@@ -449,6 +450,9 @@ start_blocking_thread_internal(
                        "start_blocking_thread: fcntl(F_SETFL, O_NONBLOCK) %m");
                exit(1);
        }
+#if HAVE_SIGNALED_IO
+       init_socket_sig(c->resp_read_pipe);
+#endif
        (*addremove_io_fd)(c->resp_read_pipe, c->ispipe, FALSE);
        pthread_attr_init(&thr_attr);
        pthread_attr_setdetachstate(&thr_attr, PTHREAD_CREATE_DETACHED);
index a3e4246b065ebab95140e9fad2b8ee693ad87291..25bfec4e0afd155e98ac26b137834b73bfd71726 100644 (file)
@@ -442,7 +442,7 @@ init_io(void)
 #endif
 
 #if defined(HAVE_SIGNALED_IO)
-       (void) set_signal();
+       (void) set_signal(input_handler);
 #endif
 }
 
index 950ef2f0224430a3a4517c99425ff64d50290165..3df606d4e6972bdc578ee8d05ef50071c3c6f92b 100644 (file)
@@ -18,6 +18,7 @@
 #include "isc/error.h"
 #include "isc/strerror.h"
 #include "isc/formatcheck.h"
+#include "iosignal.h"
 
 #ifdef SIM
 # include "ntpsim.h"