factor/vm/gc.hpp

68 lines
1.3 KiB
C++
Raw Normal View History

2009-05-04 02:46:13 -04:00
namespace factor
{
2009-05-02 05:04:19 -04:00
/* statistics */
2009-10-07 09:40:28 -04:00
struct generation_statistics {
2009-05-04 05:50:24 -04:00
cell collections;
2009-05-02 05:04:19 -04:00
u64 gc_time;
u64 max_gc_time;
2009-05-04 05:50:24 -04:00
cell object_count;
2009-05-02 05:04:19 -04:00
u64 bytes_copied;
2009-05-02 11:17:05 -04:00
};
2009-05-02 05:04:19 -04:00
2009-10-07 09:40:28 -04:00
struct gc_statistics {
generation_statistics generations[gen_count];
2009-10-07 09:33:54 -04:00
u64 cards_scanned;
u64 decks_scanned;
u64 card_scan_time;
2009-10-09 00:39:54 -04:00
u64 code_blocks_scanned;
2009-10-07 09:33:54 -04:00
};
struct gc_state {
/* The data heap we're collecting */
data_heap *data;
/* sometimes we grow the heap */
bool growing_data_heap;
/* Which generation is being collected */
cell collecting_gen;
/* If true, we are collecting aging space for the second time, so if it is still
full, we go on to collect tenured */
bool collecting_aging_again;
/* GC start time, for benchmarking */
u64 start_time;
jmp_buf gc_unwind;
explicit gc_state(data_heap *data_, bool growing_data_heap_, cell collecting_gen_);
~gc_state();
inline bool collecting_nursery_p()
{
2009-10-07 09:33:54 -04:00
return collecting_gen == nursery_gen;
}
2009-10-05 23:16:08 -04:00
inline bool collecting_aging_p()
{
2009-10-07 09:33:54 -04:00
return collecting_gen == aging_gen;
2009-10-05 23:16:08 -04:00
}
inline bool collecting_tenured_p()
{
2009-10-07 09:33:54 -04:00
return collecting_gen == tenured_gen;
}
inline bool collecting_accumulation_gen_p()
{
return ((collecting_aging_p() && !collecting_aging_again)
|| collecting_tenured_p());
}
};
2009-09-25 13:29:07 -04:00
VM_C_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factor_vm *myvm);
2009-05-04 02:46:13 -04:00
}