/* Profiler implementation.
-Copyright (C) 2012-2015 Free Software Foundation, Inc.
+Copyright (C) 2012-2016 Free Software Foundation, Inc.
This file is part of GNU Emacs.
static struct hash_table_test hashtest_profiler;
static Lisp_Object
-make_log (int heap_size, int max_stack_depth)
+make_log (EMACS_INT heap_size, EMACS_INT max_stack_depth)
{
/* We use a standard Elisp hash-table object, but we use it in
a special way. This is OK as long as the object is not exposed
/* What is special about our hash-tables is that the keys are pre-filled
with the vectors we'll put in them. */
- int i = ASIZE (h->key_and_value) / 2;
+ ptrdiff_t i = ASIZE (h->key_and_value) >> 1;
while (i > 0)
set_hash_key_slot (h, --i,
Fmake_vector (make_number (max_stack_depth), Qnil));
Fremhash (key, tmp);
}
eassert (EQ (log->next_free, make_number (i)));
- {
- int j;
- eassert (VECTORP (key));
- for (j = 0; j < ASIZE (key); j++)
- ASET (key, j, Qnil);
- }
+
+ eassert (VECTORP (key));
+ for (ptrdiff_t j = 0; j < ASIZE (key); j++)
+ ASET (key, j, Qnil);
+
set_hash_key_slot (log, i, key);
}
}
else
{ /* BEWARE! hash_put in general can allocate memory.
But currently it only does that if log->next_free is nil. */
- int j;
eassert (!NILP (log->next_free));
- j = hash_put (log, backtrace, make_number (count), hash);
+ ptrdiff_t j = hash_put (log, backtrace, make_number (count), hash);
/* Let's make sure we've put `backtrace' right where it
already was to start with. */
eassert (index == j);
/* Signal handler for sampling profiler. */
+/* timer_getoverrun is not implemented on Cygwin, but the following
+ seems to be good enough for profiling. */
+#ifdef CYGWIN
+#define timer_getoverrun(x) 0
+#endif
+
static void
handle_profiler_signal (int signal)
{
deliver_process_signal (signal, handle_profiler_signal);
}
-static enum profiler_cpu_running
+static int
setup_cpu_timer (Lisp_Object sampling_interval)
{
struct sigaction action;
? ((EMACS_INT) TYPE_MAXIMUM (time_t) * billion
+ (billion - 1))
: EMACS_INT_MAX)))
- return NOT_RUNNING;
+ return -1;
current_sampling_interval = XINT (sampling_interval);
interval = make_timespec (current_sampling_interval / billion,
profiler_max_stack_depth);
}
- profiler_cpu_running = setup_cpu_timer (sampling_interval);
- if (! profiler_cpu_running)
- error ("Invalid sampling interval");
+ int status = setup_cpu_timer (sampling_interval);
+ if (status == -1)
+ {
+ profiler_cpu_running = NOT_RUNNING;
+ error ("Invalid sampling interval");
+ }
+ else
+ {
+ profiler_cpu_running = status;
+ if (! profiler_cpu_running)
+ error ("Unable to start profiler timer");
+ }
return Qt;
}