Skip to content

Commit b397c76

Browse files
Unify select_read() and select_write() (#2047)
1 parent 8e22a76 commit b397c76

File tree

1 file changed

+15
-32
lines changed

1 file changed

+15
-32
lines changed

httplib.h

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

32693252
inline Error wait_until_socket_is_ready(socket_t sock, time_t sec,

0 commit comments

Comments
 (0)