On 15.03.2017 12:10, Vitaliy T wrote: > On 14 March 2017 at 23:21, Evgeny Grin <k...@yandex.ru> wrote: >> MHD_get_fdset() may return MHD_NO if epoll FD is too high to fit fd_set >> or if MHD_get_fdset() erroneously called for daemon with >> MHD_USE_THREAD_PER_CONNECTION option. > > Sorry, you are wrong. > > src/microhttpd/daemon.c > > 660 int > 661 MHD_get_fdset (struct MHD_Daemon *daemon, > ... > 666 { > 667 return MHD_get_fdset2 (daemon, > ... > 673 } > > 913 int > 914 MHD_get_fdset2 (struct MHD_Daemon *daemon, > ... > 920 { > 921 struct MHD_Connection *pos; > 922 struct MHD_Connection *posn; > 923 int result = MHD_YES; > 924 MHD_socket ls; > 925 > 926 if ( (NULL == daemon) || > 927 (NULL == read_fd_set) || > 928 (NULL == write_fd_set) || > 929 (daemon->shutdown) || > 930 (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) || > 931 (0 != (daemon->options & MHD_USE_POLL))) > 932 return MHD_NO; > ... > > src/iinclude/microhttpd.h > 882 enum MHD_FLAG > 883 { > ... > 1038 MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY = MHD_USE_EPOLL | > MHD_USE_INTERNAL_POLLING_THREAD, > > > As you can see there is check against MHD_USE_POLL and if the flag is > set then MHD_get_fdset() is always return MND_NO.
Can't see why you decide that I'm wrong. If you start daemon with MHD_USE_THREAD_PER_CONNECTION or epoll FD is too high then MHD_get_fdset()/MHD_get_fdset2() will return MHD_NO. That's correct. I didn't state that's the only conditions when MHD_get_fdset()/MHD_get_fdset2() will return MHD_NO. There are number of other conditions, which results in MHD_NO. Probably we should update function description to explicitly specify that it could be used only for daemon based on select() (obvious) and based on epoll() (not obvious). -- Best Wishes, Evgeny Grin