[#46037] Re: [ruby-core:47138] [ruby-trunk - Bug #6861][Open] ERB::Util.escape_html is not escaping single quotes — Shugo Maeda <shugo@...>

咳さん

12 messages 2012/08/13
[#46038] Re: [ruby-core:47138] [ruby-trunk - Bug #6861][Open] ERB::Util.escape_html is not escaping single quotes — Masatoshi SEKI <m_seki@...> 2012/08/13

=1B$B31$H$$$$$^$9!#=1B(B

[#46051] [ruby-trunk - Feature #6875][Open] Make test/unit default gem — "kou (Kouhei Sutou)" <kou@...>

19 messages 2012/08/15

[#46081] [ruby-trunk - Feature #6936][Assigned] Forbid singleton class and instance variabls for float — "naruse (Yui NARUSE)" <naruse@...>

17 messages 2012/08/26
[#46082] Re: [ruby-trunk - Feature #6936][Assigned] Forbid singleton class and instance variabls for float — SASADA Koichi <ko1@...> 2012/08/27

(2012/08/27 8:12), naruse (Yui NARUSE) wrote:

[ruby-dev:46030] [ruby-trunk - Bug #595] Fiber ignores ensure clause

From: "wanabe (_ wanabe)" <s.wanabe@...>
Date: 2012-08-05 04:05:32 UTC
List: ruby-dev #46030
Issue #595 has been updated by wanabe (_ wanabe).

File ensure_fiber2.patch added

ワナベと申します。

(1) GC で mark と sweep の間に、mark されていない Fiber を対象に
(2) ruby_cleanup 中に、メインスレッドに所属するすべての Fiber を対象に
(3) 子スレッド終了時(vm->living_threads から外されるとき)、所属するすべての Fiber を対象に
の 3 つのタイミングで、throw/catch により ensure 節を実行するパッチを書きました。

[ruby-dev:41035] で遠藤さんがおっしゃっているような「yield 中の Fiber は GC しない」
という手法もやってみたのですが、test/ruby/test_fiber.rb がとても終わりそうにないことや
Fiber のマーク処理の重さや Fiber 自体のメモリ消費量などにより、断念しました。
そのため上記(1)のように、rb_gc_marked_p() という関数が必要になるなど強引な手段を使っています。

また、以下のようにして速度低下を計ってみました。

require "benchmark"
GC.start
Benchmark.bm(4) do |x|
  tms = Benchmark::Tms.new
  10.times do |i|
    tms += x.report("   #{i}:") do
      30000.times do
        Fiber.new{Fiber.yield}.resume
      end
    end
  end
  puts " sum:#{tms}"
end

素の r36623 :2.980000   3.120000   6.100000 (  6.107164)
パッチ適用後:3.580000   3.480000   7.060000 (  7.061093)

と、無視できない程度に(約 14%)速度低下してしまいました。
とはいえこれ以上の方法は思いつかないのですが、いかがでしょうか。
----------------------------------------
Bug #595: Fiber ignores ensure clause
https://bugs.ruby-lang.org/issues/595#change-28655

Author: ko1 (Koichi Sasada)
Status: Assigned
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: 3.0
ruby -v: -


=begin
 Ruby プロセス終了時,Fiber が ensure を無視します.
 これは,前から直そうと思って手がついていなかった問題です.
 10月末までには直そうと思います.結構複雑なので,後回しにしていましました.
 
 fib = Fiber.new{
   begin
     Fiber.yield :ok
   ensure
     puts "should be print out"
   end
 }
 p fib.resume
=end



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next