diff options
author | Ludovic Courtès <ludo@gnu.org> | 2008-09-17 20:41:41 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2008-09-17 20:41:41 +0200 |
commit | 902578f15aaef0ae1eefdde4c822d163fffb58f0 (patch) | |
tree | 14775d2837a75701ca575abdef5a2513aced2eaf /libguile/strings.c | |
parent | 8b039053b8899c6951e064128292b8086827251a (diff) | |
download | guile-902578f15aaef0ae1eefdde4c822d163fffb58f0.tar.gz |
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.
Diffstat (limited to 'libguile/strings.c')
-rw-r--r-- | libguile/strings.c | 14 |
1 files 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; |