[#38563] [Bug #1556] irb does not save history from 1.8.7-p83 and later — Nobuhiro IMAI <redmine@...>

Bug #1556: irb does not save history from 1.8.7-p83 and later

11 messages 2009/06/02

[#38571] [Bug #1582] IO.new Raises Other Errors between 1.8 and 1.9 — "ujihisa ." <redmine@...>

Bug #1582: IO.new Raises Other Errors between 1.8 and 1.9

15 messages 2009/06/05

[#38607] [Feature: trunk] GC.stat — SASADA Koichi <ko1@...>

 ささだです.

21 messages 2009/06/14

[#38608] Fixnum#fdiv — Tadayoshi Funaba <tadf@...>

Bignum#fdiv には大きな数である場合の配慮があるようですが、Fixnum ではな

23 messages 2009/06/14
[#38636] Re: Fixnum#fdiv — Tadayoshi Funaba <tadf@...> 2009/06/15

fdiv では2つの異る解釈が混在しているように見えます。

[#38638] Re: Fixnum#fdiv — Yukihiro Matsumoto <matz@...> 2009/06/15

まつもと ゆきひろです

[#38639] Re: Fixnum#fdiv — Tadayoshi Funaba <tadf@...> 2009/06/15

> えーと、設計者は「fdivは結果がfloatになるdiv」くらいしか考え

[#38640] Re: Fixnum#fdiv — Yukihiro Matsumoto <matz@...> 2009/06/15

まつもと ゆきひろです

[#38641] Re: Fixnum#fdiv — Tadayoshi Funaba <tadf@...> 2009/06/15

> ふむ。「中途半端」というのはfixnumとbignumで食い違うと言う意

[#38657] Re: Fixnum#fdiv — Tadayoshi Funaba <tadf@...> 2009/06/16

> > ふむ。「中途半端」というのはfixnumとbignumで食い違うと言う意

[#38659] Re: Fixnum#fdiv — Yukihiro Matsumoto <matz@...> 2009/06/16

まつもと ゆきひろです

[#38660] Re: Fixnum#fdiv — Tadayoshi Funaba <tadf@...> 2009/06/16

> 私が気にしているのは「挙動の理解しやすさ」ですね。

[#38701] [Bug #1676] only last "return" is traced by set_trace_func — _ wanabe <redmine@...>

Bug #1676: only last "return" is traced by set_trace_func

10 messages 2009/06/22

[ruby-dev:38562] Re: [Bug #595] Fiber ignores ensure clause

From: wanabe <s.wanabe@...>
Date: 2009-06-02 11:41:02 UTC
List: ruby-dev #38562
ワナベと申します。

かなり前のチケットですが、題名の件についてパッチを書きました。
もしまだどなたもパッチを書かれていないようならご検討ください。

Index: thread.c
===================================================================
--- thread.c	(リビジョン 23617)
+++ thread.c	(作業コピー)
@@ -293,6 +293,8 @@

 static void rb_mutex_unlock_all(mutex_t *mutex, rb_thread_t *th);

+void rb_fiber_terminate_all(rb_thread_t *th);
+
 void
 rb_thread_terminate_all(void)
 {
@@ -310,6 +312,7 @@

     thread_debug("rb_thread_terminate_all (main thread: %p)\n", (void *)th);
     st_foreach(vm->living_threads, terminate_i, (st_data_t)th);
+    rb_fiber_terminate_all(th);

     while (!rb_thread_alone()) {
 	PUSH_TAG();
@@ -1210,6 +1213,7 @@
 	    thread_debug("rb_thread_execute_interrupts: %ld\n", err);

 	    if (err == eKillSignal || err == eTerminateSignal) {
+		rb_fiber_terminate_all(th);
 		th->errinfo = INT2FIX(TAG_FATAL);
 		TH_JUMP_TAG(th, TAG_FATAL);
 	    }
Index: cont.c
===================================================================
--- cont.c	(リビジョン 23617)
+++ cont.c	(作業コピー)
@@ -534,6 +534,7 @@
       case 0:
 	return Qnil;
       case 1:
+      case -1:
 	return argv[0];
       default:
 	return rb_ary_new4(argc, argv);
@@ -946,6 +947,36 @@
     return fib->status != TERMINATED ? Qtrue : Qfalse;
 }

+static VALUE
+terminate_all_i(VALUE fibval)
+{
+    if (rb_fiber_alive_p(fibval)) {
+	VALUE value = rb_exc_new2(rb_eSystemExit, "terminate");
+	return fiber_switch(fibval, -1, &value, 0);
+    }
+}
+
+void
+rb_fiber_terminate_all(rb_thread_t *th)
+{
+    VALUE fibval;
+    rb_fiber_t *fib, *root_fib;
+    rb_thread_t *_th = GET_THREAD();
+
+    rb_thread_set_current(th);
+    fibval = th->root_fiber;
+    if (!RTEST(fibval)) return;
+    GetFiberPtr(fibval, root_fib);
+
+    fib = root_fib->prev_fiber;
+    while (fib != root_fib) {
+	rb_rescue2(terminate_all_i, fib->cont.self,
+		   0, 0, rb_eSystemExit);
+	fib = fib->prev_fiber;
+    }
+    rb_thread_set_current(_th);
+}
+
 /*
  *  call-seq:
  *     fiber.resume(args, ...) -> obj


-- 
ワナベ

In This Thread