Hi all,
The following code will exit (in a few seconds usually) - which I would
expect it not too. Since gettimeofday is called before time(). Obviously
this is compiled without optimization.
I traced this through to the different syscall's implementations of
time() and gettimeofday() in the kernel.
They both use the same timer (xtime) but gettimeofday() calls
getnstimeofday() which calls timespec_add_ns(), which can modify the
seconds portion of timespec struct. I dont understand why
getnstimeofday() uses a loop and then adds on nanoseconds to the result?
Any insight greatly appreciated :-)
Adrian Cornish
static __always_inline void timespec_add_ns(struct timespec *a, u64 ns)
{
a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns);
a->tv_nsec = ns;
}
void do_gettimeofday(struct timeval *tv)
{
struct timespec now;
getnstimeofday(&now);
tv->tv_sec = now.tv_sec;
tv->tv_usec = now.tv_nsec/1000;
}
void getnstimeofday(struct timespec *ts)
{
unsigned long seq;
s64 nsecs;
WARN_ON(timekeeping_suspended);
do {
seq = read_seqbegin(&xtime_lock);
*ts = xtime;
nsecs = timekeeping_get_ns();
/* If arch requires, add in gettimeoffset() */
nsecs += arch_gettimeoffset();
} while (read_seqretry(&xtime_lock, seq));
timespec_add_ns(ts, nsecs);
}
My example code
#include <iostream>
#include <sys/time.h>
#include <time.h>
int main(void)
{
time_t t;
timeval tv;
size_t difference=0;
for(;;)
{
gettimeofday(&tv, 0);
t=time(0);
if(t<tv.tv_sec)
{
std::cout << "Different " << ++difference << " times t=" << t
<< " tv.tv_sec=" << tv.tv_sec << std::endl;
break;
}
}
return 0;
}
--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [email protected]
Please read the FAQ at http://kernelnewbies.org/FAQ