summaryrefslogtreecommitdiff
path: root/libguile/strings.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2008-09-17 20:41:41 +0200
committerLudovic Courtès <ludo@gnu.org>2008-09-17 20:41:41 +0200
commit902578f15aaef0ae1eefdde4c822d163fffb58f0 (patch)
tree14775d2837a75701ca575abdef5a2513aced2eaf /libguile/strings.c
parent8b039053b8899c6951e064128292b8086827251a (diff)
downloadguile-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.c14
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;