From ef61c578c5f73b62d5a22d633ae56db0fe5f5a7e Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Sun, 3 Jan 2016 00:02:19 -0500 Subject: [PATCH] Build-out of mutex lock/unlock --- include/cyclone/runtime.h | 2 +- runtime.c | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 91a6c00a..42826130 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -124,7 +124,7 @@ object Cyc_vector_set(void *d, object v, object k, object obj); object Cyc_make_vector(void *data, object cont, object len, object fill); object Cyc_list2vector(void *data, object cont, object l); object Cyc_make_mutex(void *data); -object Cyc_mutex_lock(void *data, object obj); +object Cyc_mutex_lock(void *data, object cont, object obj); object Cyc_mutex_unlock(void *data, object obj); object Cyc_number2string(void *d, object cont, object n); object Cyc_symbol2string(void *d, object cont, object sym) ; diff --git a/runtime.c b/runtime.c index 7d57f678..b0bf3d48 100644 --- a/runtime.c +++ b/runtime.c @@ -1244,14 +1244,27 @@ object Cyc_make_mutex(void *data) { return lock; } -object Cyc_mutex_lock(void *data, object obj) { - // TODO: set for cooperation - // TODO: actually lock +object Cyc_mutex_lock(void *data, object cont, object obj) { + mutex m = (mutex) obj; + Cyc_check_mutex(data, obj); + gc_mutator_thread_blocked((gc_thread_data *)data, cont); + if (pthread_mutex_lock(&(m->lock)) != 0) { + fprintf(stderr, "Error locking mutex\n"); + exit(1); + } + gc_mutator_thread_runnable( + (gc_thread_data *)data, + boolean_t); return boolean_t; } object Cyc_mutex_unlock(void *data, object obj) { - // TODO: actually unlock + mutex m = (mutex) obj; + Cyc_check_mutex(data, obj); + if (pthread_mutex_unlock(&(m->lock)) != 0) { + fprintf(stderr, "Error unlocking mutex\n"); + exit(1); + } return boolean_t; } @@ -1919,7 +1932,7 @@ void _Cyc_make_mutex(void *data, object cont, object args) { return_closcall1(data, cont, c); }} void _Cyc_mutex_lock(void *data, object cont, object args) { Cyc_check_num_args(data, "mutex-lock!", 1, args); - { object c = Cyc_mutex_lock(data, car(args)); + { object c = Cyc_mutex_lock(data, cont, car(args)); return_closcall1(data, cont, c); }} void _Cyc_mutex_unlock(void *data, object cont, object args) { Cyc_check_num_args(data, "mutex-unlock!", 1, args);