Files
magenta/syscall/futex.c
T

42 lines
858 B
C

#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)
{
struct task *self = get_current_task();
if (!validate_access_r(self, futex, sizeof *futex)) {
put_current_task(self);
return KERN_MEMORY_FAULT;
}
futex_key_t key;
kern_status_t status = futex_get(futex, &key, flags);
if (status != KERN_OK) {
put_current_task(self);
return status;
}
status = futex_wait(key, new_val, flags);
put_current_task(self);
return status;
}
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);
}