[Bug 46208] Elite Dangerous is unstable in wine-devel

wine-bugs at winehq.org wine-bugs at winehq.org
Sat Dec 1 21:23:29 CST 2018


https://bugs.winehq.org/show_bug.cgi?id=46208

--- Comment #13 from Brendan McGrath <brendan at redmandi.com> ---
(In reply to Zebediah Figura from comment #11)
> One alternative is
> to have an implementation almost identical to the futex path, but which uses
> RtlWaitOnAddress()/RtlWakeAddress() instead. It'd be horrendously slow, but
> I think we should be able to use native sync objects on all the platforms we
> care about.

This works. As a proof of concept I applied the futex patch and modified the
futex_wait and futex_wake to be:

static inline int futex_wait( int *addr, int val, struct timespec *timeout )
{
    LARGE_INTEGER li_timeout;
    LARGE_INTEGER *p_li_timeout;

    if (timeout) {
       li_timeout.LowPart = timeout->tv_sec * TICKSPERSEC + timeout->tv_nsec;
       p_li_timeout = &li_timeout;
    } else {
       p_li_timeout = NULL;
    }

    return RtlWaitOnAddress( addr, &val, sizeof(val), p_li_timeout );
}

static inline int futex_wake( int *addr, int val )
{
    if (val == INT_MAX)
        RtlWakeAddressAll(addr);
    else
        RtlWakeAddressSingle(addr);

    return STATUS_SUCCESS;
}

Obviously my 'struct timeout' to LARGE_INTEGER conversion is prone to overflow
and my formatting is terrible - but this was just proof of concept.

It worked without needing the two recent patches you submitted for
RtlWaitOnAddress too.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list