mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-14 08:17:35 +02:00
Added thread start/end functions to runtime
This commit is contained in:
parent
43d29e3a4c
commit
e57688a774
3 changed files with 51 additions and 12 deletions
1
gc.c
1
gc.c
|
@ -1181,6 +1181,7 @@ void *collector_main(void *arg)
|
||||||
}
|
}
|
||||||
nanosleep(&tim, NULL);
|
nanosleep(&tim, NULL);
|
||||||
}
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static pthread_t collector_thread;
|
static pthread_t collector_thread;
|
||||||
|
|
|
@ -186,7 +186,9 @@ object equalp(object,object);
|
||||||
object memberp(void *,object,list);
|
object memberp(void *,object,list);
|
||||||
object memqp(void *,object,list);
|
object memqp(void *,object,list);
|
||||||
|
|
||||||
|
object Cyc_spawn_thread(object thunk);
|
||||||
void Cyc_start_thread(gc_thread_data *thd);
|
void Cyc_start_thread(gc_thread_data *thd);
|
||||||
|
void Cyc_end_thread(gc_thread_data *thd);
|
||||||
void GC(void *,closure,object*,int);
|
void GC(void *,closure,object*,int);
|
||||||
|
|
||||||
void Cyc_st_add(void *data, char *frame);
|
void Cyc_st_add(void *data, char *frame);
|
||||||
|
|
60
runtime.c
60
runtime.c
|
@ -2475,19 +2475,46 @@ void Cyc_apply_from_buf(void *data, int argc, object prim, object *buf) {
|
||||||
// longjmp(jmp_main,1); /* Return globals gc_cont, gc_ans. */
|
// longjmp(jmp_main,1); /* Return globals gc_cont, gc_ans. */
|
||||||
//}
|
//}
|
||||||
|
|
||||||
void Cyc_setup_thread(thunk)
|
/**
|
||||||
|
* Thread initialization function only called from within the runtime
|
||||||
|
*/
|
||||||
|
void *Cyc_init_thread(object thunk)
|
||||||
{
|
{
|
||||||
// TODO: how to use pthread? need to run this in a pthread, I think. when/how to do that?
|
long stack_start;
|
||||||
// TODO: this function should be start_thread, call below one run_thread
|
|
||||||
// TODO:
|
|
||||||
gc_thread_data *thd;
|
gc_thread_data *thd;
|
||||||
// malloc thread, init it
|
// TODO: I don't think we want a closure here, but rather want to
|
||||||
// setup gc_cont, args
|
// init the end-thread primitive, and call into that instead. that way
|
||||||
// gc_add_mutator
|
// we can explicitly provide the thread_data argument.
|
||||||
// Cyc_start_thread(thd)
|
mclosure0(clo_end, Cyc_end_thread);
|
||||||
|
thd = malloc(sizeof(gc_thread_data));
|
||||||
|
gc_thread_data_init(thd, 0, (char *) &stack_start, global_stack_size);
|
||||||
|
thd->gc_cont = thunk;
|
||||||
|
thd->gc_num_args = 1;
|
||||||
|
thd->gc_args[0] = &clo_end;
|
||||||
|
gc_add_mutator(thd);
|
||||||
|
Cyc_start_thread(thd);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spawn a new thread to execute the given thunk
|
||||||
|
*/
|
||||||
|
object Cyc_spawn_thread(object thunk)
|
||||||
|
{
|
||||||
|
pthread_t thread;
|
||||||
|
pthread_attr_t attr;
|
||||||
|
pthread_attr_init(&attr);
|
||||||
|
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
||||||
|
if (pthread_create(&thread, NULL, Cyc_init_thread, thunk)) {
|
||||||
|
fprintf(stderr, "Error creating a new thread\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return boolean_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start a thread's trampoline
|
||||||
|
*/
|
||||||
void Cyc_start_thread(gc_thread_data *thd)
|
void Cyc_start_thread(gc_thread_data *thd)
|
||||||
{
|
{
|
||||||
/* Tank, load the jump program... */
|
/* Tank, load the jump program... */
|
||||||
|
@ -2507,10 +2534,19 @@ void Cyc_start_thread(gc_thread_data *thd)
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cyc_end_thread(gc_thread_data *thd) {
|
/**
|
||||||
// TODO: call pthread_exit?
|
* Terminate a thread
|
||||||
|
*/
|
||||||
|
void Cyc_end_thread(gc_thread_data *thd)
|
||||||
|
{
|
||||||
// alternatively could call longjmp with a null continuation, but that seems
|
// alternatively could call longjmp with a null continuation, but that seems
|
||||||
// more complicated than necessary
|
// more complicated than necessary. or does it... see next comment:
|
||||||
|
|
||||||
|
// TODO: what if there are any locals from the thread's stack still being
|
||||||
|
// referenced? might want to do one more minor GC to clear the stack before
|
||||||
|
// terminating the thread
|
||||||
|
|
||||||
|
pthread_exit(NULL); // For now, just a proof of concept
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark globals as part of the tracing collector
|
// Mark globals as part of the tracing collector
|
||||||
|
|
Loading…
Add table
Reference in a new issue