summaryrefslogtreecommitdiff
path: root/net/udt/files/patch-fix-select-call
blob: f55dda82e0543e7b0bf4b0fa0755bb0c0e0ced32 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
From
	http://sourceforge.net/p/udt/patches/12/

--- src/epoll.cpp
+++ src/epoll.cpp
@@ -256,18 +256,23 @@ int CEPoll::wait(const int eid, set<UDTSOCKET>* readfds, set<UDTSOCKET>* writefd
          FD_ZERO(&readfds);
          FD_ZERO(&writefds);
 
+         //"select" needs to know the max file descriptor that is set in the fd_set structs
+         SYSSOCKET max_fd = 0;
+
          for (set<SYSSOCKET>::const_iterator i = p->second.m_sLocals.begin(); i != p->second.m_sLocals.end(); ++ i)
          {
             if (lrfds)
                FD_SET(*i, &readfds);
             if (lwfds)
                FD_SET(*i, &writefds);
+            if (*i > max_fd)
+               max_fd = *i;
          }
 
          timeval tv;
          tv.tv_sec = 0;
          tv.tv_usec = 0;
-         if (::select(0, &readfds, &writefds, NULL, &tv) > 0)
+         if (::select(max_fd + 1, &readfds, &writefds, NULL, &tv) > 0)
          {
             for (set<SYSSOCKET>::const_iterator i = p->second.m_sLocals.begin(); i != p->second.m_sLocals.end(); ++ i)
             {