On 2/15/21 2:03 PM, Gabriel Krisman Bertazi wrote:
André Almeida andrealmeid@collabora.com writes:
Add support to wait on multiple futexes. This is the interface implemented by this syscall:
futex_waitv(struct futex_waitv *waiters, unsigned int nr_futexes, unsigned int flags, struct timespec *timo)
struct futex_waitv { void *uaddr; unsigned int val; unsigned int flags; };
Given an array of struct futex_waitv, wait on each uaddr. The thread wakes if a futex_wake() is performed at any uaddr. The syscall returns immediately if any waiter has *uaddr != val. *timo is an optional timeout value for the operation. The flags argument of the syscall should be used solely for specifying the timeout as realtime, if needed. Flags for shared futexes, sizes, etc. should be used on the individual flags of each waiter.
Given the previous proposal from Zebediah, one use case Wine has to support is the ability to wait on all (instead of any) of a list of futexes . I suppose that could be done by a new FLAG_WAITALL passed on the third argument of the syscall.
I don't think that such a feature would help Wine very much. It doesn't fix any of the correctness problems with the futex-backed implementation of NT primitives, and given the rarity of the wait-on-all operation I'm inclined to believe it won't help performance either.