From: Frank Kardel Date: Sat, 20 Jul 2013 08:25:40 +0000 (+0000) Subject: work_thread.c, ntpd.h, ntpd.c, ntp_io.c, ChangeLog, iosignal.h, iosignal.c: X-Git-Tag: NTP_4_2_7P374~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=283084bdd6cd73a5dc36eec0d55664292d789c5b;p=thirdparty%2Fntp.git work_thread.c, ntpd.h, ntpd.c, ntp_io.c, ChangeLog, iosignal.h, iosignal.c: [Bug 2425] fix async io setup for worker thread bk: 51ea4984LzAkJk9V9dLBiej99B1wbA --- diff --git a/ChangeLog b/ChangeLog index 83639413e..fbe04298b 100644 --- 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 * [Bug 1466] Oncore should set FLAG_PPS. diff --git a/include/iosignal.h b/include/iosignal.h index 02d589923..fc3727710 100644 --- a/include/iosignal.h +++ b/include/iosignal.h @@ -37,12 +37,14 @@ 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() diff --git a/include/ntpd.h b/include/ntpd.h index e1d903c50..2066441a8 100644 --- a/include/ntpd.h +++ b/include/ntpd.h @@ -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); diff --git a/libntp/iosignal.c b/libntp/iosignal.c index 0176d8cbe..8749a23b8 100644 --- a/libntp/iosignal.c +++ b/libntp/iosignal.c @@ -45,7 +45,14 @@ #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); } diff --git a/libntp/work_thread.c b/libntp/work_thread.c index cf41de9c4..9c313333c 100644 --- a/libntp/work_thread.c +++ b/libntp/work_thread.c @@ -13,6 +13,7 @@ #include #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); diff --git a/ntpd/ntp_io.c b/ntpd/ntp_io.c index a3e4246b0..25bfec4e0 100644 --- a/ntpd/ntp_io.c +++ b/ntpd/ntp_io.c @@ -442,7 +442,7 @@ init_io(void) #endif #if defined(HAVE_SIGNALED_IO) - (void) set_signal(); + (void) set_signal(input_handler); #endif } diff --git a/ntpd/ntpd.c b/ntpd/ntpd.c index 950ef2f02..3df606d4e 100644 --- a/ntpd/ntpd.c +++ b/ntpd/ntpd.c @@ -18,6 +18,7 @@ #include "isc/error.h" #include "isc/strerror.h" #include "isc/formatcheck.h" +#include "iosignal.h" #ifdef SIM # include "ntpsim.h"