mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-09 22:17:33 +02:00
Doxygen markup
This commit is contained in:
parent
331950d309
commit
2810e736db
3 changed files with 104 additions and 45 deletions
|
@ -32,18 +32,18 @@ extern const object quote_void;
|
||||||
extern const object Cyc_EOF;
|
extern const object Cyc_EOF;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \ingroup gc
|
* \ingroup gc_minor
|
||||||
*/
|
*/
|
||||||
void GC(void *, closure, object *, int);
|
void GC(void *, closure, object *, int);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \ingroup gc
|
* \ingroup gc_major
|
||||||
*/
|
*/
|
||||||
void gc_init_heap(long heap_size);
|
void gc_init_heap(long heap_size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \defgroup prim Primitives
|
* \defgroup prim Primitives
|
||||||
* @brief
|
* @brief Built-in Scheme functions provided by the runtime library
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
/**@{*/
|
/**@{*/
|
||||||
|
|
|
@ -72,17 +72,9 @@ typedef unsigned char tag_type;
|
||||||
#define type_of(obj) (((pair_type *) obj)->tag)
|
#define type_of(obj) (((pair_type *) obj)->tag)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Access an object's forwarding pointer.
|
* \defgroup gc Garbage collection
|
||||||
* Note this is only applicable when objects are relocated
|
|
||||||
* during minor GC.
|
|
||||||
* \ingroup objects
|
|
||||||
*/
|
|
||||||
#define forward(obj) (((pair_type *) obj)->pair_car)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \defgroup gc Garbage collector
|
|
||||||
*
|
*
|
||||||
* @brief All of the code related to the garbage collector.
|
* @brief The Cyclone runtime's garbage collector (GC)
|
||||||
*
|
*
|
||||||
* When using the FFI there is normally no need to call
|
* When using the FFI there is normally no need to call
|
||||||
* into this code unless something is specifically mentioned
|
* into this code unless something is specifically mentioned
|
||||||
|
@ -91,25 +83,11 @@ typedef unsigned char tag_type;
|
||||||
/**@{*/
|
/**@{*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maximum number of args that GC will accept
|
* \defgroup gc_major Major GC
|
||||||
|
* @brief Major GC is responsible for removing unused objects from
|
||||||
|
* the heap.
|
||||||
*/
|
*/
|
||||||
#define NUM_GC_ARGS 128
|
/**@{*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Which way does the CPU grow its stack?
|
|
||||||
*/
|
|
||||||
#define STACK_GROWTH_IS_DOWNWARD 1
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Size of the stack buffer, in bytes.
|
|
||||||
* This is used as the first generation of the GC.
|
|
||||||
*/
|
|
||||||
#define STACK_SIZE 500000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Do not allocate objects larger than this on the stack.
|
|
||||||
*/
|
|
||||||
#define MAX_STACK_OBJ (STACK_SIZE * 2)
|
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
// Parameters for size of a "page" on the heap (the second generation GC), in bytes.
|
// Parameters for size of a "page" on the heap (the second generation GC), in bytes.
|
||||||
|
@ -189,14 +167,21 @@ typedef enum {
|
||||||
, HEAP_HUGE // Huge objects, 1 per page
|
, HEAP_HUGE // Huge objects, 1 per page
|
||||||
} gc_heap_type;
|
} gc_heap_type;
|
||||||
|
|
||||||
|
/** The number of `gc_heap_type`'s */
|
||||||
#define NUM_HEAP_TYPES (HEAP_HUGE + 1)
|
#define NUM_HEAP_TYPES (HEAP_HUGE + 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Linked list of free memory chunks on a heap page
|
||||||
|
*/
|
||||||
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 {
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
gc_free_list *next;
|
gc_free_list *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data for a heap page
|
||||||
|
*/
|
||||||
typedef struct gc_heap_t gc_heap;
|
typedef struct gc_heap_t gc_heap;
|
||||||
struct gc_heap_t {
|
struct gc_heap_t {
|
||||||
gc_heap_type type;
|
gc_heap_type type;
|
||||||
|
@ -213,23 +198,34 @@ struct gc_heap_t {
|
||||||
char *data;
|
char *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A heap root is the heap's first page
|
||||||
|
*/
|
||||||
typedef struct gc_heap_root_t gc_heap_root;
|
typedef struct gc_heap_root_t gc_heap_root;
|
||||||
struct gc_heap_root_t {
|
struct gc_heap_root_t {
|
||||||
gc_heap **heap;
|
gc_heap **heap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Header added to each object for GC purposes
|
||||||
|
*/
|
||||||
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 char mark; // mark bits (only need 2)
|
unsigned char mark; // mark bits (only need 2)
|
||||||
unsigned char grayed; // stack object to be grayed when moved to heap
|
unsigned char grayed; // stack object to be grayed when moved to heap
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Get an object's `mark` value */
|
||||||
#define mark(x) (((list) x)->hdr.mark)
|
#define mark(x) (((list) x)->hdr.mark)
|
||||||
|
|
||||||
|
/** Get an object's `grayed` value */
|
||||||
#define grayed(x) (((list) x)->hdr.grayed)
|
#define grayed(x) (((list) x)->hdr.grayed)
|
||||||
|
|
||||||
/* Enums for tri-color marking */
|
/** Enums for tri-color marking */
|
||||||
typedef enum { STATUS_ASYNC, STATUS_SYNC1, STATUS_SYNC2
|
typedef enum { STATUS_ASYNC, STATUS_SYNC1, STATUS_SYNC2
|
||||||
} gc_status_type;
|
} gc_status_type;
|
||||||
|
|
||||||
|
/** Stages of the Major GC's collector thread */
|
||||||
typedef enum { STAGE_CLEAR_OR_MARKING, STAGE_TRACING
|
typedef enum { STAGE_CLEAR_OR_MARKING, STAGE_TRACING
|
||||||
//, STAGE_REF_PROCESSING
|
//, STAGE_REF_PROCESSING
|
||||||
, STAGE_SWEEPING, STAGE_RESTING
|
, STAGE_SWEEPING, STAGE_RESTING
|
||||||
|
@ -238,16 +234,24 @@ typedef enum { STAGE_CLEAR_OR_MARKING, STAGE_TRACING
|
||||||
// Constant colors are defined here.
|
// Constant colors are defined here.
|
||||||
// The mark/clear colors are defined in the gc module because
|
// The mark/clear colors are defined in the gc module because
|
||||||
// the collector swaps their values as an optimization.
|
// the collector swaps their values as an optimization.
|
||||||
#define gc_color_red 0 // Memory not to be GC'd, such as on the stack
|
|
||||||
#define gc_color_blue 2 // Unallocated memory
|
|
||||||
|
|
||||||
/* Threading */
|
/** Memory not to be collected by major GC, such as on the stack */
|
||||||
|
#define gc_color_red 0
|
||||||
|
|
||||||
|
/** Unallocated memory */
|
||||||
|
#define gc_color_blue 2
|
||||||
|
|
||||||
|
/** Threading */
|
||||||
typedef enum { CYC_THREAD_STATE_NEW, CYC_THREAD_STATE_RUNNABLE,
|
typedef enum { CYC_THREAD_STATE_NEW, CYC_THREAD_STATE_RUNNABLE,
|
||||||
CYC_THREAD_STATE_BLOCKED, CYC_THREAD_STATE_BLOCKED_COOPERATING,
|
CYC_THREAD_STATE_BLOCKED, CYC_THREAD_STATE_BLOCKED_COOPERATING,
|
||||||
CYC_THREAD_STATE_TERMINATED
|
CYC_THREAD_STATE_TERMINATED
|
||||||
} cyc_thread_state_type;
|
} cyc_thread_state_type;
|
||||||
|
|
||||||
/* Thread data structures */
|
/**
|
||||||
|
* Thread data structures
|
||||||
|
* @brief Each thread is given an instance of this struct to
|
||||||
|
* maintain its state
|
||||||
|
*/
|
||||||
typedef struct gc_thread_data_t gc_thread_data;
|
typedef struct gc_thread_data_t gc_thread_data;
|
||||||
struct gc_thread_data_t {
|
struct gc_thread_data_t {
|
||||||
// Thread object, if applicable
|
// Thread object, if applicable
|
||||||
|
@ -292,13 +296,6 @@ struct gc_thread_data_t {
|
||||||
object exception_handler_stack;
|
object exception_handler_stack;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Determine if stack has overflowed
|
|
||||||
#if STACK_GROWTH_IS_DOWNWARD
|
|
||||||
#define stack_overflow(x,y) ((x) < (y))
|
|
||||||
#else
|
|
||||||
#define stack_overflow(x,y) ((x) > (y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* GC prototypes */
|
/* GC prototypes */
|
||||||
void gc_initialize(void);
|
void gc_initialize(void);
|
||||||
void gc_add_mutator(gc_thread_data * thd);
|
void gc_add_mutator(gc_thread_data * thd);
|
||||||
|
@ -354,9 +351,63 @@ void gc_mutator_thread_runnable(gc_thread_data * thd, object result);
|
||||||
// body \
|
// body \
|
||||||
// return_thread_runnable((data), (result));
|
// return_thread_runnable((data), (result));
|
||||||
*/
|
*/
|
||||||
/* Mutation table to support minor GC write barrier */
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup gc_minor Minor GC
|
||||||
|
* @brief Minor GC is called periodically to copy live objects off of a thread stack
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/**@{*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum number of args that GC will accept
|
||||||
|
*/
|
||||||
|
#define NUM_GC_ARGS 128
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Which way does the CPU grow its stack?
|
||||||
|
*/
|
||||||
|
#define STACK_GROWTH_IS_DOWNWARD 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Size of the stack buffer, in bytes.
|
||||||
|
* This is used as the first generation of the GC.
|
||||||
|
*/
|
||||||
|
#define STACK_SIZE 500000
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do not allocate objects larger than this on the stack.
|
||||||
|
*/
|
||||||
|
#define MAX_STACK_OBJ (STACK_SIZE * 2)
|
||||||
|
|
||||||
|
/** Determine if stack has overflowed */
|
||||||
|
#if STACK_GROWTH_IS_DOWNWARD
|
||||||
|
#define stack_overflow(x,y) ((x) < (y))
|
||||||
|
#else
|
||||||
|
#define stack_overflow(x,y) ((x) > (y))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Access an object's forwarding pointer.
|
||||||
|
* Note this is only applicable when objects are relocated
|
||||||
|
* during minor GC.
|
||||||
|
* \ingroup objects
|
||||||
|
*/
|
||||||
|
#define forward(obj) (((pair_type *) obj)->pair_car)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \defgroup gc_minor_mut Mutation table
|
||||||
|
* @brief Mutation table to support the minor GC write barrier
|
||||||
|
*/
|
||||||
|
/**@{*/
|
||||||
void add_mutation(void *data, object var, int index, object value);
|
void add_mutation(void *data, object var, int index, object value);
|
||||||
void clear_mutations(void *data);
|
void clear_mutations(void *data);
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
// END GC section
|
// END GC section
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
@ -978,6 +1029,11 @@ void Cyc_int2bignum(int n, mp_int *bn);
|
||||||
|
|
||||||
/* Remaining GC prototypes that require objects to be defined */
|
/* Remaining GC prototypes that require objects to be defined */
|
||||||
void *gc_alloc_from_bignum(gc_thread_data *data, bignum_type *src);
|
void *gc_alloc_from_bignum(gc_thread_data *data, bignum_type *src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do a minor GC
|
||||||
|
* \ingroup gc_minor
|
||||||
|
*/
|
||||||
int gc_minor(void *data, object low_limit, object high_limit, closure cont,
|
int gc_minor(void *data, object low_limit, object high_limit, closure cont,
|
||||||
object * args, int num_args);
|
object * args, int num_args);
|
||||||
|
|
||||||
|
|
|
@ -4738,7 +4738,10 @@ object Cyc_trigger_minor_gc(void *data, object cont)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do a minor GC
|
/**
|
||||||
|
* Do a minor GC
|
||||||
|
* \ingroup gc_minor
|
||||||
|
*/
|
||||||
int gc_minor(void *data, object low_limit, object high_limit, closure cont,
|
int gc_minor(void *data, object low_limit, object high_limit, closure cont,
|
||||||
object * args, int num_args)
|
object * args, int num_args)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue