]> gitweb.factorcode.org Git - factor.git/blob - vm/code_heap.hpp
vm: code_block_for_address method -> code_heap
[factor.git] / vm / code_heap.hpp
1 namespace factor
2 {
3
4 #if defined(WINDOWS) && defined(FACTOR_64)
5         const cell seh_area_size = 1024;
6 #else
7         const cell seh_area_size = 0;
8 #endif
9
10 struct code_heap {
11         /* The actual memory area */
12         segment *seg;
13
14         /* Memory area reserved for safepoint guard page */
15         void *safepoint_page;
16
17         /* Memory area reserved for SEH. Only used on Windows */
18         char *seh_area;
19
20         /* Memory allocator */
21         free_list_allocator<code_block> *allocator;
22
23         /* Keys are blocks which need to be initialized by initialize_code_block().
24         Values are literal tables. Literal table arrays are GC roots until the
25         time the block is initialized, after which point they are discarded. */
26         std::map<code_block *, cell> uninitialized_blocks;
27
28         /* Code blocks which may reference objects in the nursery */
29         std::set<code_block *> points_to_nursery;
30
31         /* Code blocks which may reference objects in aging space or the nursery */
32         std::set<code_block *> points_to_aging;
33
34         explicit code_heap(cell size);
35         ~code_heap();
36         void write_barrier(code_block *compiled);
37         void clear_remembered_set();
38         bool uninitialized_p(code_block *compiled);
39         bool marked_p(code_block *compiled);
40         void set_marked_p(code_block *compiled);
41         void clear_mark_bits();
42         void free(code_block *compiled);
43         void flush_icache();
44         void guard_safepoint();
45         void unguard_safepoint();
46
47         code_block *code_block_for_address(cell address);
48
49         bool safepoint_p(cell addr)
50         {
51                 cell page_mask = ~(getpagesize() - 1);
52                 return (addr & page_mask) == (cell)safepoint_page;
53         }
54 };
55
56 struct code_heap_room {
57         cell size;
58         cell occupied_space;
59         cell total_free;
60         cell contiguous_free;
61         cell free_block_count;
62 };
63
64 }