Per gcc 4.1.2 (on fedora core 8, at least), tv_usec and tv_sec are long 
ints.  Thus, the computation in timeDiff (see below) overflows if the 
computation takes more than around 2147 seconds.  I propose the 
following patch to shell.c.  (Alternatively, a test can be made to see 
if the system support long longs, and continue to use usecs.)

-/* Return the difference of two time_structs in microseconds */
-static int timeDiff(struct timeval *pStart, struct timeval *pEnd){
-  return (pEnd->tv_usec - pStart->tv_usec) +
-         1000000*(pEnd->tv_sec - pStart->tv_sec);
+/* Return the different of two time_structs in seconds */
+static float timeDiff(struct timeval *pStart, struct timeval *pEnd){
+  return (pEnd->tv_usec - pStart->tv_usec) / 1000000.0 +
+         (pEnd->tv_sec - pStart->tv_sec);
}

/*
** Print the timing results.
*/
static void endTimer(void){
   if( enableTimer ){
     struct rusage sEnd;
     getrusage(RUSAGE_SELF, &sEnd);
     printf("CPU Time: user %f sys %f\n",
-       0.000001*timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
-       0.000001*timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));
+       timeDiff(&sBegin.ru_utime, &sEnd.ru_utime),
+       timeDiff(&sBegin.ru_stime, &sEnd.ru_stime));

   }
}


Steve Friedman

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to