mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-23 20:15:05 +02:00
Separate cooperation/longjmp from core minor GC
This commit is contained in:
parent
9fd4929bb0
commit
f0b992335e
2 changed files with 60 additions and 55 deletions
|
@ -164,56 +164,6 @@ typedef enum { STAGE_CLEAR_OR_MARKING
|
||||||
#define gc_color_red 0 // Memory not to be GC'd, such as on the stack
|
#define gc_color_red 0 // Memory not to be GC'd, such as on the stack
|
||||||
#define gc_color_blue 2 // Unallocated memory
|
#define gc_color_blue 2 // Unallocated memory
|
||||||
|
|
||||||
/* Utility functions */
|
|
||||||
void **vpbuffer_realloc(void **buf, int *len);
|
|
||||||
void **vpbuffer_add(void **buf, int *len, int i, void *obj);
|
|
||||||
void vpbuffer_free(void **buf);
|
|
||||||
|
|
||||||
/* GC prototypes */
|
|
||||||
void gc_initialize();
|
|
||||||
void gc_add_mutator(gc_thread_data *thd);
|
|
||||||
void gc_remove_mutator(gc_thread_data *thd);
|
|
||||||
gc_heap *gc_heap_create(size_t size, size_t max_size, size_t chunk_size);
|
|
||||||
int gc_grow_heap(gc_heap *h, size_t size, size_t chunk_size);
|
|
||||||
char *gc_copy_obj(object hp, char *obj, gc_thread_data *thd);
|
|
||||||
void *gc_try_alloc(gc_heap *h, size_t size, char *obj, gc_thread_data *thd);
|
|
||||||
void *gc_alloc(gc_heap *h, size_t size, char *obj, gc_thread_data *thd, int *heap_grown);
|
|
||||||
size_t gc_allocated_bytes(object obj, gc_free_list *q, gc_free_list *r);
|
|
||||||
gc_heap *gc_heap_last(gc_heap *h);
|
|
||||||
size_t gc_heap_total_size(gc_heap *h);
|
|
||||||
//size_t gc_heap_total_free_size(gc_heap *h);
|
|
||||||
//size_t gc_collect(gc_heap *h, size_t *sum_freed);
|
|
||||||
//void gc_mark(gc_heap *h, object obj);
|
|
||||||
void gc_mark_globals(void);
|
|
||||||
size_t gc_sweep(gc_heap *h, size_t *sum_freed_ptr);
|
|
||||||
void gc_thr_grow_move_buffer(gc_thread_data *d);
|
|
||||||
void gc_thr_add_to_move_buffer(gc_thread_data *d, int *alloci, object obj);
|
|
||||||
void gc_thread_data_init(gc_thread_data *thd, int mut_num, char *stack_base, long stack_size);
|
|
||||||
void gc_thread_data_free(gc_thread_data *thd);
|
|
||||||
// Prototypes for mutator/collector:
|
|
||||||
int gc_is_stack_obj(gc_thread_data *thd, object obj);
|
|
||||||
void gc_mut_update(gc_thread_data *thd, object old_obj, object value);
|
|
||||||
void gc_mut_cooperate(gc_thread_data *thd, int buf_len);
|
|
||||||
void gc_mark_gray(gc_thread_data *thd, object obj);
|
|
||||||
void gc_mark_gray2(gc_thread_data *thd, object obj);
|
|
||||||
void gc_collector_trace();
|
|
||||||
void gc_mark_black(object obj);
|
|
||||||
void gc_collector_mark_gray(object parent, object obj);
|
|
||||||
void gc_empty_collector_stack();
|
|
||||||
void gc_handshake(gc_status_type s);
|
|
||||||
void gc_post_handshake(gc_status_type s);
|
|
||||||
void gc_wait_handshake();
|
|
||||||
void gc_start_collector();
|
|
||||||
void gc_set_thread_state_blocked(gc_thread_data *thd);
|
|
||||||
void gc_set_thread_state_runnable(gc_thread_data *thd);
|
|
||||||
gc_heap *gc_get_heap();
|
|
||||||
|
|
||||||
/////////////////////////////////////////////
|
|
||||||
// GC Collection cycle
|
|
||||||
|
|
||||||
// TODO:
|
|
||||||
//void gc_collector()
|
|
||||||
|
|
||||||
/* Show diagnostic information for the GC when program terminates */
|
/* Show diagnostic information for the GC when program terminates */
|
||||||
#define DEBUG_SHOW_DIAG 0
|
#define DEBUG_SHOW_DIAG 0
|
||||||
|
|
||||||
|
@ -451,6 +401,51 @@ typedef union {
|
||||||
double_type double_t;
|
double_type double_t;
|
||||||
} common_type;
|
} common_type;
|
||||||
|
|
||||||
|
/* Utility functions */
|
||||||
|
void **vpbuffer_realloc(void **buf, int *len);
|
||||||
|
void **vpbuffer_add(void **buf, int *len, int i, void *obj);
|
||||||
|
void vpbuffer_free(void **buf);
|
||||||
|
|
||||||
|
/* GC prototypes */
|
||||||
|
void gc_initialize();
|
||||||
|
void gc_add_mutator(gc_thread_data *thd);
|
||||||
|
void gc_remove_mutator(gc_thread_data *thd);
|
||||||
|
gc_heap *gc_heap_create(size_t size, size_t max_size, size_t chunk_size);
|
||||||
|
int gc_grow_heap(gc_heap *h, size_t size, size_t chunk_size);
|
||||||
|
char *gc_copy_obj(object hp, char *obj, gc_thread_data *thd);
|
||||||
|
void *gc_try_alloc(gc_heap *h, size_t size, char *obj, gc_thread_data *thd);
|
||||||
|
void *gc_alloc(gc_heap *h, size_t size, char *obj, gc_thread_data *thd, int *heap_grown);
|
||||||
|
size_t gc_allocated_bytes(object obj, gc_free_list *q, gc_free_list *r);
|
||||||
|
gc_heap *gc_heap_last(gc_heap *h);
|
||||||
|
size_t gc_heap_total_size(gc_heap *h);
|
||||||
|
//size_t gc_heap_total_free_size(gc_heap *h);
|
||||||
|
//size_t gc_collect(gc_heap *h, size_t *sum_freed);
|
||||||
|
//void gc_mark(gc_heap *h, object obj);
|
||||||
|
void gc_mark_globals(void);
|
||||||
|
size_t gc_sweep(gc_heap *h, size_t *sum_freed_ptr);
|
||||||
|
void gc_thr_grow_move_buffer(gc_thread_data *d);
|
||||||
|
void gc_thr_add_to_move_buffer(gc_thread_data *d, int *alloci, object obj);
|
||||||
|
void gc_thread_data_init(gc_thread_data *thd, int mut_num, char *stack_base, long stack_size);
|
||||||
|
void gc_thread_data_free(gc_thread_data *thd);
|
||||||
|
// Prototypes for mutator/collector:
|
||||||
|
int gc_is_stack_obj(gc_thread_data *thd, object obj);
|
||||||
|
void gc_mut_update(gc_thread_data *thd, object old_obj, object value);
|
||||||
|
void gc_mut_cooperate(gc_thread_data *thd, int buf_len);
|
||||||
|
void gc_mark_gray(gc_thread_data *thd, object obj);
|
||||||
|
void gc_mark_gray2(gc_thread_data *thd, object obj);
|
||||||
|
void gc_collector_trace();
|
||||||
|
void gc_mark_black(object obj);
|
||||||
|
void gc_collector_mark_gray(object parent, object obj);
|
||||||
|
void gc_empty_collector_stack();
|
||||||
|
void gc_handshake(gc_status_type s);
|
||||||
|
void gc_post_handshake(gc_status_type s);
|
||||||
|
void gc_wait_handshake();
|
||||||
|
void gc_start_collector();
|
||||||
|
void gc_set_thread_state_blocked(gc_thread_data *thd);
|
||||||
|
void gc_set_thread_state_runnable(gc_thread_data *thd);
|
||||||
|
gc_heap *gc_get_heap();
|
||||||
|
int gc_minor(void *data, object low_limit, object high_limit, closure cont, object *args, int num_args);
|
||||||
|
|
||||||
// Atomics section
|
// Atomics section
|
||||||
// TODO: this is all compiler dependent, need to use different macros depending
|
// TODO: this is all compiler dependent, need to use different macros depending
|
||||||
// upon the compiler (and arch)
|
// upon the compiler (and arch)
|
||||||
|
|
20
runtime.c
20
runtime.c
|
@ -2254,12 +2254,10 @@ char *gc_move(char *obj, gc_thread_data *thd, int *alloci, int *heap_grown) {
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
void GC(void *data, closure cont, object *args, int num_args)
|
// Do a minor GC
|
||||||
|
int gc_minor(void *data, object low_limit, object high_limit, closure cont, object *args, int num_args)
|
||||||
{
|
{
|
||||||
char tmp;
|
|
||||||
object temp;
|
object temp;
|
||||||
object low_limit = &tmp; // This is one end of the stack...
|
|
||||||
object high_limit = ((gc_thread_data *)data)->stack_start;
|
|
||||||
int i;
|
int i;
|
||||||
int scani = 0, alloci = 0;
|
int scani = 0, alloci = 0;
|
||||||
int heap_grown = 0;
|
int heap_grown = 0;
|
||||||
|
@ -2374,10 +2372,22 @@ void GC(void *data, closure cont, object *args, int num_args)
|
||||||
}
|
}
|
||||||
scani++;
|
scani++;
|
||||||
}
|
}
|
||||||
|
return alloci;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a minor GC from a mutator thread.
|
||||||
|
* This function runs the core GC algorithm, cooperates with
|
||||||
|
* the collector, and then calls its continuation.
|
||||||
|
*/
|
||||||
|
void GC(void *data, closure cont, object *args, int num_args)
|
||||||
|
{
|
||||||
|
char tmp;
|
||||||
|
object low_limit = &tmp; // This is one end of the stack...
|
||||||
|
object high_limit = ((gc_thread_data *)data)->stack_start;
|
||||||
|
int alloci = gc_minor(data, low_limit, high_limit, cont, args, num_args);
|
||||||
// Cooperate with the collector thread
|
// Cooperate with the collector thread
|
||||||
gc_mut_cooperate((gc_thread_data *)data, alloci);
|
gc_mut_cooperate((gc_thread_data *)data, alloci);
|
||||||
|
|
||||||
#if GC_DEBUG_TRACE
|
#if GC_DEBUG_TRACE
|
||||||
fprintf(stderr, "done with minor GC\n");
|
fprintf(stderr, "done with minor GC\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue