diff options
author | rodri <rgl@antares-labs.eu> | 2024-12-07 17:19:48 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2024-12-07 17:19:48 +0000 |
commit | 2d161e298d7e0605fac08e574f2a03fbd49e58e0 (patch) | |
tree | 153cf203d25a35a25924b81e909e34e99574e412 /nanosec.c | |
parent | 37d05fdf63f641e657387d97a6044b02c02dbbf4 (diff) | |
download | rcfitness-2d161e298d7e0605fac08e574f2a03fbd49e58e0.tar.gz rcfitness-2d161e298d7e0605fac08e574f2a03fbd49e58e0.tar.bz2 rcfitness-2d161e298d7e0605fac08e574f2a03fbd49e58e0.zip |
new tool: chrono (wip)
Diffstat (limited to 'nanosec.c')
-rw-r--r-- | nanosec.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/nanosec.c b/nanosec.c new file mode 100644 index 0000000..1301e9f --- /dev/null +++ b/nanosec.c @@ -0,0 +1,38 @@ +#include <u.h> +#include <libc.h> +#include <tos.h> + +/* + * nsec() is wallclock and can be adjusted by timesync + * so need to use cycles() instead, but fall back to + * nsec() in case we can't + */ +uvlong +nanosec(void) +{ + static uvlong fasthz, xstart; + uvlong x, div; + + if(fasthz == ~0ULL) + return nsec() - xstart; + + if(fasthz == 0){ + if(_tos->cyclefreq){ + cycles(&xstart); + fasthz = _tos->cyclefreq; + } else { + xstart = nsec(); + fasthz = ~0ULL; + fprint(2, "cyclefreq not available, falling back to nsec()\n"); + fprint(2, "you might want to disable aux/timesync\n"); + return 0; + } + } + cycles(&x); + x -= xstart; + + /* this is ugly */ + for(div = 1000000000ULL; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL); + + return x / (fasthz / div); +} |