diff --git a/ChangeLog b/ChangeLog index c04274e..2186074 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Unreleased + * Performance optimization for big select timeouts (#10, Andrey Bondarenko) + * Fix restart of select call after interrupt signal (#8, Boian Bonev) + Thu Apr 26 2012 David Schweikert - Revision v3.1 diff --git a/src/fping.c b/src/fping.c index f047d93..3d18554 100644 --- a/src/fping.c +++ b/src/fping.c @@ -2584,25 +2584,20 @@ char * sprint_tm( int t ) void u_sleep( int u_sec ) { int nfound; - struct timeval to, tokeep; + struct timeval to; fd_set readset, writeset; +select_again: to.tv_sec = u_sec / 1000000; to.tv_usec = u_sec - ( to.tv_sec * 1000000 ); - tokeep = to; FD_ZERO( &readset ); FD_ZERO( &writeset ); -select_again: nfound = select( 0, &readset, &writeset, NULL, &to ); if(nfound < 0) { if(errno == EINTR) { /* interrupted system call: redo the select */ - to = tokeep; - - FD_ZERO( &readset ); - FD_ZERO( &writeset ); goto select_again; } else { @@ -2637,36 +2632,32 @@ int recvfrom_wto( int s, char *buf, int len, FPING_SOCKADDR *saddr, long timo ) { unsigned int slen; int nfound, n; - struct timeval to, tokeep; + struct timeval to; fd_set readset, writeset; - to.tv_sec = 0; - to.tv_usec = timo * 10; - while (to.tv_usec > 1000000) { - to.tv_sec++; - to.tv_usec -= 1000000; +select_again: + if(timo < 100000) { + to.tv_sec = 0; + to.tv_usec = timo * 10; + } + else { + to.tv_sec = timo / 100000 ; + to.tv_usec = (timo % 100000) * 10 ; } - tokeep = to; FD_ZERO( &readset ); FD_ZERO( &writeset ); FD_SET( s, &readset ); -select_again: nfound = select( s + 1, &readset, &writeset, NULL, &to ); if(nfound < 0) { - if(errno == EINTR) { - /* interrupted system call: redo the select */ - to = tokeep; - - FD_ZERO( &readset ); - FD_ZERO( &writeset ); - FD_SET( s, &readset ); - goto select_again; - } - else { - errno_crash_and_burn( "select" ); - } + if(errno == EINTR) { + /* interrupted system call: redo the select */ + goto select_again; + } + else { + errno_crash_and_burn( "select" ); + } } if( nfound == 0 )