mirror of
https://github.com/janet-lang/janet
synced 2024-12-26 00:10:27 +00:00
Begin adding support for multiple lightweight threads.
Can be used to implement coroutines, error handling, and more.
This commit is contained in:
parent
6246c43e22
commit
8aa99556e7
30
core/stl.c
30
core/stl.c
@ -399,6 +399,34 @@ int gst_stl_string(Gst *vm) {
|
|||||||
gst_c_return(vm, gst_wrap_string(gst_string_end(vm, str)));
|
gst_c_return(vm, gst_wrap_string(gst_string_end(vm, str)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create a thread */
|
||||||
|
int gst_stl_thread(Gst *vm) {
|
||||||
|
GstThread *t;
|
||||||
|
GstValue callee = gst_arg(vm, 0);
|
||||||
|
if (callee.type != GST_FUNCTION && callee.type != GST_CFUNCTION)
|
||||||
|
gst_c_throwc(vm, "expected function");
|
||||||
|
t = gst_thread(vm, callee, 10);
|
||||||
|
t->parent = vm->thread;
|
||||||
|
gst_c_return(vm, gst_wrap_thread(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Transfer to a new thread */
|
||||||
|
int gst_stl_transfer(Gst *vm) {
|
||||||
|
GstThread *t;
|
||||||
|
GstValue ret = gst_arg(vm, 1);
|
||||||
|
if (!gst_check_thread(vm, 0, &t))
|
||||||
|
gst_c_throwc(vm, "expected thread");
|
||||||
|
if (t->status == GST_THREAD_DEAD)
|
||||||
|
gst_c_throwc(vm, "cannot transfer to dead thread");
|
||||||
|
if (t->status == GST_THREAD_ALIVE)
|
||||||
|
gst_c_throwc(vm, "cannot transfer to current thread");
|
||||||
|
gst_thread_beginframe(vm, t, gst_wrap_nil(), 0);
|
||||||
|
vm->thread->status = GST_THREAD_PENDING;
|
||||||
|
t->status = GST_THREAD_ALIVE;
|
||||||
|
vm->thread = t;
|
||||||
|
gst_c_return(vm, ret);
|
||||||
|
}
|
||||||
|
|
||||||
/* Associative get */
|
/* Associative get */
|
||||||
int gst_stl_get(Gst *vm) {
|
int gst_stl_get(Gst *vm) {
|
||||||
GstValue ret;
|
GstValue ret;
|
||||||
@ -810,6 +838,8 @@ static const GstModuleItem const std_module[] = {
|
|||||||
{"struct", gst_stl_struct},
|
{"struct", gst_stl_struct},
|
||||||
{"buffer", gst_stl_buffer},
|
{"buffer", gst_stl_buffer},
|
||||||
{"string", gst_stl_string},
|
{"string", gst_stl_string},
|
||||||
|
{"thread", gst_stl_thread},
|
||||||
|
{"transfer", gst_stl_transfer},
|
||||||
{"print", gst_stl_print},
|
{"print", gst_stl_print},
|
||||||
{"tostring", gst_stl_tostring},
|
{"tostring", gst_stl_tostring},
|
||||||
{"exit", gst_stl_exit},
|
{"exit", gst_stl_exit},
|
||||||
|
Loading…
Reference in New Issue
Block a user