mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-11 23:07:36 +02:00
WIP
This commit is contained in:
parent
273e4ccc88
commit
567e9dd2df
3 changed files with 27 additions and 22 deletions
|
@ -403,6 +403,7 @@ void gc_wait_handshake();
|
||||||
void gc_start_collector();
|
void gc_start_collector();
|
||||||
void gc_mutator_thread_blocked(gc_thread_data * thd, object cont);
|
void gc_mutator_thread_blocked(gc_thread_data * thd, object cont);
|
||||||
void gc_mutator_thread_runnable(gc_thread_data * thd, object result, object maybe_copied);
|
void gc_mutator_thread_runnable(gc_thread_data * thd, object result, object maybe_copied);
|
||||||
|
void Cyc_make_shared_object(void *data, object k, object obj);
|
||||||
#define set_thread_blocked(d, c) \
|
#define set_thread_blocked(d, c) \
|
||||||
gc_mutator_thread_blocked(((gc_thread_data *)d), (c))
|
gc_mutator_thread_blocked(((gc_thread_data *)d), (c))
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -76,6 +76,9 @@
|
||||||
(apply swap! atom f args) ;; Value changed, try again
|
(apply swap! atom f args) ;; Value changed, try again
|
||||||
)))
|
)))
|
||||||
|
|
||||||
|
(define-c make-shared
|
||||||
|
"(void *data, int argc, closure _, object k, object obj)"
|
||||||
|
" Cyc_make_shared_object(data, k, obj); ")
|
||||||
;; TODO: (make-shared obj)
|
;; TODO: (make-shared obj)
|
||||||
;; likely implemented in runtime.c, either needs obj to be an immedate or
|
;; likely implemented in runtime.c, either needs obj to be an immedate or
|
||||||
;; an obj without children we can move to the heap or
|
;; an obj without children we can move to the heap or
|
||||||
|
@ -119,3 +122,6 @@
|
||||||
(compare-and-set! a lis 1)
|
(compare-and-set! a lis 1)
|
||||||
(ref a)
|
(ref a)
|
||||||
))
|
))
|
||||||
|
(newline)
|
||||||
|
(write
|
||||||
|
(make-shared '(1 (2))))
|
||||||
|
|
42
runtime.c
42
runtime.c
|
@ -5684,6 +5684,7 @@ void GC(void *data, closure cont, object * args, int num_args)
|
||||||
|
|
||||||
void Cyc_make_shared_object(void *data, object k, object obj)
|
void Cyc_make_shared_object(void *data, object k, object obj)
|
||||||
{
|
{
|
||||||
|
object buf[1];
|
||||||
if (!is_object_type(obj) || // Immediates do not have to be moved
|
if (!is_object_type(obj) || // Immediates do not have to be moved
|
||||||
gc_is_stack_obj(data, obj)) { // Not thread-local, assume already on heap
|
gc_is_stack_obj(data, obj)) { // Not thread-local, assume already on heap
|
||||||
return_closcall1(data, k, obj);
|
return_closcall1(data, k, obj);
|
||||||
|
@ -5695,30 +5696,27 @@ void Cyc_make_shared_object(void *data, object k, object obj)
|
||||||
// mutex_tag = 14
|
// mutex_tag = 14
|
||||||
// atomic_tag = 22
|
// atomic_tag = 22
|
||||||
// boolean_tag = 0
|
// boolean_tag = 0
|
||||||
|
// bignum_tag = 12
|
||||||
|
// symbol_tag = 19
|
||||||
|
// closure0_tag = 3
|
||||||
|
// eof_tag = 9
|
||||||
|
// macro_tag = 13
|
||||||
// These should never be on the stack
|
// These should never be on the stack
|
||||||
// Cvar_tag = 7
|
// Cvar_tag = 7
|
||||||
TODO:
|
// TODO:
|
||||||
, bytevector_tag = 1
|
// , bytevector_tag = 1
|
||||||
, c_opaque_tag = 2
|
// , c_opaque_tag = 2
|
||||||
, closure0_tag = 3
|
// , closure1_tag = 4
|
||||||
, closure1_tag = 4
|
// , closureN_tag = 5
|
||||||
, closureN_tag = 5
|
// , double_tag = 8
|
||||||
, double_tag = 8
|
// , port_tag = 16
|
||||||
, eof_tag = 9
|
// , primitive_tag = 17
|
||||||
, forward_tag = 10
|
// , string_tag = 18
|
||||||
, integer_tag = 11
|
// , complex_num_tag = 21
|
||||||
, bignum_tag = 12
|
case pair_tag:
|
||||||
, macro_tag = 13
|
case vector_tag:
|
||||||
, pair_tag = 15
|
buf[0] = obj;
|
||||||
, port_tag = 16
|
GC(data, k, buf, 1); // Ensure whole obj is relocated to heap
|
||||||
, primitive_tag = 17
|
|
||||||
, string_tag = 18
|
|
||||||
, symbol_tag = 19
|
|
||||||
, vector_tag = 20
|
|
||||||
, complex_num_tag = 21
|
|
||||||
case pair_type:
|
|
||||||
case vector_type:
|
|
||||||
// TODO: must initiate minor GC, how to ensure we return new ref to obj?
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Invalid shared object type %d\n", type_of(obj));
|
printf("Invalid shared object type %d\n", type_of(obj));
|
||||||
|
|
Loading…
Add table
Reference in a new issue