1
0
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:
Calvin Rose 2019-12-02 04:39:13 -06:00
parent 70c8b6838d
commit 474bcd50a1
2 changed files with 32 additions and 12 deletions

View File

@ -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)

View File

@ -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,