[前][次][番号順一覧][スレッド一覧]

ruby-changes:30560

From: akr <ko1@a...>
Date: Wed, 21 Aug 2013 17:34:54 +0900 (JST)
Subject: [ruby-changes:30560] akr:r42639 (trunk): * gc.c (getrusage_time): Fallback clock_gettime to getrusage when

akr	2013-08-21 17:34:48 +0900 (Wed, 21 Aug 2013)

  New Revision: 42639

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=42639

  Log:
    * gc.c (getrusage_time): Fallback clock_gettime to getrusage when
      clock_gettime fails.
      Reported by Eric Saxby.  [ruby-core:56762] [Bug #8805]

  Modified files:
    trunk/ChangeLog
    trunk/gc.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 42638)
+++ ChangeLog	(revision 42639)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Aug 21 17:34:27 2013  Tanaka Akira  <akr@f...>
+
+	* gc.c (getrusage_time): Fallback clock_gettime to getrusage when
+	  clock_gettime fails.
+	  Reported by Eric Saxby.  [ruby-core:56762] [Bug #8805]
+	  
 Wed Aug 21 02:32:32 2013  Koichi Sasada  <ko1@a...>
 
 	* insns.def: fix regexp's once option behavior.
Index: gc.c
===================================================================
--- gc.c	(revision 42638)
+++ gc.c	(revision 42639)
@@ -5059,43 +5059,54 @@ static double https://github.com/ruby/ruby/blob/trunk/gc.c#L5059
 getrusage_time(void)
 {
 #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID)
-    struct timespec ts;
-
-    if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) == 0) {
-        return ts.tv_sec + ts.tv_nsec * 1e-9;
+    {
+        static int try_clock_gettime = 1;
+        struct timespec ts;
+        if (try_clock_gettime && clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) == 0) {
+            return ts.tv_sec + ts.tv_nsec * 1e-9;
+        }
+        else {
+            try_clock_gettime = 0;
+        }
     }
-    return 0.0;
-#elif defined RUSAGE_SELF
-    struct rusage usage;
-    struct timeval time;
-    getrusage(RUSAGE_SELF, &usage);
-    time = usage.ru_utime;
-    return time.tv_sec + time.tv_usec * 1e-6;
-#elif defined _WIN32
-    FILETIME creation_time, exit_time, kernel_time, user_time;
-    ULARGE_INTEGER ui;
-    LONG_LONG q;
-    double t;
+#endif
 
-    if (GetProcessTimes(GetCurrentProcess(),
-			&creation_time, &exit_time, &kernel_time, &user_time) == 0)
+#ifdef RUSAGE_SELF
     {
-	return 0.0;
+        struct rusage usage;
+        struct timeval time;
+        if (getrusage(RUSAGE_SELF, &usage) == 0) {
+            time = usage.ru_utime;
+            return time.tv_sec + time.tv_usec * 1e-6;
+        }
     }
-    memcpy(&ui, &user_time, sizeof(FILETIME));
-    q = ui.QuadPart / 10L;
-    t = (DWORD)(q % 1000000L) * 1e-6;
-    q /= 1000000L;
+#endif
+
+#ifdef _WIN32
+    {
+        FILETIME creation_time, exit_time, kernel_time, user_time;
+        ULARGE_INTEGER ui;
+        LONG_LONG q;
+        double t;
+
+        if (GetProcessTimes(GetCurrentProcess(),
+                            &creation_time, &exit_time, &kernel_time, &user_time) != 0) {
+            memcpy(&ui, &user_time, sizeof(FILETIME));
+            q = ui.QuadPart / 10L;
+            t = (DWORD)(q % 1000000L) * 1e-6;
+            q /= 1000000L;
 #ifdef __GNUC__
-    t += q;
+            t += q;
 #else
-    t += (double)(DWORD)(q >> 16) * (1 << 16);
-    t += (DWORD)q & ~(~0 << 16);
+            t += (double)(DWORD)(q >> 16) * (1 << 16);
+            t += (DWORD)q & ~(~0 << 16);
 #endif
-    return t;
-#else
-    return 0.0;
+            return t;
+        }
+    }
 #endif
+
+    return 0.0;
 }
 
 static inline void

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]