X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fprofile.c;h=6fa506b88f9bd048bc19a79ccefa43a82cc9bbf3;hb=280624d95d3fd2fdee5e852a92cdb7457736cba8;hp=648026f01053a6e457bc91c1fb825ff91989d7e5;hpb=ea1ea793fe6e244ef5555ed983423a204101af13;p=chise%2Fxemacs-chise.git- diff --git a/src/profile.c b/src/profile.c index 648026f..6fa506b 100644 --- a/src/profile.c +++ b/src/profile.c @@ -57,7 +57,7 @@ Boston, MA 02111-1307, USA. */ 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; @@ -68,10 +68,10 @@ int profiling_active; 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 @@ -119,9 +119,9 @@ sigprof_handler (int signo) { 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 @@ -262,6 +262,11 @@ Return the profiling info as an alist. 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, @@ -270,18 +275,21 @@ mark_profiling_info_maphash (CONST void *void_key, 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; } }