diff --git a/src/ca/cac.cpp b/src/ca/cac.cpp index 82a24345f..9fa6374b1 100644 --- a/src/ca/cac.cpp +++ b/src/ca/cac.cpp @@ -1619,26 +1619,24 @@ void cac::waitUntilNoRecvThreadsPending () { fd_set mask; FD_ZERO ( & mask ); - int count = 0; + SOCKET maxFD = 0; epicsGuard < cacMutex > guard ( this->mutex ); tsDLIter < tcpiiu > iter = this->serverList.firstIter (); if ( this->pudpiiu ) { - this->pudpiiu->fdMaskSet ( mask ); - count++; + this->pudpiiu->fdMaskSet ( mask, maxFD ); } while ( iter.valid() ) { - iter->fdMaskSet ( mask ); - count++; + iter->fdMaskSet ( mask, maxFD ); iter++; } struct timeval delay = { 0, 0 }; - int status = select ( count, & mask, 0, 0, & delay ); + int status = select ( maxFD+1, & mask, 0, 0, & delay ); if ( status <= 0 ) { return; } this->nRecvThreadsPending = - static_cast < unsigned > ( count ); + static_cast < unsigned > ( status ); } this->recvThreadActivityComplete.wait ( 0.1 ); diff --git a/src/ca/udpiiu.h b/src/ca/udpiiu.h index c063c75d6..e40b01b63 100644 --- a/src/ca/udpiiu.h +++ b/src/ca/udpiiu.h @@ -36,6 +36,7 @@ #include "epicsThread.h" #include "epicsMemory.h" #include "epicsTime.h" +#include "tsMinMax.h" #ifdef udpiiuh_accessh_epicsExportSharedSymbols # define epicsExportSharedSymbols @@ -98,7 +99,7 @@ public: bool pushDatagramMsg ( const caHdr &hdr, const void *pExt, ca_uint16_t extsize); void shutdown (); double roundTripDelayEstimate () const; - void fdMaskSet ( fd_set & mask ) const; + void fdMaskSet ( fd_set & mask, SOCKET & maxFD ) const; // exceptions class noSocket {}; @@ -222,8 +223,9 @@ inline double udpiiu::roundTripDelayEstimate () const return this->rtteMean; } -inline void udpiiu::fdMaskSet ( fd_set & mask ) const +inline void udpiiu::fdMaskSet ( fd_set & mask, SOCKET & maxFD ) const { + maxFD = tsMax ( this->sock, maxFD ); FD_SET ( this->sock, & mask ); } diff --git a/src/ca/virtualCircuit.h b/src/ca/virtualCircuit.h index ba3648b4f..81a4752a3 100644 --- a/src/ca/virtualCircuit.h +++ b/src/ca/virtualCircuit.h @@ -28,6 +28,7 @@ #include "epicsMemory.h" #include "tsDLList.h" +#include "tsMinMax.h" #include "comBuf.h" #include "caServerID.h" @@ -133,7 +134,7 @@ public: bool bytesArePendingInOS () const; - void fdMaskSet ( fd_set & ) const; + void fdMaskSet ( fd_set &, SOCKET & maxFd ) const; private: hostNameCache hostNameCacheInstance; @@ -249,8 +250,9 @@ inline unsigned tcpiiu::channelCount () return this->channelList.count (); } -inline void tcpiiu::fdMaskSet ( fd_set & mask ) const +inline void tcpiiu::fdMaskSet ( fd_set & mask, SOCKET & maxFD ) const { + maxFD = tsMax ( this->sock, maxFD ); FD_SET ( this->sock, & mask ); }