mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 09:38:11 +00:00
Kernel+LibPthread+LibC: Add a naive futex and use it for pthread_cond_t
This patch implements a simple version of the futex (fast userspace mutex) API in the kernel and uses it to make the pthread_cond_t API's block instead of busily sched_yield(). An arbitrary userspace address is passed to the kernel as a "token" that identifies the futex and you can then FUTEX_WAIT and FUTEX_WAKE that specific userspace address. FUTEX_WAIT corresponds to pthread_cond_wait() and FUTEX_WAKE is used for pthread_cond_signal() and pthread_cond_broadcast(). I'm pretty sure I'm missing something in this implementation, but it's hopefully okay for a start. :^)
This commit is contained in:
parent
4b8b100b83
commit
4a8683ea68
9 changed files with 99 additions and 55 deletions
|
@ -150,7 +150,8 @@ typedef u32 socklen_t;
|
|||
__ENUMERATE_SYSCALL(set_shared_buffer_volatile) \
|
||||
__ENUMERATE_SYSCALL(profiling_enable) \
|
||||
__ENUMERATE_SYSCALL(profiling_disable) \
|
||||
__ENUMERATE_SYSCALL(get_kernel_info_page)
|
||||
__ENUMERATE_SYSCALL(get_kernel_info_page) \
|
||||
__ENUMERATE_SYSCALL(futex)
|
||||
|
||||
namespace Syscall {
|
||||
|
||||
|
@ -260,6 +261,13 @@ struct SC_setsockopt_params {
|
|||
socklen_t value_size;
|
||||
};
|
||||
|
||||
struct SC_futex_params {
|
||||
i32* userspace_address;
|
||||
int futex_op;
|
||||
i32 val;
|
||||
const timespec* timeout;
|
||||
};
|
||||
|
||||
struct SC_create_thread_params {
|
||||
unsigned int m_detach_state = 0; // JOINABLE or DETACHED
|
||||
int m_schedule_priority = 2; // ThreadPriority::Normal
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue