[#24112] ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。原因を追求してたのですが、力尽きました。

19 messages 2004/08/18
[#24127] Re: ruby/tk crashes on bcc32 — Hidetoshi NAGAI <nagai@...> 2004/08/19

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

[#24131] Re: ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/08/19

山本です。

[#24135] Re: ruby/tk crashes on bcc32 — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/08/19

山本です。試行錯誤の結果、これで落ちなくなりました。

[ruby-dev:24151] Re: ruby/tk crashes on bcc32

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2004-08-21 03:53:27 UTC
List: ruby-dev #24151
山本です。

今のままだと、xmalloc + xfree 以外でも、グローバルな状態を持つ
関数全般で問題があると思います。

例えば、bcc32 では、FILE*、ファイルディスクリプタ、OSハンドルを
グローバル配列で管理しているので、

// a.rb

require "Test"

open("a.txt", "r") {|io|
	p io.read(100)
}

open("a.txt", "r") {|io|
	p Test.read(io)
}

// a.txt (CR+LF)
hoge
hoge

// Test.c

#include <ruby.h>
#include <rubyio.h>

static VALUE
test_s_read(VALUE self, VALUE io)
{
    OpenFile *fptr;
    long len;
    char buf[100];

    GetOpenFile(io, fptr);
    len = fread(buf, 1, sizeof(buf), fptr->f);
    return rb_str_new(buf, len);
}

void
Init_Test()
{
    VALUE rb_cTest = rb_define_class("Test", rb_cObject);
    rb_define_singleton_method(rb_cTest, "read", test_s_read, 1);
}

// extconf.rb

require "mkmf"
create_makefile("Test")

//////////////////
// テスト

E:\ruby-dev>ruby extconf.rb
creating Makefile

E:\ruby-dev>make
MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
        bcc32 -q -O -6 -w- -I. -Ie:/ruby/lib/ruby/1.8/i386-bccwin32 -Ie:/ruby/li
b/ruby/1.8/i386-bccwin32 -I. -I. -I./ -I./missing -c Test.c
Test.c:
        ilink32 -q -Gn -Tpd c0d32.obj -L"e:/ruby/lib" Test.obj Test.obj, Test.so
, nul, bccwin32-ruby18.lib cw32.lib import32.lib ws2_32.lib , Test-i386-bccwin32
.def,

E:\ruby-dev>ruby a.rb
"hoge\nhoge\n"
""

といったものでも、EBADFで失敗して空文字になってしまいます。(拡張ライブラリ側の
OSハンドル配列に fptr->f に対応するハンドルが登録されていないため)

日頃 bccwin32 を問題なく使えていたのは、io/wait などがインストールされなかったり、
socket 関数などが win32/win32.c で置き換えられていたりで色々顕在化しなかったための
ようです。

もしかしたら不可能なのかもしれませんが、とりあえずbcc32のRTLダイナミックリンク化に
取り組んでみます。


In This Thread