emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Optimized gcc 4.3.0 build on Windows returns 0 secs for all time val


From: Juanma Barranquero
Subject: Re: Optimized gcc 4.3.0 build on Windows returns 0 secs for all time values of system-process-attributes
Date: Thu, 1 Jan 2009 05:38:36 +0100

On Wed, Dec 31, 2008 at 20:12, Eli Zaretskii <address@hidden> wrote:

> It works for me with GCC 3.4.2 and MinGW 3.14:

Optimized or unoptimized build?

> Could you please step into process_times and ltime (or add printf's if
> stepping doesn't work), and see what is going wrong and where?

Stepping isn't much helpful because most variables are optimized away.

As for printf, I'm not sure what's wrong, but

    long double x = 3.5;
    printf ("f = %Lf\n", x);
    printf ("g = %Lg\n", x);

  =>

f = 
-26815615859885194000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000.000000
g = -2.68156e+154

(Not just with gcc 4.3.0, I get the same result with 3.4.5.)

Am I missing something obvious?

I tried rewriting w32.c:process_time to do time computations by using
ULARGE_INTEGER (see attached patch), as the Platform SDK recommends,
and it works fine. Why it is implemented with long doubles?

    Juanma


Index: src/w32.c
===================================================================
RCS file: /sources/emacs/emacs/src/w32.c,v
retrieving revision 1.157
diff -u -2 -r1.157 w32.c
--- src/w32.c   19 Dec 2008 19:50:39 -0000      1.157
+++ src/w32.c   31 Dec 2008 17:04:23 -0000
@@ -3778,7 +3778,7 @@
 {
   FILETIME ft_creation, ft_exit, ft_kernel, ft_user, ft_current;
-  long ctime_sec, ctime_usec, stime_sec, stime_usec, utime_sec, utime_usec;
-  long etime_sec, etime_usec;
-  long double tem1, tem2, tem;
+  DWORD ctime_sec, ctime_usec, stime_sec, stime_usec, utime_sec, utime_usec;
+  DWORD etime_sec, etime_usec;
+  ULARGE_INTEGER tem1, tem2, tem, utc;

   if (!h_proc
@@ -3788,31 +3788,43 @@
     return 0;

+  utc.LowPart = utc_base_ft.dwLowDateTime;
+  utc.HighPart = utc_base_ft.dwHighDateTime;
+
   GetSystemTimeAsFileTime (&ft_current);

-  tem1 = convert_time_raw (ft_kernel) * 0.1L;
-  stime_usec = fmodl (tem1, 1000000.0L);
-  stime_sec = tem1 * 0.000001L;
+  tem1.LowPart = ft_kernel.dwLowDateTime;
+  tem1.HighPart = ft_kernel.dwHighDateTime;
+  tem1.QuadPart /= 10L;
+  stime_usec = tem1.QuadPart % 1000000L;
+  stime_sec = tem1.QuadPart / 1000000L;
   *stime = ltime (stime_sec, stime_usec);
-  tem2 = convert_time_raw (ft_user) * 0.1L;
-  utime_usec = fmodl (tem2, 1000000.0L);
-  utime_sec = tem2 * 0.000001L;
+  tem2.LowPart = ft_user.dwLowDateTime;
+  tem2.HighPart = ft_user.dwHighDateTime;
+  tem2.QuadPart /= 10L;
+  utime_usec = tem2.QuadPart % 1000000L;
+  utime_sec = tem2.QuadPart / 1000000L;
   *utime = ltime (utime_sec, utime_usec);
-  tem = convert_time_raw (ft_creation);
+  tem.LowPart = ft_creation.dwLowDateTime;
+  tem.HighPart = ft_creation.dwHighDateTime;
   /* Process no 4 (System) returns zero creation time.  */
-  if (tem)
-    tem = (tem - utc_base) * 0.1;
-  ctime_usec = fmodl (tem, 1000000.0L);
-  ctime_sec = tem * 0.000001L;
+  if (tem.QuadPart)
+    tem.QuadPart = (tem.QuadPart - utc.QuadPart) / 10L;
+  ctime_usec = tem.QuadPart % 1000000L;
+  ctime_sec = tem.QuadPart / 1000000L;
   *ctime = ltime (ctime_sec, ctime_usec);
-  if (tem)
-    tem = (convert_time_raw (ft_current) - utc_base) * 0.1L - tem;
-  etime_usec = fmodl (tem, 1000000.0L);
-  etime_sec = tem * 0.000001L;
+  if (tem.QuadPart)
+    {
+      ULARGE_INTEGER current;
+      current.LowPart = ft_current.dwLowDateTime;
+      current.HighPart = ft_current.dwHighDateTime;
+      tem.QuadPart = (current.QuadPart - utc.QuadPart) / 10L - tem.QuadPart;
+    }
+  etime_usec = tem.QuadPart % 1000000L;
+  etime_sec = tem.QuadPart / 1000000L;
   *etime = ltime (etime_sec, etime_usec);
-
-  if (tem)
+  if (tem.QuadPart)
     {
-      *pcpu = 100.0 * (tem1 + tem2) / tem;
-      if (*pcpu > 100)
+      *pcpu = (100.0 * (tem1.QuadPart + tem2.QuadPart)) / tem.QuadPart;
+      if (*pcpu > 100.0)
        *pcpu = 100.0;
     }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]