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:
parent
a2a6bb93bc
commit
d194ce828d
3 changed files with 19 additions and 4 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue