Hi,

In message "Re: TkText freezes"
    on 03/12/25, ts <decoux / moulon.inra.fr> writes:

| I'm probably wrong, but I don't think it's related to pthread.
|
| The example given can crash with svg and Tk/Tcl is not compiled with
| pthread 

We have two problems, one that crash, and the other that block.  The
former is not related at all with pthread.  It's a bug in Ruby.
I think it's fixed by the following patch.  The bug I'm suspecting to
be LinuxThread bug is the latter.

							matz.
diff -p -u -1 -r1.182 string.c
--- string.c	30 Nov 2003 00:35:28 -0000	1.182
+++ string.c	25 Dec 2003 08:24:39 -0000
@@ -1277,4 +1581,4 @@ rb_str_aref_m(argc, argv, str)
 
-void
-rb_str_update(str, beg, len, val)
+static void
+rb_str_splice(str, beg, len, val)
     VALUE str;
@@ -1322,2 +1626,12 @@ rb_str_update(str, beg, len, val)
 
+void
+rb_str_update(str, beg, len, val)
+    VALUE str;
+    long beg, len;
+    VALUE val;
+{
+    rb_str_modify(str);
+    return rb_str_splice(str, beg, len, val);
+}
+
 static void
@@ -1353,3 +1667,3 @@ rb_str_subpat_set(str, re, nth, val)
     rb_str_modify(str);
-    rb_str_update(str, start, len, val);
+    rb_str_splice(str, start, len, val);
 }
@@ -1384,3 +1698,3 @@ rb_str_aset(str, indx, val)
 	else {
-	    rb_str_update(str, idx, 1, val);
+	    rb_str_splice(str, idx, 1, val);
 	}
@@ -1397,3 +1711,3 @@ rb_str_aset(str, indx, val)
 	}
-	rb_str_update(str, beg, RSTRING(indx)->len, val);
+	rb_str_splice(str, beg, RSTRING(indx)->len, val);
 	return val;
@@ -1405,3 +1719,3 @@ rb_str_aset(str, indx, val)
 	    if (rb_range_beg_len(indx, &beg, &len, RSTRING(str)->len, 2)) {
-		rb_str_update(str, beg, len, val);
+		rb_str_splice(str, beg, len, val);
 		return val;
@@ -1426,3 +1765,3 @@ rb_str_aset_m(argc, argv, str)
 	else {
-	    rb_str_update(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
+	    rb_str_splice(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]);
 	}
@@ -1449,3 +1805,3 @@ rb_str_insert(str, idx, str2)
     }
-    rb_str_update(str, pos, 0, str2);
+    rb_str_splice(str, pos, 0, str2);
     return str;