Skip to content

Commit ae84b1d

Browse files
Unify select_read() and select_write()
1 parent 8aad481 commit ae84b1d

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
@@ -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

32323215
inline Error wait_until_socket_is_ready(socket_t sock, time_t sec,

0 commit comments

Comments
 (0)