linux: futex v1 API cleanup

* Use `packed struct` for flags arguments.  So, instead of
  `linux.FUTEX.WAIT` use `.{ .cmd = .WAIT, .private = true }`

* rename `futex_wait` and `futex_wake` which didn't actually specify
  wait/wake, as `futex_3arg` and `futex_4arg` (as its the number
  of parameters that is different, the `op` is whatever is specified.

* expose the full six-arg flavor of the syscall (for some of the advanced
  ops), and add packed structs for their arguments.

* Use a `packed union` to support the 4th parameter which is sometimes a
  `timespec` pointer, and sometimes a `u32`.

* Add tests that make sure the structure layout is correct and that the
  basic argument passing is working (no actual futexes are contended).
This commit is contained in:
Pat Tullmann
2025-04-02 16:14:50 -07:00
parent 850655f06b
commit cfe5defd02
4 changed files with 190 additions and 38 deletions

View File

@@ -1539,10 +1539,10 @@ const LinuxThreadImpl = struct {
continue;
}
switch (linux.E.init(linux.futex_wait(
switch (linux.E.init(linux.futex_4arg(
&self.thread.child_tid.raw,
linux.FUTEX.WAIT,
tid,
.{ .cmd = .WAIT, .private = false },
@bitCast(tid),
null,
))) {
.SUCCESS => continue,