Queue/SizedQueue 絡みでもう一つ。

 Thread.critical = false の直後の t.run if t ですが、その行間で
t が終了した場合、死んだスレッドを run しようとして ThreadError に
なってしまいます。begin 〜 rescue ThreadError; end で括る必要が
あるのではないでしょうか。

 咳さんによって [ruby-dev:9445], [ruby-dev:9460] の指摘があり、
一度は直ったみたいですが、再度 t.run if t を追加したことで再び
エンバグしてしまったようです。

 CVS によれば 2000/5/1 にその変更があったみたいですが、 ChangeLog
には言及がないようです。この t.run の意図って何でしたっけ?



 ruby_1_6 用のパッチを付けます。(他のスレッドで出た修正も込み..)

-- 
                     /
                    /__  __            Akinori.org / MUSHA.org
                   / )  )  ) )  /     FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ /  ( (__(  @ iDaemons.org / and.or.jp

"Freeze this moment a little bit longer, make each impression
  a little bit stronger..  Experience slips away -- Time stand still"

Index: lib/thread.rb
===================================================================
RCS file: /src/ruby/lib/thread.rb,v
retrieving revision 1.9.2.1
diff -u -r1.9.2.1 thread.rb
--- lib/thread.rb	2001/03/14 04:45:46	1.9.2.1
+++ lib/thread.rb	2001/05/14 17:18:23
@@ -74,7 +74,10 @@
       retry
     end
     Thread.critical = false
-    t.run if t
+    begin
+      t.run if t
+    rescue ThreadError
+    end
     self
   end
 
@@ -160,7 +163,10 @@
     ensure
       Thread.critical = false
     end
-    t.run if t
+    begin
+      t.run if t
+    rescue ThreadError
+    end
   end
   def enq(obj)
     push(obj)
@@ -170,7 +176,7 @@
     Thread.critical = true
     begin
       loop do
-	if @que.length == 0
+	if @que.empty?
 	  if non_block
 	    raise ThreadError, "queue empty"
 	  end
@@ -190,7 +196,7 @@
   alias deq shift
 
   def empty?
-    @que.length == 0
+    @que.empty?
   end
 
   def clear
@@ -223,7 +229,7 @@
 
   def max=(max)
     Thread.critical = true
-    if max >= @max
+    if max <= @max
       @max = max
       Thread.critical = false
     else
@@ -253,6 +259,7 @@
   end
 
   def pop(*args)
+    ret = super
     Thread.critical = true
     if @que.length < @max
       begin
@@ -263,9 +270,12 @@
       ensure
 	Thread.critical = false
       end
-      t.run if t
+      begin
+	t.run if t
+      rescue ThreadError
+      end
     end
-    super
+    ret
   end
 
   def num_waiting