From 902578f15aaef0ae1eefdde4c822d163fffb58f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Wed, 17 Sep 2008 20:41:41 +0200 Subject: [PATCH] Remove use of `scm_i_thread_put_to_sleep ()' in the string code. * libguile/strings.c (scm_i_string_writable_chars): Remove use of `scm_i_thread_put_to_sleep ()'. This leaves a race condition, which is hopefully not harmful. --- libguile/strings.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/libguile/strings.c b/libguile/strings.c index 87ced8f21..69e2cc481 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -325,8 +325,7 @@ scm_i_string_writable_chars (SCM orig_str) scm_i_pthread_mutex_lock (&stringbuf_write_mutex); if (STRINGBUF_SHARED (buf)) { - /* Clone stringbuf. For this, we put all threads to sleep. - */ + /* Clone stringbuf. */ size_t len = STRING_LENGTH (str); SCM new_buf; @@ -337,11 +336,16 @@ scm_i_string_writable_chars (SCM orig_str) memcpy (STRINGBUF_CHARS (new_buf), STRINGBUF_CHARS (buf) + STRING_START (str), len); - scm_i_thread_put_to_sleep (); - SET_STRING_STRINGBUF (str, new_buf); start -= STRING_START (str); + + /* FIXME: The following operations are not atomic, so other threads + looking at STR may see an inconsistent state. Nevertheless it can't + hurt much since (i) accessing STR while it is being mutated can't + yield a crash, and (ii) concurrent accesses to STR should be + protected by a mutex at the application level. The latter may not + apply when STR != ORIG_STR, though. */ SET_STRING_START (str, 0); - scm_i_thread_wake_up (); + SET_STRING_STRINGBUF (str, new_buf); buf = new_buf;