factor/vm/profiler.c

52 lines
1.0 KiB
C
Raw Normal View History

#include "master.h"
2008-01-02 19:36:36 -05:00
/* Allocates memory */
F_CODE_BLOCK *compile_profiling_stub(CELL word)
{
2009-04-28 01:53:32 -04:00
REGISTER_ROOT(word);
F_JIT jit;
jit_init(&jit,WORD_TYPE,word);
jit_emit_with(&jit,userenv[JIT_PROFILING],word);
F_CODE_BLOCK *block = jit_make_code_block(&jit);
jit_dispose(&jit);
UNREGISTER_ROOT(word);
return block;
}
/* Allocates memory */
static void set_profiling(bool profiling)
{
2008-01-02 19:36:36 -05:00
if(profiling == profiling_p)
return;
2008-01-02 19:36:36 -05:00
profiling_p = profiling;
/* Push everything to tenured space so that we can heap scan
and allocate profiling blocks if necessary */
gc();
2008-04-05 09:27:07 -04:00
CELL words = find_all_words();
2008-04-05 09:27:07 -04:00
REGISTER_ROOT(words);
CELL i;
CELL length = array_capacity(untag_object(words));
for(i = 0; i < length; i++)
{
2008-04-05 09:27:07 -04:00
F_WORD *word = untag_word(array_nth(untag_array(words),i));
2008-07-05 23:19:16 -04:00
if(profiling)
word->counter = tag_fixnum(0);
2008-04-05 09:27:07 -04:00
update_word_xt(word);
}
2008-04-05 09:27:07 -04:00
UNREGISTER_ROOT(words);
/* Update XTs in code heap */
iterate_code_heap(relocate_code_block);
}
void primitive_profiling(void)
{
set_profiling(to_boolean(dpop()));
}