From: "wanabe (_ wanabe)" <s.wanabe@gmail•com>
To: ruby-dev@ruby-lang.org (ruby developers list)
Subject: [ruby-dev:46030] [ruby-trunk - Bug #595] Fiber ignores ensure clause
Date: Sun, 5 Aug 2012 13:05:32 +0900 [thread overview]
Message-ID: <redmine.journal-28655.20120805130529@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-595.20080924192809@ruby-lang.org
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/
next prev parent reply other threads:[~2012-08-05 4:08 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <redmine.issue-595.20080924192809@ruby-lang.org>
2011-06-11 5:52 ` [ruby-dev:43715] [Ruby 1.9 - Bug #595] Fiber ignores ensure clause Koichi Sasada
2011-06-11 13:14 ` [ruby-dev:43744] " Yukihiro Matsumoto
2011-06-11 13:23 ` [ruby-dev:43745] " Yui NARUSE
2011-06-26 14:24 ` [ruby-dev:43951] " Hiroshi Nakamura
2012-03-13 6:06 ` [ruby-dev:45354] [ruby-trunk - Bug #595][Assigned] " Yui NARUSE
2012-07-25 10:08 ` [ruby-dev:46005] [ruby-trunk - Bug #595] " ko1 (Koichi Sasada)
2012-07-25 13:24 ` [ruby-dev:46006] " naruse (Yui NARUSE)
2012-08-05 4:05 ` wanabe (_ wanabe) [this message]
2012-08-05 10:18 ` [ruby-dev:46031] " KOSAKI Motohiro
2012-08-20 8:56 ` [ruby-dev:46060] " SASADA Koichi
2014-01-13 10:59 ` [ruby-dev:47883] " Yura, Sokolov
2015-10-12 13:16 ` [ruby-dev:49299] [Ruby trunk " eregontp
2017-01-31 7:22 ` [ruby-dev:49967] [Ruby trunk Bug#595] " ko1
2018-11-22 0:38 ` [ruby-dev:50675] " samuel
2018-12-20 1:15 ` [ruby-dev:50722] " samuel
2018-12-20 4:19 ` [ruby-dev:50723] " samuel
2019-01-14 7:32 ` [ruby-dev:50763] " naruse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.ruby-lang.org/en/community/mailing-lists/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=redmine.journal-28655.20120805130529@ruby-lang.org \
--to=ruby-dev@ruby-lang.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).