1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-22 16:45:08 +00:00

Kernel: Implement the alarm() syscall.

This commit is contained in:
Andreas Kling 2019-06-07 11:30:07 +02:00
parent a2a6bb93bc
commit d194ce828d
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) unsigned Process::sys$alarm(unsigned seconds)
{ {
(void) seconds; unsigned previous_alarm_remaining = 0;
ASSERT_NOT_REACHED(); 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) int Process::sys$uname(utsname* buf)

View file

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

View file

@ -188,8 +188,13 @@ bool Scheduler::pick_next()
auto exit_status = Process::reap(process); auto exit_status = Process::reap(process);
dbgprintf("reaped unparented process %s(%u), exit status: %u\n", name.characters(), pid, exit_status); 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. // Dispatch any pending signals.