wingo pushed a commit to branch master in repository guile. commit 4110e7bbb181786059a9d2b6ff010a99f69e5710 Author: Andy Wingo <wi...@pobox.com> Date: Tue Nov 8 20:37:38 2016 +0100
Put mutex kind in SMOB flags * libguile/threads.c (struct scm_mutex, SCM_MUTEX_KIND, scm_make_mutex) (scm_timed_lock_mutex, scm_unlock_mutex) (scm_timed_wait_condition_variable): Mutex kind in SMOB flags. --- libguile/threads.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libguile/threads.c b/libguile/threads.c index f000e9c..1c88796 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -1065,12 +1065,12 @@ struct scm_mutex { scm_i_pthread_mutex_t lock; SCM owner; int level; /* how much the owner owns us. <= 1 for non-recursive mutexes */ - enum scm_mutex_kind kind; SCM waiting; /* the threads waiting for this mutex. */ }; -#define SCM_MUTEXP(x) SCM_SMOB_PREDICATE (scm_tc16_mutex, x) -#define SCM_MUTEX_DATA(x) ((struct scm_mutex *) SCM_SMOB_DATA (x)) +#define SCM_MUTEXP(x) SCM_SMOB_PREDICATE (scm_tc16_mutex, x) +#define SCM_MUTEX_DATA(x) ((struct scm_mutex *) SCM_SMOB_DATA (x)) +#define SCM_MUTEX_KIND(x) ((enum scm_mutex_kind) (SCM_SMOB_FLAGS (x) & 0x3)) static int scm_mutex_print (SCM mx, SCM port, scm_print_state *pstate SCM_UNUSED) @@ -1114,10 +1114,9 @@ SCM_DEFINE (scm_make_mutex_with_kind, "make-mutex", 0, 1, 0, memcpy (&m->lock, &lock, sizeof (m->lock)); m->owner = SCM_BOOL_F; m->level = 0; - m->kind = mkind; m->waiting = make_queue (); - return scm_new_smob (scm_tc16_mutex, (scm_t_bits) m); + return scm_new_smob (scm_tc16_mutex | (mkind << 16), (scm_t_bits) m); } #undef FUNC_NAME @@ -1173,9 +1172,10 @@ SCM_DEFINE (scm_timed_lock_mutex, "lock-mutex", 1, 1, 0, scm_i_pthread_mutex_unlock (&m->lock); return SCM_BOOL_T; } - else if (scm_is_eq (m->owner, new_owner) && m->kind != SCM_MUTEX_UNOWNED) + else if (scm_is_eq (m->owner, new_owner) && + SCM_MUTEX_KIND (mutex) != SCM_MUTEX_UNOWNED) { - if (m->kind == SCM_MUTEX_RECURSIVE) + if (SCM_MUTEX_KIND (mutex) == SCM_MUTEX_RECURSIVE) { m->level++; scm_i_pthread_mutex_unlock (&m->lock); @@ -1258,7 +1258,7 @@ SCM_DEFINE (scm_unlock_mutex, "unlock-mutex", 1, 0, 0, (SCM mutex), scm_i_pthread_mutex_unlock (&m->lock); SCM_MISC_ERROR ("mutex not locked", SCM_EOL); } - else if (m->kind != SCM_MUTEX_UNOWNED) + else if (SCM_MUTEX_KIND (mutex) != SCM_MUTEX_UNOWNED) { scm_i_pthread_mutex_unlock (&m->lock); SCM_MISC_ERROR ("mutex not locked by current thread", SCM_EOL); @@ -1400,7 +1400,7 @@ SCM_DEFINE (scm_timed_wait_condition_variable, "wait-condition-variable", 2, 1, scm_i_pthread_mutex_unlock (&m->lock); SCM_MISC_ERROR ("mutex not locked", SCM_EOL); } - else if (m->kind != SCM_MUTEX_UNOWNED) + else if (SCM_MUTEX_KIND (mutex) != SCM_MUTEX_UNOWNED) { scm_i_pthread_mutex_unlock (&m->lock); SCM_MISC_ERROR ("mutex not locked by current thread", SCM_EOL);