mirror of
https://github.com/janet-lang/janet
synced 2024-11-28 11:09:54 +00:00
Add methods to threads.
This commit is contained in:
parent
70c8b6838d
commit
474bcd50a1
@ -1,18 +1,24 @@
|
|||||||
(defn worker-main
|
(defn worker-main
|
||||||
[parent]
|
[parent]
|
||||||
(def name (thread/receive parent))
|
(def name (:receive parent))
|
||||||
|
(def interval (:receive parent))
|
||||||
(for i 0 10
|
(for i 0 10
|
||||||
(os/sleep 1)
|
(os/sleep interval)
|
||||||
(print "thread " name " wakeup no. " i))
|
(printf "thread %s wakeup no. %d\n" name i))
|
||||||
(thread/send parent :done))
|
(:send parent :done))
|
||||||
|
|
||||||
(defn make-worker
|
(defn make-worker
|
||||||
[name]
|
[name interval]
|
||||||
(-> (thread/new) (thread/send worker-main) (thread/send name)))
|
(-> (thread/new)
|
||||||
|
(:send worker-main)
|
||||||
|
(:send name)
|
||||||
|
(:send interval)))
|
||||||
|
|
||||||
(def bob (make-worker "bob"))
|
(def bob (make-worker "bob" 0.2))
|
||||||
(os/sleep 0.5)
|
(def joe (make-worker "joe" 0.3))
|
||||||
(def joe (make-worker "joe"))
|
(def sam (make-worker "joe" 0.5))
|
||||||
|
|
||||||
(thread/receive bob)
|
# Receive out of order
|
||||||
(thread/receive joe)
|
(:receive bob)
|
||||||
|
(:receive sam)
|
||||||
|
(:receive joe)
|
||||||
|
@ -188,11 +188,13 @@ static int thread_mark(void *p, size_t size) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Janet janet_thread_getter(void *p, Janet key);
|
||||||
|
|
||||||
static JanetAbstractType Thread_AT = {
|
static JanetAbstractType Thread_AT = {
|
||||||
"core/thread",
|
"core/thread",
|
||||||
thread_gc,
|
thread_gc,
|
||||||
thread_mark,
|
thread_mark,
|
||||||
NULL,
|
janet_thread_getter,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
@ -318,6 +320,18 @@ static Janet cfun_thread_receive(int32_t argc, Janet *argv) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const JanetMethod janet_thread_methods[] = {
|
||||||
|
{"send", cfun_thread_send},
|
||||||
|
{"receive", cfun_thread_receive},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static Janet janet_thread_getter(void *p, Janet key) {
|
||||||
|
(void) p;
|
||||||
|
if (!janet_checktype(key, JANET_KEYWORD)) janet_panicf("expected keyword method");
|
||||||
|
return janet_getmethod(janet_unwrap_keyword(key), janet_thread_methods);
|
||||||
|
}
|
||||||
|
|
||||||
static const JanetReg threadlib_cfuns[] = {
|
static const JanetReg threadlib_cfuns[] = {
|
||||||
{
|
{
|
||||||
"thread/new", cfun_thread_new,
|
"thread/new", cfun_thread_new,
|
||||||
|
Loading…
Reference in New Issue
Block a user