(timeout in ms vs. XSyncValueSubtract) Frozen client, found cause, need advise for fix
walter harms
wharms at bfs.de
Wed Feb 22 08:50:22 UTC 2017
Am 21.02.2017 20:28, schrieb Mihail Konev:
> On Tue, Feb 21, 2017 at 05:48:19PM +0100, walter harms wrote:
>>>
>>
>> XSyncValueSubtract is doing as expected,
>> XSyncValue is the simulation of 64bitvalues on 32bit.
>> see this in hex:
>> 100000001
>> -000000002
>> 0FFFFFFFF = 4294967295 in .lo
>>
>
> Kind of - it errorneously returns
>
> 1 0000 0001
> -0 0000 0002
> 1 ffff ffff
>
> Test source attached.
>
> I.e.
> XSyncValueSubtract should handle the .lo becoming <0,
> and it checks only for .lo_after_subtract < .lo,
> which would only be aplicable to uint.
>
> E.g. there is a typo in XSyncValue.lo definition - it should be uint
> instead.
> Also in ServertimeBlockHandler, "timeout" is unsigned,
> while it is get from signed .lo and used as signed arg to
> AdjustWaitForTimeout.
yep, i noticed that "int t = (a).lo;" and was confused. But the experiments showed
is seems to work.
#define _XSyncValueSubtract(presult,a,b,poverflow) {\
int t = (a).lo;\
Bool signa = XSyncValueIsNegative(a);\
Bool signb = XSyncValueIsNegative(b);\
((presult)->lo = (a).lo - (b).lo);\
((presult)->hi = (a).hi - (b).hi);\
if (t>(presult)->lo) (presult)->hi--;\
*poverflow = ((signa == signb) && !(signa == XSyncValueIsNegative(*presu
lt)));\
}
my test code:
#include <stdio.h>
#include <X11/Xlibint.h>
#include <X11/extensions/sync.h>
// gcc xsync.c -lXext
int main()
{
XSyncValue a,b,c;
XSyncValue result;
Bool ov;
XSyncIntToValue(&a, 100);
XSyncIntToValue(&b, 200);
XSyncValueSubtract(&result, b, a, &ov);
printf("result.hi = %d, result.lo = %d, overflow = %d\n", result.hi, result.lo, ov);
}
I did not look at the asm level but the interessting question is:
can that be replace by int64_t ? is it done somewhere else ?
re,
wh
>
> Perhaps also:
> AdjustWaitForTimeout should not be used if overflow != 0
> Because something is wrong then as (pnext_time < Now) ?
>
> Mihail
More information about the xorg-devel
mailing list