@@ -3173,60 +3173,43 @@ inline ssize_t send_socket(socket_t sock, const void *ptr, size_t size,
31733173 });
31743174}
31753175
3176- inline ssize_t select_read (socket_t sock, time_t sec, time_t usec) {
3176+ template <bool Read>
3177+ inline ssize_t select_impl (socket_t sock, time_t sec, time_t usec) {
31773178#ifdef CPPHTTPLIB_USE_POLL
3178- struct pollfd pfd_read ;
3179- pfd_read .fd = sock;
3180- pfd_read .events = POLLIN;
3179+ struct pollfd pfd ;
3180+ pfd .fd = sock;
3181+ pfd .events = (Read ? POLLIN : POLLOUT) ;
31813182
31823183 auto timeout = static_cast <int >(sec * 1000 + usec / 1000 );
31833184
3184- return handle_EINTR ([&]() { return poll (&pfd_read , 1 , timeout); });
3185+ return handle_EINTR ([&]() { return poll (&pfd , 1 , timeout); });
31853186#else
31863187#ifndef _WIN32
31873188 if (sock >= FD_SETSIZE) { return -1 ; }
31883189#endif
31893190
3190- fd_set fds;
3191+ fd_set fds, *rfds, *wfds ;
31913192 FD_ZERO (&fds);
31923193 FD_SET (sock, &fds);
3194+ rfds = (Read ? &fds : nullptr );
3195+ wfds = (Read ? nullptr : &fds);
31933196
31943197 timeval tv;
31953198 tv.tv_sec = static_cast <long >(sec);
31963199 tv.tv_usec = static_cast <decltype (tv.tv_usec )>(usec);
31973200
31983201 return handle_EINTR ([&]() {
3199- return select (static_cast <int >(sock + 1 ), &fds, nullptr , nullptr , &tv);
3202+ return select (static_cast <int >(sock + 1 ), rfds, wfds , nullptr , &tv);
32003203 });
32013204#endif
32023205}
32033206
3204- inline ssize_t select_write (socket_t sock, time_t sec, time_t usec) {
3205- #ifdef CPPHTTPLIB_USE_POLL
3206- struct pollfd pfd_read;
3207- pfd_read.fd = sock;
3208- pfd_read.events = POLLOUT;
3209-
3210- auto timeout = static_cast <int >(sec * 1000 + usec / 1000 );
3211-
3212- return handle_EINTR ([&]() { return poll (&pfd_read, 1 , timeout); });
3213- #else
3214- #ifndef _WIN32
3215- if (sock >= FD_SETSIZE) { return -1 ; }
3216- #endif
3217-
3218- fd_set fds;
3219- FD_ZERO (&fds);
3220- FD_SET (sock, &fds);
3221-
3222- timeval tv;
3223- tv.tv_sec = static_cast <long >(sec);
3224- tv.tv_usec = static_cast <decltype (tv.tv_usec )>(usec);
3207+ inline ssize_t select_read (socket_t sock, time_t sec, time_t usec) {
3208+ return select_impl<true >(sock, sec, usec);
3209+ }
32253210
3226- return handle_EINTR ([&]() {
3227- return select (static_cast <int >(sock + 1 ), nullptr , &fds, nullptr , &tv);
3228- });
3229- #endif
3211+ inline ssize_t select_write (socket_t sock, time_t sec, time_t usec) {
3212+ return select_impl<false >(sock, sec, usec);
32303213}
32313214
32323215inline Error wait_until_socket_is_ready (socket_t sock, time_t sec,
0 commit comments