Fixed timeout calculation bugs
This commit is contained in:
parent
42f9f9107f
commit
c7d22e451f
20
httplib.h
20
httplib.h
@ -1701,7 +1701,7 @@ inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) {
|
|||||||
pfd_read.fd = sock;
|
pfd_read.fd = sock;
|
||||||
pfd_read.events = POLLIN;
|
pfd_read.events = POLLIN;
|
||||||
|
|
||||||
auto timeout = static_cast<int>(sec * 1000 + usec / 1000);
|
auto timeout = static_cast<int>(sec * 1000 + usec);
|
||||||
|
|
||||||
return handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); });
|
return handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); });
|
||||||
#else
|
#else
|
||||||
@ -1749,7 +1749,7 @@ inline bool wait_until_socket_is_ready(socket_t sock, time_t sec, time_t usec) {
|
|||||||
pfd_read.fd = sock;
|
pfd_read.fd = sock;
|
||||||
pfd_read.events = POLLIN | POLLOUT;
|
pfd_read.events = POLLIN | POLLOUT;
|
||||||
|
|
||||||
auto timeout = static_cast<int>(sec * 1000 + usec / 1000);
|
auto timeout = static_cast<int>(sec * 1000 + usec);
|
||||||
|
|
||||||
auto poll_res = handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); });
|
auto poll_res = handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); });
|
||||||
|
|
||||||
@ -1850,25 +1850,19 @@ private:
|
|||||||
size_t position = 0;
|
size_t position = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool keep_alive(socket_t sock, std::function<bool()> is_shutting_down) {
|
inline bool keep_alive(socket_t sock) {
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
auto start = steady_clock::now();
|
auto start = steady_clock::now();
|
||||||
while (true) {
|
while (true) {
|
||||||
auto val = select_read(sock, 0, 10000);
|
auto val = select_read(sock, 0, 10000);
|
||||||
if (is_shutting_down && is_shutting_down()) {
|
if (val < 0) {
|
||||||
return false;
|
|
||||||
} else if (val < 0) {
|
|
||||||
return false;
|
return false;
|
||||||
} else if (val == 0) {
|
} else if (val == 0) {
|
||||||
auto current = steady_clock::now();
|
auto current = steady_clock::now();
|
||||||
auto sec = duration_cast<seconds>(current - start);
|
auto duration = duration_cast<milliseconds>(current - start);
|
||||||
if (sec.count() > CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND) {
|
auto timeout = CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND * 100 + CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND;
|
||||||
|
if (duration.count() > timeout) {
|
||||||
return false;
|
return false;
|
||||||
} else if (sec.count() == CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND) {
|
|
||||||
auto usec = duration_cast<nanoseconds>(current - start);
|
|
||||||
if (usec.count() > CPPHTTPLIB_KEEPALIVE_TIMEOUT_USECOND) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user