void Selector::add_fd( int fd, IO_FUNC interest ) { // update max_fd (the highest valid index in fd_set's array) and also // make sure we're not overflowing our fd_set // On Windows, we have to check the individual fd_set to see if it's // full. if( fd > max_fd ) { max_fd = fd; } #if !defined(WIN32) if ( fd < 0 || fd >= fd_select_size() ) { EXCEPT( "Selector::add_fd(): fd %d outside valid range 0-%d", fd, _fd_select_size-1 ); } #endif if(IsDebugLevel(D_DAEMONCORE)) { char *fd_description = describe_fd(fd); dprintf(D_FULLDEBUG, "selector %p adding fd %d (%s)\n", this, fd, fd_description); free(fd_description); } switch( interest ) { case IO_READ: #if defined(WIN32) if ( save_read_fds->fd_count >= fd_select_size() ) { EXCEPT( "Selector::add_fd(): read fd_set is full" ); } #endif FD_SET( fd, save_read_fds ); break; case IO_WRITE: #if defined(WIN32) if ( save_write_fds->fd_count >= fd_select_size() ) { EXCEPT( "Selector::add_fd(): write fd_set is full" ); } #endif FD_SET( fd, save_write_fds ); break; case IO_EXCEPT: #if defined(WIN32) if ( save_except_fds->fd_count >= fd_select_size() ) { EXCEPT( "Selector::add_fd(): except fd_set is full" ); } #endif FD_SET( fd, save_except_fds ); break; } }
void Selector::add_fd( int fd, IO_FUNC interest ) { // update max_fd (the highest valid index in fd_set's array) and also // make sure we're not overflowing our fd_set // On Windows, we have to check the individual fd_set to see if it's // full. if( fd > max_fd ) { max_fd = fd; } #if !defined(WIN32) if ( fd < 0 || fd >= fd_select_size() ) { EXCEPT( "Selector::add_fd(): fd %d outside valid range 0-%d", fd, _fd_select_size-1 ); } #endif if(IsDebugLevel(D_DAEMONCORE)) { char *fd_description = describe_fd(fd); dprintf(D_DAEMONCORE | D_VERBOSE, "selector %p adding fd %d (%s)\n", this, fd, fd_description); free(fd_description); } bool new_fd = false; if ((m_single_shot == SINGLE_SHOT_OK) && (m_poll.fd != fd)) { new_fd = true; } m_poll.fd = fd; switch( interest ) { case IO_READ: #if defined(WIN32) if ( save_read_fds->fd_count >= fd_select_size() ) { EXCEPT( "Selector::add_fd(): read fd_set is full" ); } #endif m_poll.events |= POLLIN; FD_SET( fd, save_read_fds ); break; case IO_WRITE: #if defined(WIN32) if ( save_write_fds->fd_count >= fd_select_size() ) { EXCEPT( "Selector::add_fd(): write fd_set is full" ); } #endif m_poll.events |= POLLOUT; FD_SET( fd, save_write_fds ); break; case IO_EXCEPT: #if defined(WIN32) if ( save_except_fds->fd_count >= fd_select_size() ) { EXCEPT( "Selector::add_fd(): except fd_set is full" ); } #endif m_poll.events |= POLLERR; FD_SET( fd, save_except_fds ); break; } if ((m_single_shot == SINGLE_SHOT_VIRGIN) || ((m_single_shot == SINGLE_SHOT_OK) && (new_fd == false))) { m_single_shot = SINGLE_SHOT_OK; } else { m_single_shot = SINGLE_SHOT_SKIP; } }