[vlc-devel] [PATCH] core: fix vlc_tick_now on darwin platform

Zhao Zhili quinkblack at foxmail.com
Thu Sep 27 08:25:22 CEST 2018



On 2018年09月27日 14:01, Steve Lhomme wrote:
> Not having a mac like most people I can only make changes blindly and 
> hope it works. I did take some time on these changes to make sure I 
> didn't overlook something, but it wasn't enough.

I appreciate your work on the timestamps issue, and hope the evil 
VLC_TICK_INVALID finally get fixed.

>
> On 27/09/2018 06:00, Zhao Zhili wrote:
>> I didn't build on MacOS for a few days, so I didn't know from when 
>> does the MacOS version was broken. Debugging on this issue really 
>> takes some time including slow rebuild on old MacBook. So please do 
>> some basic test before push. I can help on the test if you don't have 
>> the environment.
>>
>> On 2018年09月27日 11:42, Zhao Zhili wrote:
>>> ---
>>>   src/darwin/thread.c | 10 +++-------
>>>   1 file changed, 3 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/src/darwin/thread.c b/src/darwin/thread.c
>>> index f5eb4f2..0dd1e3c 100644
>>> --- a/src/darwin/thread.c
>>> +++ b/src/darwin/thread.c
>>> @@ -516,14 +516,10 @@ vlc_tick_t vlc_tick_now (void)
>>>       vlc_clock_setup();
>>>       uint64_t date = mach_absolute_time();
>>>   -    /* denom is uint32_t, switch to 64 bits to prevent overflow. */
>>> -    uint64_t denom = vlc_clock_conversion_factor.denom;
>>> -
>>> -    /* Switch to microsecs */
>>> -    denom *= UINT64_C(1000);
>>> -
>>>       /* Split the division to prevent overflow */
>>> -    return vlc_tick_from_frac( date * 
>>> vlc_clock_conversion_factor.numer, denom );
>>> +    lldiv_t d = lldiv (vlc_clock_conversion_factor.numer, 
>>> vlc_clock_conversion_factor.denom);
>>> +    date = (d.quot * date) + ((d.rem * date) / 
>>> vlc_clock_conversion_factor.denom);
>
> Here the (date * d.rem) might overflow. The original 1000 
> multiplication was lowering the d.rem value which was less bound to 
> overflow.

Before the patch:
     d.rem <= denom - 1

In the patch:
     d.rem <= vlc_clock_conversion_factor.denom - 1

And
     denom = 1000 * vlc_clock_conversion_factor.denom

So it doesn't make it worse.

I don't think the 1000 multiplication has another purpose other than /* 
Switch to microsecs */

>
> In practice it really depends on the common values of 
> vlc_clock_conversion_factor.numer / vlc_clock_conversion_factor.denom. 
> I suspect they are both small values.

In my test case, numer and denom are both 1.

>
>>> +    return VLC_TICK_FROM_NS(date);
>>>   }
>>>     #undef vlc_tick_wait
>>
>>
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel





More information about the vlc-devel mailing list