38 lines
759 B
C
38 lines
759 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 = current_task();
|
|
if (!validate_access_r(self, futex, sizeof *futex)) {
|
|
return KERN_MEMORY_FAULT;
|
|
}
|
|
|
|
futex_key_t key;
|
|
kern_status_t status = futex_get(futex, &key, flags);
|
|
if (status != KERN_OK) {
|
|
return status;
|
|
}
|
|
|
|
return futex_wait(key, new_val, flags);
|
|
}
|
|
|
|
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);
|
|
}
|