vlc | branch: master | Zhao Zhili <[email protected]> | Thu Sep 27 20:14:06 2018 +0800| [65407e7030174bb4965b6589d9cdedbb4577949c] | committer: Steve Lhomme
darwin: thread: fix invalid ticks conversion Signed-off-by: Steve Lhomme <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=65407e7030174bb4965b6589d9cdedbb4577949c --- src/darwin/thread.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/darwin/thread.c b/src/darwin/thread.c index f5eb4f234e..a96334cd4e 100644 --- a/src/darwin/thread.c +++ b/src/darwin/thread.c @@ -42,12 +42,21 @@ #include <mach/mach_time.h> #include <execinfo.h> -static mach_timebase_info_data_t vlc_clock_conversion_factor; +static struct { + uint32_t quotient; + uint32_t remainder; + uint32_t divider; +} vlc_clock_conversion; static void vlc_clock_setup_once (void) { - if (unlikely(mach_timebase_info (&vlc_clock_conversion_factor) != 0)) + mach_timebase_info_data_t timebase; + if (unlikely(mach_timebase_info (&timebase) != 0)) abort (); + lldiv_t d = lldiv (timebase.numer, timebase.denom); + vlc_clock_conversion.quotient = (uint32_t)d.quot; + vlc_clock_conversion.remainder = (uint32_t)d.rem; + vlc_clock_conversion.divider = timebase.denom; } static pthread_once_t vlc_clock_once = PTHREAD_ONCE_INIT; @@ -516,14 +525,9 @@ 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 ); + date = date * vlc_clock_conversion.quotient + + date * vlc_clock_conversion.remainder / vlc_clock_conversion.divider; + return VLC_TICK_FROM_NS(date); } #undef vlc_tick_wait _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
