Kernel: Implement the alarm() syscall.

This commit is contained in:
Andreas Kling 2019-06-07 11:30:07 +02:00
parent a2a6bb93bc
commit d194ce828d
Notes: sideshowbarker 2024-07-19 13:42:00 +09:00
3 changed files with 19 additions and 4 deletions

View file

@ -1207,8 +1207,16 @@ int Process::sys$setgid(gid_t gid)
unsigned Process::sys$alarm(unsigned seconds)
{
(void) seconds;
ASSERT_NOT_REACHED();
unsigned previous_alarm_remaining = 0;
if (m_alarm_deadline && m_alarm_deadline > g_uptime) {
previous_alarm_remaining = (m_alarm_deadline - g_uptime) / TICKS_PER_SECOND;
}
if (!seconds) {
m_alarm_deadline = 0;
return previous_alarm_remaining;
}
m_alarm_deadline = g_uptime + seconds * TICKS_PER_SECOND;
return previous_alarm_remaining;
}
int Process::sys$uname(utsname* buf)

View file

@ -351,6 +351,8 @@ private:
OwnPtr<ELFLoader> m_elf_loader;
Lock m_big_lock { "Process" };
qword m_alarm_deadline { 0 };
};
class ProcessInspectionHandle {
@ -396,7 +398,7 @@ inline void Process::for_each(Callback callback)
ASSERT_INTERRUPTS_DISABLED();
for (auto* process = g_processes->head(); process;) {
auto* next_process = process->next();
if (!callback(*process))
if (callback(*process) == IterationDecision::Abort)
break;
process = next_process;
}

View file

@ -188,8 +188,13 @@ bool Scheduler::pick_next()
auto exit_status = Process::reap(process);
dbgprintf("reaped unparented process %s(%u), exit status: %u\n", name.characters(), pid, exit_status);
}
return IterationDecision::Continue;
}
return true;
if (process.m_alarm_deadline && g_uptime > process.m_alarm_deadline) {
process.m_alarm_deadline = 0;
process.send_signal(SIGALRM, nullptr);
}
return IterationDecision::Continue;
});
// Dispatch any pending signals.