[#43412] [Ruby 1.9 - Feature #4592][Open] Tempfileを直接保存したい — Takeyuki Fujioka <xibbar@...>

15 messages 2011/04/21

[#43453] ThreadGroup の強化案 — Hidetoshi NAGAI <nagai@...>

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

14 messages 2011/04/28
[#43901] ThreadGroup#make_local_space! (Re: ThreadGroup の強化案) — Hidetoshi NAGAI <nagai@...> 2011/06/25

永井@知能.九工大です.少々長いメールで失礼します.

[#43920] Re: ThreadGroup#make_local_space! (Re: ThreadGroup の強化案) — Urabe Shyouhei <shyouhei@...> 2011/06/26

ひっじょうに根本的な質問をするのですけれども、ThreadGroupって何に使うん

[#43978] Re: ThreadGroup#make_local_space! — Hidetoshi NAGAI <nagai@...> 2011/06/28

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

[ruby-dev:43461] [Ruby 1.9 - Bug #4636][Closed] thread.c#do_select() が HAVE_RB_FD_INIT のケースを正しくハンドリングしていない

From: Motohiro KOSAKI <kosaki.motohiro@...>
Date: 2011-04-30 14:23:24 UTC
List: ruby-dev #43461
Issue #4636 has been updated by Motohiro KOSAKI.

Status changed from Open to Closed

r31394-r31397 のコミットで直ってるはずです
----------------------------------------
Bug #4636: thread.c#do_select() が HAVE_RB_FD_INIT のケースを正しくハンドリングしていない
http://redmine.ruby-lang.org/issues/4636

Author: Motohiro KOSAKI
Status: Closed
Priority: Low
Assignee: Motohiro KOSAKI
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3dev (2011-04-30 trunk 31387) [x86_64-linux]


=begin
えっと。気づいたので起票しておきます

do_select()に

    fd_set UNINITIALIZED_VAR(orig_read);
   ....
    if (read) orig_read = *read;

なんて行がありますが、これはあからさまに間違っていて、たとえば最近のBSDだと
http://netbsd.gw.com/cgi-bin/man-cgi?select++NetBSD-4.0

                  fd_set *fdsr;
                   int max = fd;

                   fdsr = (fd_set *)calloc(howmany(max+1, NFDBITS),
                       sizeof(fd_mask));
                   if (fdsr == NULL) {
                           ...
                           return (-1);
                   }
                   FD_SET(fd, fdsr);
                   n = select(max+1, fdsr, NULL, NULL, &tv);
                   ...
                   free(fdsr);

みたいに、動的にallocateしているので実際の配列長はfd_setの定義よりも大きいことはよくあります。なので、fd_setは*でdereferenceしちゃダメです。たぶんいままで踏まなかったのは NFILE limitを
あげてテストする人が少ないんでしょう。

対策としては、thread.c で fd_set* 引数とってるところを全部 rb_fd_set_t* に
差し替えて rb_fd_copy() でコピーするようにしたらいいんじゃないでしょうか

このバグは以下のコミットで混入したようです。

 commit ae317b518c4dcbcbf0ed02bb9e6cd7513f0a34fe
 Author: ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
 Date:   Thu Feb 8 11:51:40 2007 +0000

    * thread.c: change GVL_UNLOCK_RANGE() arguments
      (adding ubf as 2nd argument).
    * thread.c: fix to use polling in select on cygwin and mswin32.
   (snip)

=end



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

In This Thread

Prev Next