2026-03-18 20:57:51 +00:00
|
|
|
#include <kernel/futex.h>
|
|
|
|
|
#include <kernel/sched.h>
|
|
|
|
|
#include <kernel/syscall.h>
|
|
|
|
|
#include <kernel/task.h>
|
|
|
|
|
|
|
|
|
|
kern_status_t sys_futex_wait(
|
|
|
|
|
kern_futex_t *futex,
|
|
|
|
|
kern_futex_t new_val,
|
|
|
|
|
unsigned int flags)
|
|
|
|
|
{
|
2026-04-01 18:17:05 +01:00
|
|
|
struct task *self = get_current_task();
|
2026-03-18 20:57:51 +00:00
|
|
|
if (!validate_access_r(self, futex, sizeof *futex)) {
|
2026-04-01 18:17:05 +01:00
|
|
|
put_current_task(self);
|
2026-03-18 20:57:51 +00:00
|
|
|
return KERN_MEMORY_FAULT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
futex_key_t key;
|
|
|
|
|
kern_status_t status = futex_get(futex, &key, flags);
|
|
|
|
|
if (status != KERN_OK) {
|
2026-04-01 18:17:05 +01:00
|
|
|
put_current_task(self);
|
2026-03-18 20:57:51 +00:00
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-01 18:17:05 +01:00
|
|
|
status = futex_wait(key, new_val, flags);
|
|
|
|
|
put_current_task(self);
|
|
|
|
|
return status;
|
2026-03-18 20:57:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
kern_status_t sys_futex_wake(
|
|
|
|
|
kern_futex_t *futex,
|
|
|
|
|
unsigned int nr_waiters,
|
|
|
|
|
unsigned int flags)
|
|
|
|
|
{
|
|
|
|
|
futex_key_t key;
|
|
|
|
|
kern_status_t status = futex_get(futex, &key, flags);
|
|
|
|
|
if (status != KERN_OK) {
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return futex_wake(key, nr_waiters, flags);
|
|
|
|
|
}
|