bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#20843: 24.5; Profiler error: "Invalid sampling interval"


From: Ken Brown
Subject: bug#20843: 24.5; Profiler error: "Invalid sampling interval"
Date: Sun, 21 Jun 2015 18:17:27 -0400
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0

On 6/21/2015 10:56 AM, Eli Zaretskii wrote:
Date: Sat, 20 Jun 2015 17:47:21 -0400
From: Ken Brown <address@hidden>
CC: address@hidden, address@hidden

Then I guess the configure-time test for setitimer should also test
for ITIMER_PROF.

I'd be glad to give this a try, but I don't have any experience writing
autoconf macros.  Is there a standard macro to test whether a function
accepts a particular argument?  If not, can you (or anyone) point me to
an example that I can imitate?

Actually, perhaps I misunderstood you: are you saying that Cygwin does
have ITIMER_PROF defined in the appropriate header, but when setitimer
is called with it, it always fails?

Yes.

If so, we cannot test this at
configure time, because it means we will have to run a program, which
is not a good idea.

So in that case, I think we should simply disable the CPU profiler on
Cygwin using "#ifndef __CYGWIN__" or some such.

Done as commit 5fac0de.

  Also, the diagnostics should be improved, as the
wording is misleading in that case.

As it stands, profiler-cpu-start reports "Invalid sampling interval"
whenever setup_cpu_timer fails to start the timer, regardless of the
reason.  I'll try to improve this.

Yes, please.

How's this:

--- a/src/profiler.c
+++ b/src/profiler.c
@@ -250,6 +250,8 @@ deliver_profiler_signal (int signal)
   deliver_process_signal (signal, handle_profiler_signal);
 }

+static bool sampling_interval_ok;
+
 static enum profiler_cpu_running
 setup_cpu_timer (Lisp_Object sampling_interval)
 {
@@ -258,11 +260,13 @@ setup_cpu_timer (Lisp_Object sampling_interval)
   struct timespec interval;
   int billion = 1000000000;

-  if (! RANGED_INTEGERP (1, sampling_interval,
-                        (TYPE_MAXIMUM (time_t) < EMACS_INT_MAX / billion
-                         ? ((EMACS_INT) TYPE_MAXIMUM (time_t) * billion
-                            + (billion - 1))
-                         : EMACS_INT_MAX)))
+  sampling_interval_ok =
+    RANGED_INTEGERP (1, sampling_interval,
+                    (TYPE_MAXIMUM (time_t) < EMACS_INT_MAX / billion
+                     ? ((EMACS_INT) TYPE_MAXIMUM (time_t) * billion
+                        + (billion - 1))
+                     : EMACS_INT_MAX));
+  if (! sampling_interval_ok)
     return NOT_RUNNING;

   current_sampling_interval = XINT (sampling_interval);
@@ -338,7 +342,12 @@ See also `profiler-log-size' and `profiler-max-stack-depth'. */)

   profiler_cpu_running = setup_cpu_timer (sampling_interval);
   if (! profiler_cpu_running)
-    error ("Invalid sampling interval");
+    {
+      if (! sampling_interval_ok)
+       error ("Invalid sampling interval");
+      else
+       error ("Unable to start profiler timer");
+    }

   return Qt;
 }

Ken





reply via email to

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