@@ -3210,60 +3210,43 @@ inline ssize_t send_socket(socket_t sock, const void *ptr, size_t size,
32103210 });
32113211}
32123212
3213- inline ssize_t select_read (socket_t sock, time_t sec, time_t usec) {
3213+ template <bool Read>
3214+ inline ssize_t select_impl (socket_t sock, time_t sec, time_t usec) {
32143215#ifdef CPPHTTPLIB_USE_POLL
3215- struct pollfd pfd_read ;
3216- pfd_read .fd = sock;
3217- pfd_read .events = POLLIN;
3216+ struct pollfd pfd ;
3217+ pfd .fd = sock;
3218+ pfd .events = (Read ? POLLIN : POLLOUT) ;
32183219
32193220 auto timeout = static_cast <int >(sec * 1000 + usec / 1000 );
32203221
3221- return handle_EINTR ([&]() { return poll (&pfd_read , 1 , timeout); });
3222+ return handle_EINTR ([&]() { return poll (&pfd , 1 , timeout); });
32223223#else
32233224#ifndef _WIN32
32243225 if (sock >= FD_SETSIZE) { return -1 ; }
32253226#endif
32263227
3227- fd_set fds;
3228+ fd_set fds, *rfds, *wfds ;
32283229 FD_ZERO (&fds);
32293230 FD_SET (sock, &fds);
3231+ rfds = (Read ? &fds : nullptr );
3232+ wfds = (Read ? nullptr : &fds);
32303233
32313234 timeval tv;
32323235 tv.tv_sec = static_cast <long >(sec);
32333236 tv.tv_usec = static_cast <decltype (tv.tv_usec )>(usec);
32343237
32353238 return handle_EINTR ([&]() {
3236- return select (static_cast <int >(sock + 1 ), &fds, nullptr , nullptr , &tv);
3239+ return select (static_cast <int >(sock + 1 ), rfds, wfds , nullptr , &tv);
32373240 });
32383241#endif
32393242}
32403243
3241- inline ssize_t select_write (socket_t sock, time_t sec, time_t usec) {
3242- #ifdef CPPHTTPLIB_USE_POLL
3243- struct pollfd pfd_read;
3244- pfd_read.fd = sock;
3245- pfd_read.events = POLLOUT;
3246-
3247- auto timeout = static_cast <int >(sec * 1000 + usec / 1000 );
3248-
3249- return handle_EINTR ([&]() { return poll (&pfd_read, 1 , timeout); });
3250- #else
3251- #ifndef _WIN32
3252- if (sock >= FD_SETSIZE) { return -1 ; }
3253- #endif
3254-
3255- fd_set fds;
3256- FD_ZERO (&fds);
3257- FD_SET (sock, &fds);
3258-
3259- timeval tv;
3260- tv.tv_sec = static_cast <long >(sec);
3261- tv.tv_usec = static_cast <decltype (tv.tv_usec )>(usec);
3244+ inline ssize_t select_read (socket_t sock, time_t sec, time_t usec) {
3245+ return select_impl<true >(sock, sec, usec);
3246+ }
32623247
3263- return handle_EINTR ([&]() {
3264- return select (static_cast <int >(sock + 1 ), nullptr , &fds, nullptr , &tv);
3265- });
3266- #endif
3248+ inline ssize_t select_write (socket_t sock, time_t sec, time_t usec) {
3249+ return select_impl<false >(sock, sec, usec);
32673250}
32683251
32693252inline Error wait_until_socket_is_ready (socket_t sock, time_t sec,
0 commit comments