diff --git a/lib/sync/_linux.q b/lib/sync/_linux.q index c788808..4a8e92c 100644 --- a/lib/sync/_linux.q +++ b/lib/sync/_linux.q @@ -1,7 +1,13 @@ const { - FUTEX_WAIT = 0 - FUTEX_WAKE = 1 - FUTEX_FD = 2 - FUTEX_REQUEUE = 3 - FUTEX_CMP_REQUEUE = 4 + _futex_wake = 454 + _futex_wait = 455 + _futex_waitv = 449 +} + +const { + FUTEX2_SIZE_U8 = 0x00 + FUTEX2_SIZE_U16 = 0x01 + FUTEX2_SIZE_U32 = 0x02 + FUTEX2_SIZE_U64 = 0x03 + FUTEX2_PRIVATE = 0x80 } \ No newline at end of file diff --git a/lib/sync/_linux_arm.q b/lib/sync/_linux_arm.q deleted file mode 100644 index 7bc788b..0000000 --- a/lib/sync/_linux_arm.q +++ /dev/null @@ -1,3 +0,0 @@ -const { - _futex = 98 -} \ No newline at end of file diff --git a/lib/sync/_linux_x86.q b/lib/sync/_linux_x86.q deleted file mode 100644 index 03f1fd7..0000000 --- a/lib/sync/_linux_x86.q +++ /dev/null @@ -1,3 +0,0 @@ -const { - _futex = 202 -} \ No newline at end of file diff --git a/lib/sync/futex_linux.q b/lib/sync/futex_linux.q index 69a4570..6e8991f 100644 --- a/lib/sync/futex_linux.q +++ b/lib/sync/futex_linux.q @@ -1,3 +1,13 @@ -futex(address *uint32, op int, value int, timeout *any|nil, address2 *uint32|nil, value3 uint32) -> int { - return syscall(_futex, address, op, value, timeout, address2, value3) +import time + +futex_wake(address *any, mask uint, count int32, flags uint32) -> error { + return syscall(_futex_wake, address, mask, count, flags) +} + +futex_wait(address *any, value uint, mask uint, flags uint32, timeout *time.Timespec|nil, clockid int32) -> error { + return syscall(_futex_wait, address, value, mask, flags, timeout, clockid) +} + +futex_waitv(waiters *FutexWaitv, count uint32, flags uint32, timeout *time.Timespec|nil, clockid int32) -> error { + return syscall(_futex_waitv, waiters, count, flags, timeout, clockid) } \ No newline at end of file diff --git a/lib/sync/struct_linux.q b/lib/sync/struct_linux.q new file mode 100644 index 0000000..cc37b2a --- /dev/null +++ b/lib/sync/struct_linux.q @@ -0,0 +1,6 @@ +FutexWaitv { + value uint64 + address *any + flags uint32 + _ uint32 +} \ No newline at end of file diff --git a/lib/sync/wait_linux.q b/lib/sync/wait_linux.q new file mode 100644 index 0000000..185ea0b --- /dev/null +++ b/lib/sync/wait_linux.q @@ -0,0 +1,5 @@ +import time + +wait(address *uint32, value uint32) -> error { + return futex_wait(address, value as uint64, 0xFFFFFFFF, FUTEX2_SIZE_U32, 0, time.monotonic) +} \ No newline at end of file