[#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:24150] Re: ruby/tk crashes on bcc32

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

>GCではなくて、ランタイムのヒープ管理用内部領域の話です。実装に
>もよるでしょうが、それぞれのヒープから割り当てた領域は元のヒー
>プに返さないとまずいことになりそうな気がします。

恥ずかしながら、ようやく理解できました。

  static RTL

  -----ruby 本体-----       - 拡張ライブラリ --
  |                 |       |                 |   
  | メモリブロック1 |       | メモリブロック2 |
  | フラグ1         |       | フラグ2         |
  |       ↑        |       |       ↑        |
  |  malloc() { }   |→↓   |  malloc() { }   |
  |  free()   { }   |  ↓→ |  free()   { }   |
  |                 |       |                 |
  -------------------       -------------------
          メモリブロック・フラグの破壊

  dynamic RTL

               ----- RTL dll -----
               |                 |
               | メモリブロック  |
               | フラグ          |
               |       ↑        |
               |  malloc() { }   |
               |  free()   { }   |
               |                 |
               -------------------

  -----ruby 本体-----       - 拡張ライブラリ --
  |                 |       |                 |   
  |  malloc() { }   |→↓   |  malloc() { }   |
  |  free()   { }   |  ↓→ |  free()   { }   |
  |                 |       |                 |
  -------------------       -------------------
             単に RTL dll の関数を呼んでる
             だけなので、管理領域は共通

仰る通り、gc.c に void ruby_xfree2(void* p) { if(p) free(p); } を実装
して、tcltklib で #define free(p) ruby_xfree2(p) としても落ちませんでした。

bcc32は、RTLが静的リンクでかつ、拡張ライブラリが動的リンクなのが
問題で、本当は双方が一致しているべきなのでしょうか?(というか、bcc32以外は
双方が一致している?)

一応 bcc32 にも dynamic RTL はあるので、これを使って ruby を
ビルドできるといいんですけど、やり方がわかりませんでした (--;


In This Thread