From 9066e62a97cc4950a025c6d5caf5597c184b1422 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 2 Apr 2025 02:44:31 +0300 Subject: [PATCH] Kernel/LibC: Implement sched_yield --- kernel/include/kernel/Process.h | 1 + kernel/kernel/Process.cpp | 6 ++++++ userspace/libraries/LibC/CMakeLists.txt | 1 + userspace/libraries/LibC/include/sys/syscall.h | 1 + userspace/libraries/LibC/sched.cpp | 8 ++++++++ 5 files changed, 17 insertions(+) create mode 100644 userspace/libraries/LibC/sched.cpp diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 0f68822b..1b23a290 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -182,6 +182,7 @@ namespace Kernel BAN::ErrorOr sys_sigpending(sigset_t* set); BAN::ErrorOr sys_sigprocmask(int how, const sigset_t* set, sigset_t* oset); + BAN::ErrorOr sys_yield(); BAN::ErrorOr sys_pthread_create(const pthread_attr_t* __restrict attr, void (*entry)(void*), void* arg); BAN::ErrorOr sys_pthread_exit(void* value); BAN::ErrorOr sys_pthread_self(); diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 06f7d247..4f9b1507 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -2084,6 +2084,12 @@ namespace Kernel return 0; } + BAN::ErrorOr Process::sys_yield() + { + Processor::yield(); + return 0; + } + BAN::ErrorOr Process::sys_pthread_create(const pthread_attr_t* __restrict attr, void (*entry)(void*), void* arg) { if (attr != nullptr) diff --git a/userspace/libraries/LibC/CMakeLists.txt b/userspace/libraries/LibC/CMakeLists.txt index abb54937..2ad05ad6 100644 --- a/userspace/libraries/LibC/CMakeLists.txt +++ b/userspace/libraries/LibC/CMakeLists.txt @@ -20,6 +20,7 @@ set(LIBC_SOURCES pthread.cpp pwd.cpp scanf_impl.cpp + sched.cpp setjmp.cpp signal.cpp stdio.cpp diff --git a/userspace/libraries/LibC/include/sys/syscall.h b/userspace/libraries/LibC/include/sys/syscall.h index b6434a97..32de461b 100644 --- a/userspace/libraries/LibC/include/sys/syscall.h +++ b/userspace/libraries/LibC/include/sys/syscall.h @@ -90,6 +90,7 @@ __BEGIN_DECLS O(SYS_FSYNC, fsync) \ O(SYS_SYMLINKAT, symlinkat) \ O(SYS_HARDLINKAT, hardlinkat) \ + O(SYS_YIELD, yield) \ O(SYS_PTHREAD_CREATE, pthread_create) \ O(SYS_PTHREAD_EXIT, pthread_exit) \ O(SYS_PTHREAD_SELF, pthread_self) \ diff --git a/userspace/libraries/LibC/sched.cpp b/userspace/libraries/LibC/sched.cpp new file mode 100644 index 00000000..72138299 --- /dev/null +++ b/userspace/libraries/LibC/sched.cpp @@ -0,0 +1,8 @@ +#include +#include +#include + +int sched_yield(void) +{ + return syscall(SYS_YIELD); +}