mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 12:20:26 +02:00
threadsafe access to source properties weak hash table
* libguile/srcprop.c: Add a lock around scm_source_whash, and use it.
This commit is contained in:
parent
26c8cc144f
commit
2f045fc1f6
1 changed files with 30 additions and 3 deletions
|
@ -59,8 +59,9 @@ SCM_GLOBAL_SYMBOL (scm_sym_filename, "filename");
|
||||||
SCM_GLOBAL_SYMBOL (scm_sym_copy, "copy");
|
SCM_GLOBAL_SYMBOL (scm_sym_copy, "copy");
|
||||||
SCM_GLOBAL_SYMBOL (scm_sym_line, "line");
|
SCM_GLOBAL_SYMBOL (scm_sym_line, "line");
|
||||||
SCM_GLOBAL_SYMBOL (scm_sym_column, "column");
|
SCM_GLOBAL_SYMBOL (scm_sym_column, "column");
|
||||||
static SCM scm_source_whash;
|
|
||||||
|
|
||||||
|
static SCM scm_source_whash;
|
||||||
|
static scm_i_pthread_mutex_t source_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -165,7 +166,11 @@ SCM_DEFINE (scm_source_properties, "source-properties", 1, 0, 0,
|
||||||
{
|
{
|
||||||
SCM p;
|
SCM p;
|
||||||
SCM_VALIDATE_NIM (1, obj);
|
SCM_VALIDATE_NIM (1, obj);
|
||||||
|
|
||||||
|
scm_i_pthread_mutex_lock (&source_lock);
|
||||||
p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL);
|
p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL);
|
||||||
|
scm_i_pthread_mutex_unlock (&source_lock);
|
||||||
|
|
||||||
if (SRCPROPSP (p))
|
if (SRCPROPSP (p))
|
||||||
return scm_srcprops_to_alist (p);
|
return scm_srcprops_to_alist (p);
|
||||||
else
|
else
|
||||||
|
@ -183,7 +188,11 @@ SCM_DEFINE (scm_set_source_properties_x, "set-source-properties!", 2, 0, 0,
|
||||||
#define FUNC_NAME s_scm_set_source_properties_x
|
#define FUNC_NAME s_scm_set_source_properties_x
|
||||||
{
|
{
|
||||||
SCM_VALIDATE_NIM (1, obj);
|
SCM_VALIDATE_NIM (1, obj);
|
||||||
|
|
||||||
|
scm_i_pthread_mutex_lock (&source_lock);
|
||||||
scm_hashq_set_x (scm_source_whash, obj, alist);
|
scm_hashq_set_x (scm_source_whash, obj, alist);
|
||||||
|
scm_i_pthread_mutex_unlock (&source_lock);
|
||||||
|
|
||||||
return alist;
|
return alist;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
@ -192,9 +201,15 @@ int
|
||||||
scm_i_has_source_properties (SCM obj)
|
scm_i_has_source_properties (SCM obj)
|
||||||
#define FUNC_NAME "%set-source-properties"
|
#define FUNC_NAME "%set-source-properties"
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
SCM_VALIDATE_NIM (1, obj);
|
SCM_VALIDATE_NIM (1, obj);
|
||||||
|
|
||||||
return scm_is_true (scm_hashq_ref (scm_source_whash, obj, SCM_BOOL_F));
|
scm_i_pthread_mutex_lock (&source_lock);
|
||||||
|
ret = scm_is_true (scm_hashq_ref (scm_source_whash, obj, SCM_BOOL_F));
|
||||||
|
scm_i_pthread_mutex_unlock (&source_lock);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
@ -205,12 +220,14 @@ scm_i_set_source_properties_x (SCM obj, long line, int col, SCM fname)
|
||||||
{
|
{
|
||||||
SCM_VALIDATE_NIM (1, obj);
|
SCM_VALIDATE_NIM (1, obj);
|
||||||
|
|
||||||
|
scm_i_pthread_mutex_lock (&source_lock);
|
||||||
scm_hashq_set_x (scm_source_whash, obj,
|
scm_hashq_set_x (scm_source_whash, obj,
|
||||||
scm_make_srcprops (line, col, fname,
|
scm_make_srcprops (line, col, fname,
|
||||||
SCM_COPY_SOURCE_P
|
SCM_COPY_SOURCE_P
|
||||||
? scm_copy_tree (obj)
|
? scm_copy_tree (obj)
|
||||||
: SCM_UNDEFINED,
|
: SCM_UNDEFINED,
|
||||||
SCM_EOL));
|
SCM_EOL));
|
||||||
|
scm_i_pthread_mutex_unlock (&source_lock);
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
@ -222,7 +239,11 @@ SCM_DEFINE (scm_source_property, "source-property", 2, 0, 0,
|
||||||
{
|
{
|
||||||
SCM p;
|
SCM p;
|
||||||
SCM_VALIDATE_NIM (1, obj);
|
SCM_VALIDATE_NIM (1, obj);
|
||||||
|
|
||||||
|
scm_i_pthread_mutex_lock (&source_lock);
|
||||||
p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL);
|
p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL);
|
||||||
|
scm_i_pthread_mutex_unlock (&source_lock);
|
||||||
|
|
||||||
if (!SRCPROPSP (p))
|
if (!SRCPROPSP (p))
|
||||||
goto alist;
|
goto alist;
|
||||||
if (scm_is_eq (scm_sym_line, key))
|
if (scm_is_eq (scm_sym_line, key))
|
||||||
|
@ -250,6 +271,8 @@ SCM_DEFINE (scm_set_source_property_x, "set-source-property!", 3, 0, 0,
|
||||||
{
|
{
|
||||||
SCM p;
|
SCM p;
|
||||||
SCM_VALIDATE_NIM (1, obj);
|
SCM_VALIDATE_NIM (1, obj);
|
||||||
|
|
||||||
|
scm_i_pthread_mutex_lock (&source_lock);
|
||||||
p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL);
|
p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL);
|
||||||
|
|
||||||
if (scm_is_eq (scm_sym_line, key))
|
if (scm_is_eq (scm_sym_line, key))
|
||||||
|
@ -286,6 +309,8 @@ SCM_DEFINE (scm_set_source_property_x, "set-source-property!", 3, 0, 0,
|
||||||
scm_hashq_set_x (scm_source_whash, obj,
|
scm_hashq_set_x (scm_source_whash, obj,
|
||||||
scm_acons (key, datum, p));
|
scm_acons (key, datum, p));
|
||||||
}
|
}
|
||||||
|
scm_i_pthread_mutex_unlock (&source_lock);
|
||||||
|
|
||||||
return SCM_UNSPECIFIED;
|
return SCM_UNSPECIFIED;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
@ -300,10 +325,12 @@ SCM_DEFINE (scm_cons_source, "cons-source", 3, 0, 0,
|
||||||
{
|
{
|
||||||
SCM p, z;
|
SCM p, z;
|
||||||
z = scm_cons (x, y);
|
z = scm_cons (x, y);
|
||||||
|
scm_i_pthread_mutex_lock (&source_lock);
|
||||||
/* Copy source properties possibly associated with xorig. */
|
/* Copy source properties possibly associated with xorig. */
|
||||||
p = scm_hashq_ref (scm_source_whash, xorig, SCM_BOOL_F);
|
p = scm_hashq_ref (scm_source_whash, xorig, SCM_BOOL_F);
|
||||||
if (scm_is_true (p))
|
if (scm_is_true (p))
|
||||||
scm_hashq_set_x (scm_source_whash, z, p);
|
scm_hashq_set_x (scm_source_whash, z, p);
|
||||||
|
scm_i_pthread_mutex_unlock (&source_lock);
|
||||||
return z;
|
return z;
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue