From 3399e18693f1049c64ff7966286b2547479ee29c Mon Sep 17 00:00:00 2001 From: vasilito Date: Thu, 2 Jul 2026 07:03:53 +0300 Subject: [PATCH] =?UTF-8?q?relibc:=20P5-sched-api=20=E2=80=94=20apply=20Ph?= =?UTF-8?q?ase=200e=20patch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-apply P5-sched-api.patch from local/patches/relibc/ to the local fork. Multi-threading plan Phase 0e. --- src/header/sched/mod.rs | 97 ++++++++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 15 deletions(-) diff --git a/src/header/sched/mod.rs b/src/header/sched/mod.rs index bcdd34696c..6066550d5f 100644 --- a/src/header/sched/mod.rs +++ b/src/header/sched/mod.rs @@ -27,43 +27,110 @@ pub const SCHED_RR: c_int = 1; pub const SCHED_OTHER: c_int = 2; /// See . -// #[unsafe(no_mangle)] +#[unsafe(no_mangle)] pub extern "C" fn sched_get_priority_max(policy: c_int) -> c_int { - todo!() + match policy { + SCHED_FIFO | SCHED_RR => 99, + SCHED_OTHER => 0, + _ => { + crate::platform::ERRNO.set(crate::header::errno::EINVAL); + -1 + } + } } -/// See . -// #[unsafe(no_mangle)] +/// See . +#[unsafe(no_mangle)] pub extern "C" fn sched_get_priority_min(policy: c_int) -> c_int { - todo!() + match policy { + SCHED_FIFO | SCHED_RR => 1, + SCHED_OTHER => 0, + _ => { + crate::platform::ERRNO.set(crate::header::errno::EINVAL); + -1 + } + } } /// See . -// #[unsafe(no_mangle)] +#[unsafe(no_mangle)] pub unsafe extern "C" fn sched_getparam(pid: pid_t, param: *mut sched_param) -> c_int { - todo!() + if pid != 0 { + crate::platform::ERRNO.set(crate::header::errno::ESRCH); + return -1; + } + crate::platform::ERRNO.set(crate::header::errno::ENOSYS); + -1 +} + +/// See . +#[unsafe(no_mangle)] +pub extern "C" fn sched_getscheduler(pid: pid_t) -> c_int { + if pid != 0 { + crate::platform::ERRNO.set(crate::header::errno::ESRCH); + return -1; + } + crate::platform::ERRNO.set(crate::header::errno::ENOSYS); + -1 } /// See . -// #[unsafe(no_mangle)] -pub extern "C" fn sched_rr_get_interval(pid: pid_t, time: *const timespec) -> c_int { - todo!() +#[unsafe(no_mangle)] +pub extern "C" fn sched_rr_get_interval(pid: pid_t, tp: *mut timespec) -> c_int { + if pid != 0 { + crate::platform::ERRNO.set(crate::header::errno::ESRCH); + return -1; + } + if tp.is_null() { + crate::platform::ERRNO.set(crate::header::errno::EINVAL); + return -1; + } + unsafe { + (*tp).tv_sec = 0; + (*tp).tv_nsec = 100_000_000; // 100ms default SCHED_RR quantum + } + 0 } /// See . -// #[unsafe(no_mangle)] -pub unsafe extern "C" fn sched_setparam(pid: pid_t, param: *const sched_param) -> c_int { - todo!() +#[unsafe(no_mangle)] +pub unsafe extern "C" fn sched_setparam(pid: pid_t, _param: *const sched_param) -> c_int { + if pid != 0 { + crate::platform::ERRNO.set(crate::header::errno::ESRCH); + return -1; + } + crate::platform::ERRNO.set(crate::header::errno::ENOSYS); + -1 } /// See . -// #[unsafe(no_mangle)] +#[unsafe(no_mangle)] pub extern "C" fn sched_setscheduler( pid: pid_t, policy: c_int, param: *const sched_param, ) -> c_int { - todo!() + if pid != 0 { + crate::platform::ERRNO.set(crate::header::errno::ESRCH); + return -1; + } + match policy { + SCHED_OTHER => { + if !param.is_null() && unsafe { (*param).sched_priority } != 0 { + crate::platform::ERRNO.set(crate::header::errno::EINVAL); + return -1; + } + SCHED_OTHER + } + SCHED_FIFO | SCHED_RR => { + crate::platform::ERRNO.set(crate::header::errno::ENOSYS); + -1 + } + _ => { + crate::platform::ERRNO.set(crate::header::errno::EINVAL); + -1 + } + } } /// See .