1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 02:57:42 +00:00

Add support for socket send/receive timeouts.

Only the receive timeout is hooked up yet. You can change the timeout by
calling setsockopt(..., SOL_SOCKET, SO_RCVTIMEO, ...).

Use this mechanism to make /bin/ping report timeouts.
This commit is contained in:
Andreas Kling 2019-03-13 13:13:23 +01:00
parent 7bcd386338
commit 562663df7c
12 changed files with 212 additions and 12 deletions

View file

@ -54,8 +54,11 @@ bool Scheduler::pick_next()
return context_switch(*s_colonel_process);
}
auto now_sec = RTC::now();
auto now_usec = (suseconds_t)((PIT::ticks_since_boot() % 1000) * 1000);
// Check and unblock processes whose wait conditions have been met.
Process::for_each([] (Process& process) {
Process::for_each([&] (Process& process) {
if (process.state() == Process::BlockedSleep) {
if (process.wakeup_time() <= system.uptime)
process.unblock();
@ -100,18 +103,19 @@ bool Scheduler::pick_next()
if (process.state() == Process::BlockedReceive) {
ASSERT(process.m_blocked_socket);
auto& socket = *process.m_blocked_socket;
// FIXME: Block until the amount of data wanted is available.
if (process.m_blocked_socket->can_read(SocketRole::None)) {
bool timed_out = now_sec > socket.receive_deadline().tv_sec || (now_sec == socket.receive_deadline().tv_sec && now_usec >= socket.receive_deadline().tv_usec);
if (timed_out || socket.can_read(SocketRole::None)) {
process.unblock();
process.m_blocked_socket = nullptr;
return true;
}
return true;
}
if (process.state() == Process::BlockedSelect) {
if (process.m_select_has_timeout) {
auto now_sec = RTC::now();
auto now_usec = PIT::ticks_since_boot() % 1000;
if (now_sec > process.m_select_timeout.tv_sec || (now_sec == process.m_select_timeout.tv_sec && now_usec >= process.m_select_timeout.tv_usec)) {
process.unblock();
return true;