2009-07-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Winsock select() doesn't work if no socket is in FD_SET.  To
	overcome this problem, a dummy socket is added to FD_SET and it is
	given to select().
	* src/SelectEventPoll.cc
	* src/SelectEventPoll.h
pull/1/head
Tatsuhiro Tsujikawa 2009-07-05 03:46:07 +00:00
parent 9e3fb89077
commit 276d77ee9d
3 changed files with 40 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2009-07-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Winsock select() doesn't work if no socket is in FD_SET. To
overcome this problem, a dummy socket is added to FD_SET and it is
given to select().
* src/SelectEventPoll.cc
* src/SelectEventPoll.h
2009-07-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-07-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Disabled --use-head option by default because --use-head=true Disabled --use-head option by default because --use-head=true

View File

@ -34,6 +34,9 @@
/* copyright --> */ /* copyright --> */
#include "SelectEventPoll.h" #include "SelectEventPoll.h"
#ifdef __MINGW32__
# include <cassert>
#endif // __MINGW32__
#include <cstring> #include <cstring>
#include <algorithm> #include <algorithm>
#include <numeric> #include <numeric>
@ -148,10 +151,19 @@ void SelectEventPoll::AsyncNameResolverEntry::process
SelectEventPoll::SelectEventPoll():_logger(LogFactory::getInstance()) SelectEventPoll::SelectEventPoll():_logger(LogFactory::getInstance())
{ {
#ifdef __MINGW32__
_dummySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert(_dummySocket != -1);
#endif // __MINGW32__
updateFdSet(); updateFdSet();
} }
SelectEventPoll::~SelectEventPoll() {} SelectEventPoll::~SelectEventPoll()
{
#ifdef __MINGW32__
::closesocket(_dummySocket);
#endif // __MINGW32__
}
void SelectEventPoll::poll(const struct timeval& tv) void SelectEventPoll::poll(const struct timeval& tv)
{ {
@ -160,6 +172,11 @@ void SelectEventPoll::poll(const struct timeval& tv)
memcpy(&rfds, &_rfdset, sizeof(fd_set)); memcpy(&rfds, &_rfdset, sizeof(fd_set));
memcpy(&wfds, &_wfdset, sizeof(fd_set)); memcpy(&wfds, &_wfdset, sizeof(fd_set));
#ifdef __MINGW32__
fd_set efds;
FD_ZERO(&efds);
FD_SET(_dummySocket, &efds);
#endif // __MINGW32__
#ifdef ENABLE_ASYNC_DNS #ifdef ENABLE_ASYNC_DNS
for(std::deque<SharedHandle<AsyncNameResolverEntry> >::iterator itr = for(std::deque<SharedHandle<AsyncNameResolverEntry> >::iterator itr =
@ -177,7 +194,11 @@ void SelectEventPoll::poll(const struct timeval& tv)
int retval; int retval;
do { do {
struct timeval ttv = tv; struct timeval ttv = tv;
#ifdef __MINGW32__
retval = select(_fdmax+1, &rfds, &wfds, &efds, &ttv);
#else // !__MINGW32__
retval = select(_fdmax+1, &rfds, &wfds, NULL, &ttv); retval = select(_fdmax+1, &rfds, &wfds, NULL, &ttv);
#endif // !__MINGW32__
} while(retval == -1 && errno == EINTR); } while(retval == -1 && errno == EINTR);
if(retval > 0) { if(retval > 0) {
for(std::deque<SharedHandle<SocketEntry> >::iterator i = for(std::deque<SharedHandle<SocketEntry> >::iterator i =
@ -204,7 +225,11 @@ void SelectEventPoll::poll(const struct timeval& tv)
void SelectEventPoll::updateFdSet() void SelectEventPoll::updateFdSet()
{ {
#ifdef __MINGW32__
_fdmax = _dummySocket;
#else // !__MINGW32__
_fdmax = 0; _fdmax = 0;
#endif // !__MINGW32__
FD_ZERO(&_rfdset); FD_ZERO(&_rfdset);
FD_ZERO(&_wfdset); FD_ZERO(&_wfdset);
for(std::deque<SharedHandle<SocketEntry> >::iterator i = for(std::deque<SharedHandle<SocketEntry> >::iterator i =

View File

@ -162,6 +162,12 @@ private:
std::deque<SharedHandle<AsyncNameResolverEntry> > _nameResolverEntries; std::deque<SharedHandle<AsyncNameResolverEntry> > _nameResolverEntries;
#endif // ENABLE_ASYNC_DNS #endif // ENABLE_ASYNC_DNS
#ifdef __MINGW32__
// Winsock select() doesn't work if no socket is in FD_SET. We add
// this dummy socket to work around this problem
sock_t _dummySocket;
#endif // __MINGW32__
Logger* _logger; Logger* _logger;
void updateFdSet(); void updateFdSet();