[#24536] 「Rubyの落し方」 v.s. ruby_1_8 — akira yamada / やまだあきら <akira@...>

<URL:http://jp.rubyist.net/magazine/?0002-RubyCore>

40 messages 2004/10/20
[#24541] Re: 「Rubyの落し方」 v.s. ruby_1_8 — Yukihiro Matsumoto <matz@...> 2004/10/20

まつもと ゆきひろです

[#24599] 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/26

2004-10-20 (水) の 21:38 +0900 に Yukihiro Matsumoto さんは書きました:

[#24605] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-26 (火) の 16:16 +0900 に akira yamada / やまだあきら さんは書きました:

[#24606] Re: 1.8.2 preview3? — Yukihiro Matsumoto <matz@...> 2004/10/27

まつもと ゆきひろです

[#24608] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 11:48 +0900 に Yukihiro Matsumoto さんは書きました:

[#24620] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 12:42 +0900 に akira yamada / やまだあきら さんは書きました:

[#24629] Re: 1.8.2 preview3? — Tanaka Akira <akr@...17n.org> 2004/10/29

In article <1098888819.9446.14.camel@rice.p.arika.org>,

[ruby-dev:24552] temporarily frozen string causes core dump

From: nobu@...
Date: 2004-10-20 23:33:18 UTC
List: ruby-dev #24552
なかだです。

At Tue, 19 Oct 2004 19:24:42 +0900,
matz wrote in [ruby-cvs:12926]:
>   Log:
>     * io.c (read_all): block string buffer modification during
>       rb_io_fread() by freezing it temporarily. [ruby-dev:24479]

一度freezeしたStringを戻すのはやはり問題がありそうです。具体的
には、次のようにすると core を吐きます。

  $ ./ruby -e '
  SIZE = (1024 * 1024)
  r, w = IO.pipe
  t = nil
  b = "a" * SIZE
  Thread.new {
    Thread.pass
    t = b[-100..-1]
    w.close
  }
  r.read(4096, b)	# 4096 -> nil でも
  p t
  '
  -e:12: [BUG] Segmentation fault
  ruby 1.9.0 (2004-10-21) [i686-linux]

  アボートしました (core dumped)

ということで、今考えているのが

    buf = rb_str_new4(str);
    RBASIC(buf)->klass = 0;
    rb_str_shared_replace(str, Qnil);
    /* 読み込み */
    rb_str_shared_replace(str, buf);

という方法なんですが、できれば前半を一度にしてくれる関数がほし
いものの、名前が…。

あと、[ruby-dev:24441]でも触れた通り、内部のポインタが変わって
しまってはまずいけれどstr自体は変更しない場合、bufが消されてし
まう可能性もあるので、StringValue()のようなマクロのほうがいいの
かも知れません。

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next