From 214f8de4c00bf054144cb82ac14aa68bfff8f932 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Mon, 15 Feb 2016 22:19:12 -0500 Subject: [PATCH] Added signal and broadcast --- srfi/18.sld | 50 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/srfi/18.sld b/srfi/18.sld index 90bd17c1..3b0e8c56 100644 --- a/srfi/18.sld +++ b/srfi/18.sld @@ -39,8 +39,8 @@ ;; (condition-variable-name condition-variable) ;procedure ;; (condition-variable-specific condition-variable) ;procedure ;; (condition-variable-specific-set! condition-variable obj) ;procedure - ;; (condition-variable-signal! condition-variable) ;procedure - ;; (condition-variable-broadcast! condition-variable) ;procedure + condition-variable-signal! + condition-variable-broadcast! ;; Time functions are not implemented here, see (scheme time) instead @@ -111,18 +111,36 @@ " object result = Cyc_is_cond_var(obj); return_closcall1(data, k, result); ") ;; (make-condition-variable [name]) ;procedure -; (define-c make-condition-variable -; "(void *data, int argc, closure _, object k)" -; " int heap_grown; -; cond_var cond; -; cond_var_type tmp; -; tmp.hdr.mark = gc_color_red; -; tmp.hdr.grayed = 0; -; tmp.tag = cond_var_tag; -; cond = gc_alloc(Cyc_heap, sizeof(cond_var_type), (char *)(&tmp), (gc_thread_data *)data, &heap_grown); -; if (pthread_cond_init(&(cond->cond), NULL) != 0) { -; fprintf(stderr, "Unable to make condition variable\n"); -; exit(1); -; } -; return_closcall1(data, k, cond); ") + (define-c make-condition-variable + "(void *data, int argc, closure _, object k)" + " int heap_grown; + cond_var cond; + cond_var_type tmp; + tmp.hdr.mark = gc_color_red; + tmp.hdr.grayed = 0; + tmp.tag = cond_var_tag; + cond = gc_alloc(gc_get_heap(), sizeof(cond_var_type), (char *)(&tmp), (gc_thread_data *)data, &heap_grown); + if (pthread_cond_init(&(cond->cond), NULL) != 0) { + fprintf(stderr, \"Unable to make condition variable\\n\"); + exit(1); + } + return_closcall1(data, k, cond); ") + ;; (condition-variable-signal! condition-variable) ;procedure + ;; (condition-variable-broadcast! condition-variable) ;procedure + (define-c condition-variable-signal! + "(void *data, int argc, closure _, object k, object cond)" + " Cyc_check_cond_var(data, cond); + if (pthread_cond_signal(&(((cond_var)cond)->cond)) != 0) { + fprintf(stderr, \"Unable to signal condition variable\\n\"); + exit(1); + } + return_closcall1(data, k, boolean_t); ") + (define-c condition-variable-broadcast! + "(void *data, int argc, closure _, object k, object cond)" + " Cyc_check_cond_var(data, cond); + if (pthread_cond_broadcast(&(((cond_var)cond)->cond)) != 0) { + fprintf(stderr, \"Unable to broadcast condition variable\\n\"); + exit(1); + } + return_closcall1(data, k, boolean_t); ") ))