]> granicus.if.org Git - python/commitdiff
SF patch #969180, hotshot incorrectly computes elapsed time by Jason
authorNeal Norwitz <nnorwitz@gmail.com>
Sun, 13 Jun 2004 20:45:11 +0000 (20:45 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Sun, 13 Jun 2004 20:45:11 +0000 (20:45 +0000)
Beardsley.

If the seconds are different, we still need to calculate the differences
between milliseconds.

Also, on a Gentoo Linux (2.6.5) dual Athlon MP box with glibc 2.3,
time can go backwards.  This probably happens when the process switches
the CPU it's running on.  Time can also go backwards when running NTP.
If we detect a negative time delta (ie, time went backwards), return
a delta of 0.  This prevents an illegal array access elsewhere.
I think it's safest to *not* update prev_timeofday in this case, so we
return without updating.

Backport candidate.

Modules/_hotshot.c

index a04494fb54d7138171ace43cad085105e521113f..0683be6c32dfceee826ab2aa31166992f68438b1 100644 (file)
@@ -820,12 +820,14 @@ get_tdelta(ProfilerObject *self)
 
     GETTIMEOFDAY(&tv);
 
-    if (tv.tv_sec == self->prev_timeofday.tv_sec)
-        tdelta = tv.tv_usec - self->prev_timeofday.tv_usec;
-    else
-        tdelta = ((tv.tv_sec - self->prev_timeofday.tv_sec) * 1000000
-                  + tv.tv_usec);
+    tdelta = tv.tv_usec - self->prev_timeofday.tv_usec;
+    if (tv.tv_sec != self->prev_timeofday.tv_sec)
+        tdelta += (tv.tv_sec - self->prev_timeofday.tv_sec) * 1000000;
 #endif
+    /* time can go backwards on some multiprocessor systems or by NTP */
+    if (tdelta < 0)
+        return 0;
+
     self->prev_timeofday = tv;
     return tdelta;
 }