summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-07-05 03:46:07 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-07-05 03:46:07 +0000
commit276d77ee9d82f843e02689c8242df9fb655c676f (patch)
tree3c880ab8c6ac843bd396bd0794824a63625ae850 /src
parent9e3fb89077f08ed3cbea418dd11b04a044c24a77 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/SelectEventPoll.cc27
-rw-r--r--src/SelectEventPoll.h6
2 files changed, 32 insertions, 1 deletions
diff --git a/src/SelectEventPoll.cc b/src/SelectEventPoll.cc
index 3021ca57..2f1446fc 100644
--- a/src/SelectEventPoll.cc
+++ b/src/SelectEventPoll.cc
@@ -34,6 +34,9 @@
/* copyright --> */
#include "SelectEventPoll.h"
+#ifdef __MINGW32__
+# include <cassert>
+#endif // __MINGW32__
#include <cstring>
#include <algorithm>
#include <numeric>
@@ -148,10 +151,19 @@ void SelectEventPoll::AsyncNameResolverEntry::process
SelectEventPoll::SelectEventPoll():_logger(LogFactory::getInstance())
{
+#ifdef __MINGW32__
+ _dummySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ assert(_dummySocket != -1);
+#endif // __MINGW32__
updateFdSet();
}
-SelectEventPoll::~SelectEventPoll() {}
+SelectEventPoll::~SelectEventPoll()
+{
+#ifdef __MINGW32__
+ ::closesocket(_dummySocket);
+#endif // __MINGW32__
+}
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(&wfds, &_wfdset, sizeof(fd_set));
+#ifdef __MINGW32__
+ fd_set efds;
+ FD_ZERO(&efds);
+ FD_SET(_dummySocket, &efds);
+#endif // __MINGW32__
#ifdef ENABLE_ASYNC_DNS
for(std::deque<SharedHandle<AsyncNameResolverEntry> >::iterator itr =
@@ -177,7 +194,11 @@ void SelectEventPoll::poll(const struct timeval& tv)
int retval;
do {
struct timeval ttv = tv;
+#ifdef __MINGW32__
+ retval = select(_fdmax+1, &rfds, &wfds, &efds, &ttv);
+#else // !__MINGW32__
retval = select(_fdmax+1, &rfds, &wfds, NULL, &ttv);
+#endif // !__MINGW32__
} while(retval == -1 && errno == EINTR);
if(retval > 0) {
for(std::deque<SharedHandle<SocketEntry> >::iterator i =
@@ -204,7 +225,11 @@ void SelectEventPoll::poll(const struct timeval& tv)
void SelectEventPoll::updateFdSet()
{
+#ifdef __MINGW32__
+ _fdmax = _dummySocket;
+#else // !__MINGW32__
_fdmax = 0;
+#endif // !__MINGW32__
FD_ZERO(&_rfdset);
FD_ZERO(&_wfdset);
for(std::deque<SharedHandle<SocketEntry> >::iterator i =
diff --git a/src/SelectEventPoll.h b/src/SelectEventPoll.h
index 5eaef4cb..a60b7a6b 100644
--- a/src/SelectEventPoll.h
+++ b/src/SelectEventPoll.h
@@ -162,6 +162,12 @@ private:
std::deque<SharedHandle<AsyncNameResolverEntry> > _nameResolverEntries;
#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;
void updateFdSet();