mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 23:07:35 +00:00
Kernel: Make Thread use AK::Time internally
This commit is very invasive, because Thread likes to take a pointer and write to it. This means that translating between timespec/timeval/Time would have been more difficult than just changing everything that hands a raw pointer to Thread, in bulk.
This commit is contained in:
parent
65b36e42b8
commit
2b6546c40a
14 changed files with 66 additions and 82 deletions
|
@ -36,9 +36,8 @@ KResultOr<unsigned> Process::sys$alarm(unsigned seconds)
|
|||
if (auto alarm_timer = move(m_alarm_timer)) {
|
||||
if (TimerQueue::the().cancel_timer(*alarm_timer)) {
|
||||
// The timer hasn't fired. Round up the remaining time (if any)
|
||||
timespec remaining;
|
||||
timespec_add(alarm_timer->remaining(), { 0, 1000000000 - 1 }, remaining);
|
||||
previous_alarm_remaining = remaining.tv_sec;
|
||||
Time remaining = alarm_timer->remaining() + Time::from_nanoseconds(999'999'999);
|
||||
previous_alarm_remaining = remaining.to_truncated_seconds();
|
||||
}
|
||||
// We had an existing alarm, must return a non-zero value here!
|
||||
if (previous_alarm_remaining == 0)
|
||||
|
@ -46,8 +45,9 @@ KResultOr<unsigned> Process::sys$alarm(unsigned seconds)
|
|||
}
|
||||
|
||||
if (seconds > 0) {
|
||||
auto deadline = TimeManagement::the().current_time(CLOCK_REALTIME_COARSE).value();
|
||||
timespec_add(deadline, { seconds, 0 }, deadline);
|
||||
// FIXME: Should use AK::Time internally
|
||||
auto deadline = Time::from_timespec(TimeManagement::the().current_time(CLOCK_REALTIME_COARSE).value());
|
||||
deadline = deadline + Time::from_seconds(seconds);
|
||||
m_alarm_timer = TimerQueue::the().add_timer_without_id(CLOCK_REALTIME_COARSE, deadline, [this]() {
|
||||
[[maybe_unused]] auto rc = send_signal(SIGALRM, nullptr);
|
||||
});
|
||||
|
|
|
@ -32,7 +32,7 @@ namespace Kernel {
|
|||
KResultOr<int> Process::sys$beep()
|
||||
{
|
||||
PCSpeaker::tone_on(440);
|
||||
auto result = Thread::current()->sleep({ 0, 200 });
|
||||
auto result = Thread::current()->sleep(Time::from_nanoseconds(200'000'000));
|
||||
PCSpeaker::tone_off();
|
||||
if (result.was_interrupted())
|
||||
return EINTR;
|
||||
|
|
|
@ -94,13 +94,12 @@ KResultOr<int> Process::sys$clock_nanosleep(Userspace<const Syscall::SC_clock_na
|
|||
|
||||
bool was_interrupted;
|
||||
if (is_absolute) {
|
||||
// FIXME: Should use AK::Time internally
|
||||
was_interrupted = Thread::current()->sleep_until(params.clock_id, requested_sleep->to_timespec()).was_interrupted();
|
||||
was_interrupted = Thread::current()->sleep_until(params.clock_id, requested_sleep.value()).was_interrupted();
|
||||
} else {
|
||||
timespec remaining_sleep;
|
||||
// FIXME: Should use AK::Time internally
|
||||
was_interrupted = Thread::current()->sleep(params.clock_id, requested_sleep->to_timespec(), &remaining_sleep).was_interrupted();
|
||||
if (was_interrupted && params.remaining_sleep && !copy_to_user(params.remaining_sleep, &remaining_sleep))
|
||||
Time remaining_sleep;
|
||||
was_interrupted = Thread::current()->sleep(params.clock_id, requested_sleep.value(), &remaining_sleep).was_interrupted();
|
||||
timespec remaining_sleep_ts = remaining_sleep.to_timespec();
|
||||
if (was_interrupted && params.remaining_sleep && !copy_to_user(params.remaining_sleep, &remaining_sleep_ts))
|
||||
return EFAULT;
|
||||
}
|
||||
if (was_interrupted)
|
||||
|
|
|
@ -123,9 +123,7 @@ KResultOr<int> Process::sys$futex(Userspace<const Syscall::SC_futex_params*> use
|
|||
return EFAULT;
|
||||
clockid_t clock_id = (params.futex_op & FUTEX_CLOCK_REALTIME) ? CLOCK_REALTIME_COARSE : CLOCK_MONOTONIC_COARSE;
|
||||
bool is_absolute = cmd != FUTEX_WAIT;
|
||||
// FIXME: Should use AK::Time internally
|
||||
timespec timeout_copy = timeout_time->to_timespec();
|
||||
timeout = Thread::BlockTimeout(is_absolute, &timeout_copy, nullptr, clock_id);
|
||||
timeout = Thread::BlockTimeout(is_absolute, &timeout_time.value(), nullptr, clock_id);
|
||||
}
|
||||
if (cmd == FUTEX_WAIT_BITSET && params.val3 == FUTEX_BITSET_MATCH_ANY)
|
||||
cmd = FUTEX_WAIT;
|
||||
|
|
|
@ -48,9 +48,7 @@ KResultOr<int> Process::sys$select(Userspace<const Syscall::SC_select_params*> u
|
|||
Optional<Time> timeout_time = copy_time_from_user(params.timeout);
|
||||
if (!timeout_time.has_value())
|
||||
return EFAULT;
|
||||
auto timeout_copy = timeout_time->to_timespec();
|
||||
// FIXME: Should use AK::Time internally
|
||||
timeout = Thread::BlockTimeout(false, &timeout_copy);
|
||||
timeout = Thread::BlockTimeout(false, &timeout_time.value());
|
||||
}
|
||||
|
||||
auto current_thread = Thread::current();
|
||||
|
@ -156,9 +154,7 @@ KResultOr<int> Process::sys$poll(Userspace<const Syscall::SC_poll_params*> user_
|
|||
auto timeout_time = copy_time_from_user(params.timeout);
|
||||
if (!timeout_time.has_value())
|
||||
return EFAULT;
|
||||
timespec timeout_copy = timeout_time->to_timespec();
|
||||
// FIXME: Should use AK::Time internally
|
||||
timeout = Thread::BlockTimeout(false, &timeout_copy);
|
||||
timeout = Thread::BlockTimeout(false, &timeout_time.value());
|
||||
}
|
||||
|
||||
sigset_t sigmask = {};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue