(timeout in ms vs. XSyncValueSubtract) Frozen client, found cause, need advise for fix

Daniel Martin consume.noise at gmail.com
Wed Feb 22 14:48:20 UTC 2017


Am 22.02.2017 11:24 schrieb "Daniel Martin" <consume.noise at gmail.com>:

On 21 February 2017 at 17:48, walter harms <wharms at bfs.de> wrote:
> Am 20.02.2017 10:55, schrieb Daniel Martin:
>> What happens is:
>> - ServertimeBlockHandler() forwards a _big_ unsigned timeout to
>> AdjustWaitForDelay()
>> - AdjustWaitForDelay() takes this _big_ unsigned as int and it becomes
>> a negative value
>> - the negative value ends up as timeout in ospoll_wait() as parameter
>> to epoll_wait()
>>> epoll_wait() blocks due to the negative timeout
>>
>> XSyncValueSubtract() doesn't handle unsigned wraps. That's why we get
>> a big unsigned from ServertimeBlockHandler(). Just imagine two
>> XSyncValues:
>>     a = {.hi=1, .lo=1} and b = {.hi=0, lo=.2}.
>> The result of XSyncValueSubtract(a - b) is
>>     presult = {.hi=0, .lo=4294967295},
>> where I would expect
>>    presult = {.hi=0, .lo=9}.
>>
>> If .lo=4294967295 is wrong and .lo=9 is what we want, could anyone
>> provide a fix, please? I'm to dumb for the (binary?) arithmetic atm.
>> (And if it is wrong, did I just uncovered an ancient bug?)
>>
>
> XSyncValueSubtract is doing as expected,
> XSyncValue is the simulation of 64bitvalues on 32bit.
> see this in hex:
>  100000001
> -000000002
>  0FFFFFFFF = 4294967295 in .lo

If XSyncValueSubtract is correct as is, then I would say, that it is
not what we want in ServertimeBlockHandler().
At that point we handle XSyncValues like a struct timeval, though .lo
not being in usec, but ms. So, every .lo < 0 or > 999 is wrong.


That's wrong.  Ignore this.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.x.org/archives/xorg-devel/attachments/20170222/3b5b843a/attachment.html>


More information about the xorg-devel mailing list