mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-24 12:35:05 +02:00
Cleanup
This commit is contained in:
parent
9329068cd8
commit
ef7adf298c
1 changed files with 4 additions and 22 deletions
|
@ -97,20 +97,6 @@ struct gc_thread_data_t {
|
||||||
|
|
||||||
typedef struct gc_free_list_t gc_free_list;
|
typedef struct gc_free_list_t gc_free_list;
|
||||||
struct gc_free_list_t {
|
struct gc_free_list_t {
|
||||||
// somehow this size param is being overwritten by a "mark() =".
|
|
||||||
// how could that happen?
|
|
||||||
//somehow it appears free list pointers are being used where heap objects are
|
|
||||||
//expected. could this be as simple as objects being sweeped that should not
|
|
||||||
//have been? unfortunately it is harder to figure how why the objects were
|
|
||||||
//sweeped. were they not marked properly? is there a race condition? maybe
|
|
||||||
//more than one issue? what is going on?
|
|
||||||
//
|
|
||||||
// the following line does not solve the problem. in fact, with this in
|
|
||||||
// place there are still cases where the tag is a multiple of 32, implying
|
|
||||||
// again that a free list node is being used as a heap object. IE, the
|
|
||||||
// size value is being read into the tag field by code expecting a heap obj.
|
|
||||||
//
|
|
||||||
//unsigned int dummy; // just for testing/evaluation, this line is NOT a fix!!
|
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
gc_free_list *next;
|
gc_free_list *next;
|
||||||
};
|
};
|
||||||
|
@ -121,21 +107,20 @@ struct gc_heap_t {
|
||||||
unsigned int chunk_size; // 0 for any size, other and heap will only alloc chunks of that size
|
unsigned int chunk_size; // 0 for any size, other and heap will only alloc chunks of that size
|
||||||
unsigned int max_size;
|
unsigned int max_size;
|
||||||
//unsigned int free_size;
|
//unsigned int free_size;
|
||||||
gc_free_list *free_list; // TBD
|
gc_free_list *free_list;
|
||||||
gc_heap *next; // TBD, linked list is not very efficient, but easy to work with as a start
|
gc_heap *next; // TBD, linked list is not very efficient, but easy to work with as a start
|
||||||
char *data;
|
char *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct gc_header_type_t gc_header_type;
|
typedef struct gc_header_type_t gc_header_type;
|
||||||
struct gc_header_type_t {
|
struct gc_header_type_t {
|
||||||
unsigned int mark; // mark bits (only need 2)
|
unsigned int mark; // mark bits (TODO: only need 2, reduce size of type?)
|
||||||
unsigned char grayed; // stack object to be grayed when moved to heap
|
unsigned char grayed; // stack object to be grayed when moved to heap
|
||||||
};
|
};
|
||||||
#define mark(x) (((list) x)->hdr.mark)
|
#define mark(x) (((list) x)->hdr.mark)
|
||||||
#define grayed(x) (((list) x)->hdr.grayed)
|
#define grayed(x) (((list) x)->hdr.grayed)
|
||||||
|
|
||||||
/* HEAP definitions */
|
/* HEAP definitions, based off heap from Chibi scheme */
|
||||||
// experimenting with a heap based off of the one in Chibi scheme
|
|
||||||
#define gc_heap_first_block(h) ((object)(h->data + gc_heap_align(gc_free_chunk_size)))
|
#define gc_heap_first_block(h) ((object)(h->data + gc_heap_align(gc_free_chunk_size)))
|
||||||
#define gc_heap_last_block(h) ((object)((char*)h->data + h->size - gc_heap_align(gc_free_chunk_size)))
|
#define gc_heap_last_block(h) ((object)((char*)h->data + h->size - gc_heap_align(gc_free_chunk_size)))
|
||||||
#define gc_heap_end(h) ((object)((char*)h->data + h->size))
|
#define gc_heap_end(h) ((object)((char*)h->data + h->size))
|
||||||
|
@ -265,9 +250,6 @@ typedef struct {gc_header_type hdr; tag_type tag; double value;} double_type;
|
||||||
|
|
||||||
/* Define string type */
|
/* Define string type */
|
||||||
typedef struct {gc_header_type hdr; tag_type tag; int len; char *str;} string_type;
|
typedef struct {gc_header_type hdr; tag_type tag; int len; char *str;} string_type;
|
||||||
//// TODO: new way to allocate strings, but this requires changes to
|
|
||||||
//// all functions that allocate strings, the GC, cgen, and maybe more.
|
|
||||||
//// Because these strings are (at least for now) allocaed on the stack.
|
|
||||||
#define make_string(cs, s) string_type cs; \
|
#define make_string(cs, s) string_type cs; \
|
||||||
{ int len = strlen(s); cs.tag = string_tag; cs.len = len; cs.hdr.mark = gc_color_red; cs.hdr.grayed = 0; \
|
{ int len = strlen(s); cs.tag = string_tag; cs.len = len; cs.hdr.mark = gc_color_red; cs.hdr.grayed = 0; \
|
||||||
cs.str = alloca(sizeof(char) * (len + 1)); \
|
cs.str = alloca(sizeof(char) * (len + 1)); \
|
||||||
|
@ -445,7 +427,7 @@ void gc_mutator_thread_blocked(gc_thread_data *thd, object cont);
|
||||||
void gc_mutator_thread_runnable(gc_thread_data *thd, object result);
|
void gc_mutator_thread_runnable(gc_thread_data *thd, object result);
|
||||||
gc_heap *gc_get_heap();
|
gc_heap *gc_get_heap();
|
||||||
int gc_minor(void *data, object low_limit, object high_limit, closure cont, object *args, int num_args);
|
int gc_minor(void *data, object low_limit, object high_limit, closure cont, object *args, int num_args);
|
||||||
|
/* Mutation table to support minor GC write barrier */
|
||||||
void add_mutation(void *data, object var, object value);
|
void add_mutation(void *data, object var, object value);
|
||||||
void clear_mutations(void *data);
|
void clear_mutations(void *data);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue