From 5f558244261f3a22217d5136d0aebb7f644d7efb Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Mon, 5 Mar 2012 09:51:17 -0500 Subject: [PATCH 1/3] Don't lock mutex to set shared flag on stringbuf if it's already shared * libguile/strings.c (set_stringbuf_shared): New internal static function to replace the macro SET_STRINGBUF_SHARED. The macro assumed that the stringbuf_write_mutex was already locked, but this new function handles locking internally, and avoids locking if the stringbuf is already shared. (SET_STRINGBUF_SHARED): Removed. (scm_i_make_string, scm_i_substring, scm_i_substring_read_only, scm_i_make_symbol, scm_i_symbol_substring): Use set_stringbuf_shared instead of SET_STRINGBUF_SHARED. --- libguile/strings.c | 41 ++++++++++++++++++----------------------- 1 files changed, 18 insertions(+), 23 deletions(-) diff --git a/libguile/strings.c b/libguile/strings.c index 494a658..35757f0 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -91,16 +91,6 @@ #define STRINGBUF_LENGTH(buf) (SCM_CELL_WORD_1 (buf)) -#define SET_STRINGBUF_SHARED(buf) \ - do \ - { \ - /* Don't modify BUF if it's already marked as shared since it might be \ - a read-only, statically allocated stringbuf. */ \ - if (SCM_LIKELY (!STRINGBUF_SHARED (buf))) \ - SCM_SET_CELL_WORD_0 ((buf), SCM_CELL_WORD_0 (buf) | STRINGBUF_F_SHARED); \ - } \ - while (0) - #ifdef SCM_STRING_LENGTH_HISTOGRAM static size_t lenhist[1001]; #endif @@ -227,6 +217,19 @@ narrow_stringbuf (SCM buf) scm_i_pthread_mutex_t stringbuf_write_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER; +static void +set_stringbuf_shared (SCM buf) +{ + /* Don't modify BUF if it's already marked as shared since it + might be a read-only, statically allocated stringbuf. */ + if (!STRINGBUF_SHARED (buf)) + { + scm_i_pthread_mutex_lock (&stringbuf_write_mutex); + SCM_SET_CELL_WORD_0 (buf, SCM_CELL_WORD_0 (buf) | STRINGBUF_F_SHARED); + scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); + } +} + /* Copy-on-write strings. */ @@ -276,7 +279,7 @@ scm_i_make_string (size_t len, char **charsp, int read_only_p) if (SCM_UNLIKELY (scm_is_false (null_stringbuf))) { null_stringbuf = make_stringbuf (0); - SET_STRINGBUF_SHARED (null_stringbuf); + set_stringbuf_shared (null_stringbuf); } buf = null_stringbuf; } @@ -341,9 +344,7 @@ scm_i_substring (SCM str, size_t start, size_t end) SCM buf; size_t str_start; get_str_buf_start (&str, &buf, &str_start); - scm_i_pthread_mutex_lock (&stringbuf_write_mutex); - SET_STRINGBUF_SHARED (buf); - scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); + set_stringbuf_shared (buf); return scm_double_cell (STRING_TAG, SCM_UNPACK(buf), (scm_t_bits)str_start + start, (scm_t_bits) end - start); @@ -360,9 +361,7 @@ scm_i_substring_read_only (SCM str, size_t start, size_t end) SCM buf; size_t str_start; get_str_buf_start (&str, &buf, &str_start); - scm_i_pthread_mutex_lock (&stringbuf_write_mutex); - SET_STRINGBUF_SHARED (buf); - scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); + set_stringbuf_shared (buf); return scm_double_cell (RO_STRING_TAG, SCM_UNPACK(buf), (scm_t_bits)str_start + start, (scm_t_bits) end - start); @@ -753,9 +752,7 @@ scm_i_make_symbol (SCM name, scm_t_bits flags, if (start == 0 && length == STRINGBUF_LENGTH (buf)) { /* reuse buf. */ - scm_i_pthread_mutex_lock (&stringbuf_write_mutex); - SET_STRINGBUF_SHARED (buf); - scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); + set_stringbuf_shared (buf); } else { @@ -854,9 +851,7 @@ SCM scm_i_symbol_substring (SCM sym, size_t start, size_t end) { SCM buf = SYMBOL_STRINGBUF (sym); - scm_i_pthread_mutex_lock (&stringbuf_write_mutex); - SET_STRINGBUF_SHARED (buf); - scm_i_pthread_mutex_unlock (&stringbuf_write_mutex); + set_stringbuf_shared (buf); return scm_double_cell (RO_STRING_TAG, SCM_UNPACK (buf), (scm_t_bits)start, (scm_t_bits) end - start); } -- 1.7.5.4