まつもと ゆきひろです

In message "[ruby-list:6735] Mutex/ConditionVariable/Queue"
    on 98/02/25, Shugo Maeda <shugo / po.aianet.ne.jp> writes:

|前田です。

|  def pop(noblock = false)
|    @que_mutex.synchronize {
|      if @que.length == 0 and noblock
|	raise ThreadError, "queue empty"
|      end
|      while @que.length == 0
|	@que_cond.wait(@que_mutex)
|      end
|      return @que.shift
|    }
|  end
|
|とするとreturnのところでブロックするようなのですが、これは
|どうしてでしょうか。

バグです.returnで泥臭いことをやってるので見落としがありまし
た.パッチも付けておきます.行番号がずれてますが,気にしない
で下さい.

diff -u -1 -r1.1.1.2.2.13 eval.c
--- eval.c	1998/02/23 05:36:36	1.1.1.2.2.13
+++ eval.c	1998/02/25 05:15:06
@@ -1697,3 +1701,8 @@
 	POP_TAG();
-	rb_eval(self, node->nd_ensr);
+	if (node->nd_ensr) {
+	    VALUE retval = prot_tag->retval; /* save retval */
+
+	    rb_eval(self, node->nd_ensr);
+	    return_value(retval);
+	}
 	if (state) {