まつもと ゆきひろです
In message "[ruby-list:9083] GC touches an array which is failed to be allocated."
on 98/08/12, SHUDOH Kazuyuki <shudoh / muraoka.info.waseda.ac.jp> writes:
|首藤です。
|手元の ruby を 1.1c1 から 1.1c2 にしたところ、
|多量の配列を扱うスクリプトが
| `[BUG] Segmentation fault'
|と動かなくなりました。
バグがありました.
|xmalloc() 中で malloc() に失敗すると、gc_gc() と GC を起動するようです。
|このごみ集めの最中に、GC が作りかけの配列オブジェクトを触ります。
|gc.c l.508 gc_mark(*ptr++) と、作りかけの配列の要素を mark しようとして、
|SIGSEGV が発生します。
的確なレポート感謝します.パッチを付けておきます.
|自分の好きにできる、自分好みな言語をお持ちのまつもとさん、
|心底うらやましいです。
でしょぉ? 首藤さんも作りませんか?
# 私の場合,10年以上掛かりましたけど.
--- array.c 1998/07/29 09:50:23 1.1.1.2.2.28
+++ array.c 1998/08/13 05:59:18
@@ -169,2 +169,3 @@
{
+ int len = 0;
VALUE size, val;
@@ -188,6 +189,7 @@
ary->capa = capa;
- ary->len = capa;
+ len = capa;
}
ary->ptr = ALLOC_N(VALUE, ary->capa);
- memfill(ary->ptr, ary->len, val);
+ memfill(ary->ptr, len, val);
+ ary->len = len;
obj_call_init((VALUE)ary);