この変更は、realloc でも GC.stress による GC を発生させようとしています
が、それ以上に、malloc_increase による GC を realloc でも起こしてしまう
ので、これまで realloc では GC は(滅多に)起らない、という前提を壊して
いるので、手元で、あとは rubyci のほうでもマーク漏れが入っているようです。

http://rbci.lakewood.privs.net/ruby-trunk/log/20140421T221002Z.fail.html.gz

滅多に、ということなので、ごくまれには起っていたわけですが、レアすぎたと。

で、これの対処ですが、

(1) 互換性(?)を守るためにリバート
(2) 互換性を切って、適切に mark するように全部書き換える

という選択肢がありますが、これはどうしたもんでしょうね。既存の拡張ライブ
ラリを考えると、絶望してしまうので、(1) に振りたいものですが。

少なくとも core だけは、realloc GC safe に書き換えるのは賛成です。が、と
りあえず今は revert かなぁ。

方針としては、

(a) パッチをちゃんと「GC.stress の影響を realloc でも発生させる」
  という変更に限定する
(b) この変更を用いて、core をちゃんと realloc GC safe に修正する

というのがいいと思いますが、どうでしょうか。

(b) を考えると、realloc の時だけ毎回 GC 発生、が良いのか?


-------- Original Message --------
Subject: [ruby-changes:33572] nobu:r45653 (trunk): gc.c: GC.stress after
realloc
Date: Tue, 22 Apr 2014 06:53:57 +0900 (JST)
From: nobu <ko1 / atdot.net>
Reply-To: ruby-changes / quickml.atdot.net
To: ruby-changes / quickml.atdot.net

nobu	2014-04-22 06:53:48 +0900 (Tue, 22 Apr 2014)

  New Revision: 45653

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=45653

  Log:
    gc.c: GC.stress after realloc

    * gc.c (objspace_malloc_increase): run GC after realloc not only
      malloc and calloc by GC.stress.  [ruby-core:62103] [Feature #9761]

  Modified files:
    trunk/ChangeLog
    trunk/gc.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 45652)
+++ ChangeLog	(revision 45653)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Apr 22 06:53:30 2014  Nobuyoshi Nakada  <nobu / ruby-lang.org>
+
+	* gc.c (objspace_malloc_increase): run GC after realloc not only
+	  malloc and calloc by GC.stress.  [ruby-core:62103] [Feature #9761]
+
 Mon Apr 21 19:12:20 2014  NARUSE, Yui  <naruse / ruby-lang.org>

 	* string.c (rb_str_coderange_scan_restartable): coderange is always
Index: gc.c
===================================================================
--- gc.c	(revision 45652)
+++ gc.c	(revision 45653)
@@ -6092,7 +6092,7 @@ objspace_malloc_increase(rb_objspace_t *
https://github.com/ruby/ruby/blob/trunk/gc.c#L6092
 #endif
     }

-    if (type == MEMOP_TYPE_MALLOC) {
+    if (type == MEMOP_TYPE_MALLOC || type == MEMOP_TYPE_REALLOC) {
 	if (ruby_gc_stress && !ruby_disable_gc_stress && ruby_native_thread_p()) {
 	    garbage_collect_with_gvl(objspace, FALSE, TRUE, GPR_FLAG_MALLOC);
 	}

--
ML: ruby-changes / quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml/