Issue #279 - Support end-result and return from thread-join

This commit is contained in:
Justin Ethier 2021-07-25 23:02:31 -04:00
parent df5438c9f6
commit 2a9d0ea604
2 changed files with 11 additions and 2 deletions

View file

@ -5085,6 +5085,10 @@ void _Cyc_91spawn_91thread_67(void *data, object clo, int argc, object *args)
void _Cyc_91end_91thread_67(void *data, object clo, int argc, object *args) void _Cyc_91end_91thread_67(void *data, object clo, int argc, object *args)
{ {
gc_thread_data *d = data;
vector_type *v = d->scm_thread_obj;
v->elements[7] = args[0]; // Store thread result
Cyc_end_thread((gc_thread_data *) data); Cyc_end_thread((gc_thread_data *) data);
object cont = args[0]; object cont = args[0];
return_closcall1(data, cont, boolean_f); return_closcall1(data, cont, boolean_f);

View file

@ -73,6 +73,7 @@
;; - specific ;; - specific
;; - internal ;; - internal
;; - end of thread cont (or #f for default) ;; - end of thread cont (or #f for default)
;; - end-result - Result of thread that terminates successfully
(vector (vector
'cyc-thread-obj 'cyc-thread-obj
thunk thunk
@ -80,6 +81,7 @@
name-str name-str
#f #f
#f #f
#f
#f))) #f)))
(define (thread-name t) (vector-ref t 3)) (define (thread-name t) (vector-ref t 3))
@ -151,9 +153,12 @@
} }
return_thread_runnable(data, boolean_t);") return_thread_runnable(data, boolean_t);")
(define (thread-join! t) (define (thread-join! t)
(if (and (thread? t) (Cyc-opaque? (vector-ref t 2))) (cond
((and (thread? t) (Cyc-opaque? (vector-ref t 2)))
(%thread-join! (vector-ref t 2)) (%thread-join! (vector-ref t 2))
#f)) (vector-ref t 7))
(else
#f))) ;; TODO: raise an error instead?
(define-c thread-sleep! (define-c thread-sleep!
"(void *data, int argc, closure _, object k, object timeout)" "(void *data, int argc, closure _, object k, object timeout)"