even be useful to provide a way to turn on only one profiling
mechanism, but I haven't done so yet. --hniksic */
-static struct hash_table *big_profile_table;
+struct hash_table *big_profile_table;
Lisp_Object Vcall_count_profile_table;
int default_profiling_interval;
and is not set the whole time we're in redisplay. */
int profiling_redisplay_flag;
-static Lisp_Object QSin_redisplay;
-static Lisp_Object QSin_garbage_collection;
-static Lisp_Object QSprocessing_events_at_top_level;
-static Lisp_Object QSunknown;
+Lisp_Object QSin_redisplay;
+Lisp_Object QSin_garbage_collection;
+Lisp_Object QSprocessing_events_at_top_level;
+Lisp_Object QSunknown;
/* We use inside_profiling to prevent the handler from writing to
the table while another routine is operating on it. We also set
{
fun = *backtrace_list->function;
- if (!SYMBOLP (fun) &&
- !COMPILED_FUNCTIONP (fun) &&
- !SUBRP (fun))
+ if (!GC_SYMBOLP (fun) &&
+ !GC_COMPILED_FUNCTIONP (fun) &&
+ !GC_SUBRP (fun))
fun = QSunknown;
}
else
return closure.accum;
}
+struct mark_profiling_info_closure
+{
+ void (*markfun) (Lisp_Object);
+};
+
static int
mark_profiling_info_maphash (CONST void *void_key,
void *void_val,
Lisp_Object key;
CVOID_TO_LISP (key, void_key);
- mark_object (key);
+ (((struct mark_profiling_info_closure *) void_closure)->markfun) (key);
return 0;
}
void
-mark_profiling_info (void)
+mark_profiling_info (void (*markfun) (Lisp_Object))
{
- /* This function does not GC */
+ /* This function does not GC (if markfun doesn't) */
+ struct mark_profiling_info_closure closure;
+
+ closure.markfun = markfun;
if (big_profile_table)
{
inside_profiling = 1;
- maphash (mark_profiling_info_maphash, big_profile_table, 0);
+ maphash (mark_profiling_info_maphash, big_profile_table, &closure);
inside_profiling = 0;
}
}