diff options
Diffstat (limited to 'libguile/procprop.c')
-rw-r--r-- | libguile/procprop.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/libguile/procprop.c b/libguile/procprop.c index 4f18dff75..c066eca8a 100644 --- a/libguile/procprop.c +++ b/libguile/procprop.c @@ -194,7 +194,18 @@ SCM_DEFINE (scm_procedure_property, "procedure-property", 2, 0, 0, /* avoid a cons in this case */ return scm_i_procedure_arity (proc); else - return scm_assq_ref (scm_procedure_properties (proc), key); + { + SCM props; + if (SCM_CLOSUREP (proc)) + props = SCM_PROCPROPS (proc); + else + { + scm_i_pthread_mutex_lock (&non_closure_props_lock); + props = scm_hashq_ref (non_closure_props, proc, SCM_EOL); + scm_i_pthread_mutex_unlock (&non_closure_props_lock); + } + return scm_assq_ref (props, key); + } } #undef FUNC_NAME @@ -208,9 +219,20 @@ SCM_DEFINE (scm_set_procedure_property_x, "set-procedure-property!", 3, 0, 0, if (scm_is_eq (key, scm_sym_arity)) SCM_MISC_ERROR ("arity is a read-only property", SCM_EOL); - scm_set_procedure_properties_x - (proc, - scm_assq_set_x (scm_procedure_properties (proc), key, val)); + + if (SCM_CLOSUREP (proc)) + SCM_SETPROCPROPS (proc, + scm_assq_set_x (SCM_PROCPROPS (proc), key, val)); + else + { + scm_i_pthread_mutex_lock (&non_closure_props_lock); + scm_hashq_set_x (non_closure_props, proc, + scm_assq_set_x (scm_hashq_ref (non_closure_props, proc, + SCM_EOL), + key, val)); + scm_i_pthread_mutex_unlock (&non_closure_props_lock); + } + return SCM_UNSPECIFIED; } #undef FUNC_NAME |