Added large object support for collecting large vectors
This commit is contained in:
parent
28b143036f
commit
46755415b4
BIN
bin/ikarus
BIN
bin/ikarus
Binary file not shown.
|
@ -57,7 +57,7 @@ static int extension_amount[meta_count] = {
|
||||||
1 * pagesize,
|
1 * pagesize,
|
||||||
1 * pagesize,
|
1 * pagesize,
|
||||||
1 * pagesize,
|
1 * pagesize,
|
||||||
1 * pagesize
|
1 * pagesize,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned int meta_mt[meta_count] = {
|
static unsigned int meta_mt[meta_count] = {
|
||||||
|
@ -149,6 +149,43 @@ gc_alloc_new_ptr(int size, int old_gen, gc_t* gc){
|
||||||
return meta_alloc(size, old_gen, gc, meta_ptrs);
|
return meta_alloc(size, old_gen, gc, meta_ptrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline ikp
|
||||||
|
gc_alloc_new_large_ptr(int size, int old_gen, gc_t* gc){
|
||||||
|
int memreq = align_to_next_page(size);
|
||||||
|
ikp mem =
|
||||||
|
ik_mmap_typed(memreq,
|
||||||
|
pointers_mt | large_object_tag | next_gen_tag[old_gen],
|
||||||
|
gc->pcb);
|
||||||
|
gc->segment_vector = gc->pcb->segment_vector;
|
||||||
|
qupages_t* p = ik_malloc(sizeof(qupages_t));
|
||||||
|
p->p = mem;
|
||||||
|
p->q = mem+size;
|
||||||
|
bzero(mem+size, memreq-size);
|
||||||
|
p->next = gc->queues[meta_ptrs];
|
||||||
|
gc->queues[meta_ptrs] = p;
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
enqueue_large_ptr(ikp mem, int size, int old_gen, gc_t* gc){
|
||||||
|
int i = page_index(mem);
|
||||||
|
int j = page_index(mem+size-1);
|
||||||
|
while(i<=j){
|
||||||
|
gc->segment_vector[i] =
|
||||||
|
pointers_mt | large_object_tag | next_gen_tag[old_gen];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
qupages_t* p = ik_malloc(sizeof(qupages_t));
|
||||||
|
p->p = mem;
|
||||||
|
p->q = mem+size;
|
||||||
|
p->next = gc->queues[meta_ptrs];
|
||||||
|
gc->queues[meta_ptrs] = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static inline ikp
|
static inline ikp
|
||||||
gc_alloc_new_symbol(int old_gen, gc_t* gc){
|
gc_alloc_new_symbol(int old_gen, gc_t* gc){
|
||||||
|
@ -221,6 +258,9 @@ gc_alloc_new_code(int size, int old_gen, gc_t* gc){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gc_tconc_push_extending(gc_t* gc, ikp tcbucket){
|
gc_tconc_push_extending(gc_t* gc, ikp tcbucket){
|
||||||
if(gc->tconc_base){
|
if(gc->tconc_base){
|
||||||
|
@ -989,16 +1029,32 @@ add_object_proc(gc_t* gc, ikp x)
|
||||||
int size = (int)fst;
|
int size = (int)fst;
|
||||||
assert(size >= 0);
|
assert(size >= 0);
|
||||||
int memreq = align(size + disp_vector_data);
|
int memreq = align(size + disp_vector_data);
|
||||||
ikp y = gc_alloc_new_ptr(memreq, gen, gc) + vector_tag;
|
if(memreq >= pagesize){
|
||||||
ref(y, disp_vector_length-vector_tag) = fst;
|
if((t & large_object_mask) == large_object_tag){
|
||||||
ref(y, memreq-vector_tag-wordsize) = 0;
|
enqueue_large_ptr(x-vector_tag, size+disp_vector_data, gen, gc);
|
||||||
memcpy(y+off_vector_data, x+off_vector_data, size);
|
return x;
|
||||||
ref(x,-vector_tag) = forward_ptr;
|
} else {
|
||||||
ref(x,wordsize-vector_tag) = y;
|
ikp y = gc_alloc_new_large_ptr(size+disp_vector_data, gen, gc) +
|
||||||
|
vector_tag;
|
||||||
|
ref(y, disp_vector_length-vector_tag) = fst;
|
||||||
|
ref(y, memreq-vector_tag-wordsize) = 0;
|
||||||
|
memcpy(y+off_vector_data, x+off_vector_data, size);
|
||||||
|
ref(x,-vector_tag) = forward_ptr;
|
||||||
|
ref(x,wordsize-vector_tag) = y;
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ikp y = gc_alloc_new_ptr(memreq, gen, gc) + vector_tag;
|
||||||
|
ref(y, disp_vector_length-vector_tag) = fst;
|
||||||
|
ref(y, memreq-vector_tag-wordsize) = 0;
|
||||||
|
memcpy(y+off_vector_data, x+off_vector_data, size);
|
||||||
|
ref(x,-vector_tag) = forward_ptr;
|
||||||
|
ref(x,wordsize-vector_tag) = y;
|
||||||
|
return y;
|
||||||
|
}
|
||||||
#if accounting
|
#if accounting
|
||||||
vector_count++;
|
vector_count++;
|
||||||
#endif
|
#endif
|
||||||
return y;
|
|
||||||
}
|
}
|
||||||
else if(fst == symbol_record_tag){
|
else if(fst == symbol_record_tag){
|
||||||
ikp y = gc_alloc_new_symbol_record(gen, gc) + record_tag;
|
ikp y = gc_alloc_new_symbol_record(gen, gc) + record_tag;
|
||||||
|
|
21
bin/ikarus.h
21
bin/ikarus.h
|
@ -14,21 +14,22 @@ extern int hash_table_count;
|
||||||
|
|
||||||
#define most_bytes_in_minor 0x10000000
|
#define most_bytes_in_minor 0x10000000
|
||||||
|
|
||||||
#define old_gen_mask 0x00000007
|
#define old_gen_mask 0x00000007
|
||||||
#define new_gen_mask 0x00000008
|
#define new_gen_mask 0x00000008
|
||||||
#define gen_mask 0x0000000F
|
#define gen_mask 0x0000000F
|
||||||
#define new_gen_tag 0x00000008
|
#define new_gen_tag 0x00000008
|
||||||
#define meta_dirty_mask 0x000000F0
|
#define meta_dirty_mask 0x000000F0
|
||||||
#define type_mask 0x00000F00
|
#define type_mask 0x00000F00
|
||||||
#define scannable_mask 0x0000F000
|
#define scannable_mask 0x0000F000
|
||||||
#define dealloc_mask 0x000F0000
|
#define dealloc_mask 0x000F0000
|
||||||
|
#define large_object_mask 0x00100000
|
||||||
#define meta_dirty_shift 4
|
#define meta_dirty_shift 4
|
||||||
|
|
||||||
#define hole_type 0x00000000
|
#define hole_type 0x00000000
|
||||||
#define mainheap_type 0x00000100
|
#define mainheap_type 0x00000100
|
||||||
#define mainstack_type 0x00000200
|
#define mainstack_type 0x00000200
|
||||||
#define pointers_type 0x00000300
|
#define pointers_type 0x00000300
|
||||||
#define dat_type 0x00000400
|
#define dat_type 0x00000400
|
||||||
#define code_type 0x00000500
|
#define code_type 0x00000500
|
||||||
#define weak_pairs_type 0x00000600
|
#define weak_pairs_type 0x00000600
|
||||||
#define symbols_type 0x00000700
|
#define symbols_type 0x00000700
|
||||||
|
@ -39,6 +40,8 @@ extern int hash_table_count;
|
||||||
#define dealloc_tag 0x00010000
|
#define dealloc_tag 0x00010000
|
||||||
#define retain_tag 0x00000000
|
#define retain_tag 0x00000000
|
||||||
|
|
||||||
|
#define large_object_tag 0x00100000
|
||||||
|
|
||||||
#define hole_mt (hole_type | unscannable_tag | retain_tag)
|
#define hole_mt (hole_type | unscannable_tag | retain_tag)
|
||||||
#define mainheap_mt (mainheap_type | unscannable_tag | retain_tag)
|
#define mainheap_mt (mainheap_type | unscannable_tag | retain_tag)
|
||||||
#define mainstack_mt (mainstack_type | unscannable_tag | retain_tag)
|
#define mainstack_mt (mainstack_type | unscannable_tag | retain_tag)
|
||||||
|
|
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
Loading…
Reference in New Issue