Re: gettimeofday problem

Salvatore D'Angelo (dangelo.sasaman@tiscalinet.it)
Mon, 24 Jun 2002 12:20:02 +0200


In this piece of code I convert seconds and microseconds in
milliseconds. I think the problem is not in my code, in fact I wrote the
following piece of code in Java, and it does not work too. In the for
loop the 90% of times b > a while for 10% of times not.

class Prova {
public static void main(....) {
for (;;) {
long a = System.currentTimeMillis();
long b = System.currentTimeMillis();

if (a > b) {
System.out.println("Wrong!!!!!!!!!!!!!");
}
}
}
}

Chris McDonald wrote:

>In linux.kernel you write:
>
>
>
>>Hi,
>>
>>
>
>
>
>>I am writing a small piece of code that use the gettimeofday routine and
>>I have noticed a very strange behaviour. If I call the routine two times
>>in sequence I expect that the second value is greater than or equal to
>>the first one, but it is not true.
>>
>>
>
>Perhaps because tv_usecs are MICROsecs, not MILLIsecs ?
>
>_______________________________________________________________________________
> Dr Chris McDonald EMAIL: chris@csse.uwa.edu.au
> Department of Computer Science & Software Engineering
>The University of Western Australia WWW: http://www.csse.uwa.edu.au/~chris
> Crawley, Western Australia, 6009 PH: +61 8 9380 2533, FAX: +61 8 9380 1089
>
>
>
>
>>please check the following code.
>>
>>
>
>
>
>>Sometimes happen that the string "Strange Behaviour" is printed with
>>kernel 2.4.18.
>>
>>
>
>
>
>>I tried to find in the Linux Archive patches to solve this problem, but
>>I didn't find anything (there are emails that talk about gettimeofday,
>>but probably they do not answer to my questions).
>>
>>
>
>
>
>>The same thing happen in Java using the System.currentTimeMillis() routine.
>>
>>
>
>
>
>>#include <fstream.h>
>>#include <sys/time.h>
>>
>>
>
>
>
>>// this routine calculate the current time returning its value in long
>>long format.
>>long long currentTimeMillis() {
>> long long t;
>> struct timeval tv;
>>
>>
>
>
>
>> gettimeofday(&tv, 0);
>>
>>
>
>
>
>> t = tv.tv_sec;
>> t = (t *1000) + (tv.tv_usec/1000);
>>
>>
>
>
>
>> return t;
>>}
>>
>>
>
>
>
>>void main() {
>> for (;;) {
>> long long a = currentTimeMillis();
>> long long b = currentTimeMillis();
>>
>>
>
>
>
>> if (a>b) {
>> cout << "Strange Behaviour" << endl;
>> }
>> }
>>}
>>
>>
>
>
>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/