Skip to content

Commit

Permalink
MDEV-23175: my_timer_milliseconds clock_gettime for multiple platfomrs
Browse files Browse the repository at this point in the history
Small postfix to MDEV-23175 to ensure faster option on FreeBSD
and compatibility to Solaris that isn't high resolution.

ftime is left as a backup in case an implementation doesn't
contain any of these clocks.

FreeBSD
    $ ./unittest/mysys/my_rdtsc-t
    1..11
    # ----- Routine ---------------
    # myt.cycles.routine          :             5
    # myt.nanoseconds.routine     :            11
    # myt.microseconds.routine    :            13
    # myt.milliseconds.routine    :            11
    # myt.ticks.routine           :            17
    # ----- Frequency -------------
    # myt.cycles.frequency        :    3610295566
    # myt.nanoseconds.frequency   :    1000000000
    # myt.microseconds.frequency  :       1000000
    # myt.milliseconds.frequency  :           899
    # myt.ticks.frequency         :           136
    # ----- Resolution ------------
    # myt.cycles.resolution       :             1
    # myt.nanoseconds.resolution  :             1
    # myt.microseconds.resolution :             1
    # myt.milliseconds.resolution :             7
    # myt.ticks.resolution        :             1
    # ----- Overhead --------------
    # myt.cycles.overhead         :            26
    # myt.nanoseconds.overhead    :         19140
    # myt.microseconds.overhead   :         19036
    # myt.milliseconds.overhead   :           578
    # myt.ticks.overhead          :         21544
    ok 1 - my_timer_init() did not crash
    ok 2 - The cycle timer is strictly increasing
    ok 3 - The cycle timer is implemented
    ok 4 - The nanosecond timer is increasing
    ok 5 - The nanosecond timer is implemented
    ok 6 - The microsecond timer is increasing
    ok 7 - The microsecond timer is implemented
    ok 8 - The millisecond timer is increasing
    ok 9 - The millisecond timer is implemented
    ok 10 - The tick timer is increasing
    ok 11 - The tick timer is implemented
  • Loading branch information
grooverdan authored and sysprg committed Dec 22, 2021
1 parent 85defc4 commit 12087d6
Showing 1 changed file with 24 additions and 2 deletions.
26 changes: 24 additions & 2 deletions mysys/my_rdtsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -356,9 +356,29 @@ ulonglong my_timer_microseconds(void)
milliseconds.
*/

#if defined(HAVE_CLOCK_GETTIME)
#if defined(CLOCK_MONOTONIC_FAST)
/* FreeBSD */
#define MY_CLOCK_ID CLOCK_MONOTONIC_FAST
#elif defined(CLOCK_MONOTONIC_COARSE)
/* Linux */
#define MY_CLOCK_ID CLOCK_MONOTONIC_COARSE
#elif defined(CLOCK_MONOTONIC)
/* POSIX (includes OSX) */
#define MY_CLOCK_ID CLOCK_MONOTONIC
#elif defined(CLOCK_REALTIME)
/* Solaris (which doesn't seem to have MONOTONIC) */
#define MY_CLOCK_ID CLOCK_REALTIME
#endif
#endif

ulonglong my_timer_milliseconds(void)
{
#if defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME)
#if defined(MY_CLOCK_ID)
struct timespec tp;
clock_gettime(MY_CLOCK_ID, &tp);
return (ulonglong)tp.tv_sec * 1000 + (ulonglong)tp.tv_nsec / 1000000;
#elif defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME)
/* ftime() is obsolete but maybe the platform is old */
struct timeb ft;
ftime(&ft);
Expand Down Expand Up @@ -631,7 +651,9 @@ void my_timer_init(MY_TIMER_INFO *mti)

/* milliseconds */
mti->milliseconds.frequency= 1000; /* initial assumption */
#if defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME)
#ifdef MY_CLOCK_ID
mti->milliseconds.routine= MY_TIMER_ROUTINE_CLOCK_GETTIME;
#elif defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME)
mti->milliseconds.routine= MY_TIMER_ROUTINE_FTIME;
#elif defined(_WIN32)
mti->milliseconds.routine= MY_TIMER_ROUTINE_GETSYSTEMTIMEASFILETIME;
Expand Down

0 comments on commit 12087d6

Please sign in to comment.