[#26664] refactoring tcltklib.c (deleted ip check) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

22 messages 2005/08/01
[#26665] Re: refactoring tcltklib.c (deleted ip check) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/01

山本です。

[#26668] Re: refactoring tcltklib.c (deleted ip check) — Hidetoshi NAGAI <nagai@...> 2005/08/01

永井@知能.九工大です.

[#26678] Re: refactoring tcltklib.c (deleted ip check) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/01

山本です。

[#26684] Re: refactoring tcltklib.c (deleted ip check) — Hidetoshi NAGAI <nagai@...> 2005/08/01

永井@知能.九工大です.

[#26686] Re: refactoring tcltklib.c (deleted ip check) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/01

山本です。

[#26817] test/socket/test_tcp.rb freeze on windows — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

12 messages 2005/08/18

[#26829] cannot check EOF of pipe on windows — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

19 messages 2005/08/19
[#26830] Re: cannot check EOF of pipe on windows — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/19

山本です。

[#26831] Re: cannot check EOF of pipe on windows — "U.Nakamura" <usa@...> 2005/08/19

こんにちは、なかむら(う)です。

[#26832] Re: cannot check EOF of pipe on windows — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/19

山本です。

[#26836] Re: cannot check EOF of pipe on windows — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/08/19

なかだです。

[#26872] irb -I/ruby -Iと$LOAD_PATH — akira yamada / やまだあきら <akira@...>

Debianユーザからruby -Iとirb -Iで

17 messages 2005/08/24
[#26873] Re: irb -I/ruby -Iと$LOAD_PATH — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/08/24

なかだです。

[#26875] Re: irb -I/ruby -Iと$LOAD_PATH — akira yamada / やまだあきら <akira@...> 2005/08/24

nobuyoshi nakada wrote:

[#26885] Re: irb -I/ruby -Iと$LOAD_PATH — keiju@... (石塚圭樹) 2005/08/26

けいじゅ@いしつかです.

[#26897] fail on make install — KIMURA Koichi <kimura.koichi@...>

木村です。

28 messages 2005/08/29
[#26898] Re: fail on make install — "U.Nakamura" <usa@...> 2005/08/29

こんにちは、なかむら(う)です。

[#26903] Re: fail on make install — KIMURA Koichi <kbk@...> 2005/08/29

木村です。

[#26922] Re: fail on make install — KIMURA Koichi <kimura.koichi@...> 2005/08/30

木村です。

[#26926] Re: fail on make install — KIMURA Koichi <kimura.koichi@...> 2005/08/31

木村です。

[#26927] Re: fail on make install — "U.Nakamura" <usa@...> 2005/08/31

こんにちは、なかむら(う)です。

[#26928] Re: fail on make install — KIMURA Koichi <kimura.koichi@...> 2005/08/31

木村です。

[#26929] Re: fail on make install — "U.Nakamura" <usa@...> 2005/08/31

こんにちは、なかむら(う)です。

[#26930] Re: fail on make install — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/08/31

なかだです。

[#26931] Re: fail on make install — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/31

山本です。

[#26933] Re: fail on make install — nobu@... 2005/08/31

なかだです。

[#26938] Re: fail on make install — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/09/01

なかだです。

[#26939] Re: fail on make install — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/09/01

山本です。

[#26900] multiplying empty string — nobuyoshi nakada <nobuyoshi.nakada@...>

19 messages 2005/08/29
[#26904] Re: multiplying empty string — Yukihiro Matsumoto <matz@...> 2005/08/29

まつもと ゆきひろです

[#26907] Re: multiplying empty string — Tanaka Akira <akr@...17n.org> 2005/08/29

In article <1125327516.070646.12845.nullmailer@x31.priv.netlab.jp>,

[#26909] Re: multiplying empty string — Yukihiro Matsumoto <matz@...> 2005/08/29

まつもと ゆきひろです

[ruby-dev:26733] Re: [ruby-cvs] ruby/ext/socket, ruby, ruby: * ext/socket/socket.c (ruby_connect): break immediately if a

From: Tanaka Akira <akr@...17n.org>
Date: 2005-08-03 12:25:04 UTC
List: ruby-dev #26733
In article <1123025557.870442.14225.nullmailer@x31.priv.netlab.jp>,
  Yukihiro Matsumoto <matz@ruby-lang.org> writes:

> |なお、蛇足ですが、Ruby の read でも nonblocking なときにはイベントルー
> |プに戻る前にまず read するようにすれば、マルチスレッドでも
> |Linux 2.6 の /proc/loadavg を (nonblocking にすれば) 読めるようになっ
> |ていいんじゃないかと思います。
>
> これは毎回rb_thread_wait_fd()の中でfcntl(fd, F_GETFL, 0)して
> チェックするということですかね。コストが問題でなければ
> nonblockingであればすぐ返るだけなのですが。

read は EAGAIN で繰り返し呼ばれるますが、select しないでいいのは最初の
read だけです。従って、READ_CHECK が適切なんじゃないかと思っています。

rb_thread_wait_fd でそうすると、errno が EAGAIN のときに
rb_io_wait_readable が即座に return するようになります。そうすると、

      retry:
        TRAP_BEG;
        r = read(fptr->fd, fptr->rbuf, fptr->rbuf_capa);
        TRAP_END;
        if (r < 0) {
            if (rb_io_wait_readable(fptr->fd))
                goto retry;
            rb_sys_fail(fptr->path);
        }

のようなコードが busy wait になります。つまり、EAGAIN を受け取った後に
は nonblocking だろうが (というか、nonblocking だからこそ) select で待
たなければいけません。

そういえば、失敗すると busy wait になりがちで迷惑だ、というのも
nonblocking な挙動を普通のメソッドにとらせたくない理由のひとつですね。
数多くある nonblocking がまきちらす不幸のひとつというか。

あと、コストは迷うところです。毎回やるかフラグを保持するかですが、
nonblocking かどうかというのは他のプロセスと共有されるかもしれないとい
うのが問題です。不用意に read してプロセス全体がブロックするのは危険だか
らせめて read 直前に読んで critical section を短くしようと考えるか、ど
うせ毎回読んでも race condition は残るからフラグにすると考えるか、悩み
どころです。

あと、今気がついたんですが、/proc/loadavg は普通のファイル (S_ISREG が
真になるファイル) なんですね。

% ruby -e 'open("/proc/loadavg") {|f| p f.stat.file?}'     
true

とすると、nonblocking かどうかではなく、普通のファイルだったら select
しないという判断もできますね。普通のファイルは select すると常に
readable になると決まっているので。nonblocking と違ってこっちは変化し
ないので、こっちをフラグで保持するのがいいのかなぁ。

まぁ、/proc みたいに怪しげなものに対してどこまでその性質が期待できるか
は謎で、select を使って read のブロックを防げる例が発見されることもあ
りえなくはないと思いますが。
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next