[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: [MD:6405] PDUMP_OBJECT_ARRAY_SIZE



藤井です。

From: 小関 吉則 (KOSEKI Yoshinori) <kose@xxxxxxxxxxx>
Subject: [MD:6405] PDUMP_OBJECT_ARRAY_SIZE (Re: re-sync up with Emacs 21.4 and cleanups.)
Date: Tue, 15 Mar 2005 15:06:56 +0900
> >>>>> In [meadow-develop : No.6398] 
> >>>>> “kit” = Shuichi KITAGUCHI wrote:
> kit> 先程Emacs 21.4とのsyncの修正をcommitしました。
> 
> Cygwin/Mingw でダンプに失敗します。

VC 7.1 でも失敗しました。

> src/makefile.meadow.w32-in の PDUMP_OBJECT_ARRAY_SIZE の値を
> 大きくすれば良いようです。
> 
> このサイズってどうやって決めてるのですか?
> 
> 始めっから大きくしてるとどうなりますか?
> 実行時のメモリ確保量が多くなるから小さい方(適量)が良いという
> ようなことはありますか?
> 
> ;;;;; ってのは誰が知ってる?
> ;;;;; XEmacs みたいに2回ダンプするのがいい??

この PDUMP_OBJECT_ARRAY_SIZE ですが、以下のような不具合をまれに発生さ
せるので、固定値を makefile で指定するのは良くないんじゃないかと思います。

	- VC で増量したけど Cygwin では増量し忘れてエラー
	- make all では問題ないけど、make bootstrap ではサイズ不足でエラー

src/alloc.c を見てみたところ、PDUMP_OBJECT_ARRAY_SIZE のサイズを必要最
小限より大きくしても、meadow.dmp のサイズや通常の実行時のメモリサイズ
には悪影響はないと判断しました。そこで、配列のサイズが足りなかったら内
部で増量する仕組を追加するパッチを作りました。

portable dumper の仕組みを良く分かっている訳ではないので、思い違いがあ
るかもしれませんが、宜しければ使ってみてください。

# あと、パッチを作成しているときに気になったのですが、
# pdump_lisp_object に格納されている構造体の index メンバと size メン
# バが初期化されていないように見えました。問題ないのでしょうか?

Index: src/alloc.c
===================================================================
--- src/alloc.c	(revision 3634)
+++ src/alloc.c	(working copy)
@@ -5541,7 +5541,8 @@
 
 typedef struct pdump_type_objects
 {
-  Lisp_Object objects[PDUMP_OBJECT_ARRAY_SIZE];
+  Lisp_Object *objects;
+  int objects_size;
   int index;
   int size;
 } pdump_type_objects;
@@ -5727,7 +5728,13 @@
   pdump_put_hash (obj, pdump_lisp_object[type].size, size);
   pdump_lisp_object[type].size += size;
   pdump_lisp_object[type].objects[pdump_lisp_object[type].index++] = obj;
-  assert (pdump_lisp_object[type].index <= PDUMP_OBJECT_ARRAY_SIZE);
+  if (pdump_lisp_object[type].index > pdump_lisp_object[type].objects_size)
+    {
+      pdump_lisp_object[type].objects_size *= 2;
+      pdump_lisp_object[type].objects =
+	xrealloc (pdump_lisp_object[type].objects, 
+		  sizeof (Lisp_Object) * pdump_lisp_object[type].objects_size);
+    }
 }
 
 /* Register given pointer for pdump_pointers to be dumped */
@@ -6376,6 +6383,14 @@
   bzero (pdump_hash, sizeof (*pdump_hash) * PDUMP_HASH_SIZE);
   pdump_lisp_object = (pdump_type_objects *)
     xmalloc (sizeof (*pdump_lisp_object) * PDUMP_OBJECT_LIMIT);
+  for (i = 0; i < PDUMP_OBJECT_LIMIT; i++)
+    {
+      pdump_lisp_object[i].objects =
+	xmalloc (sizeof (Lisp_Object) * PDUMP_OBJECT_ARRAY_SIZE);
+      pdump_lisp_object[i].index = 0;
+      pdump_lisp_object[i].size = 0;
+      pdump_lisp_object[i].objects_size = PDUMP_OBJECT_ARRAY_SIZE;
+    }
   pdump_pointers = (pdump_forward_pointer *)
     xmalloc (sizeof (*pdump_pointers) * PDUMP_POINTERS_SIZE);
   pdump_subr_doc = (pdump_forward_subr_doc *)
@@ -6524,6 +6539,8 @@
   xfree (pdump_interval_tree);
   xfree (pdump_subr_doc);
   xfree (pdump_pointers);
+  for (i = 0; i < PDUMP_OBJECT_LIMIT; i++)
+    xfree (pdump_lisp_object[i].objects);
   xfree (pdump_lisp_object);
   xfree (pdump_hash);
 
--
藤井 正行 / Masayuki FUJII ( boochang@xxxxxxxxxxxx )