[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
Re: [MD:6405] PDUMP_OBJECT_ARRAY_SIZE
- X-ml-count: 6407
- Subject: Re: [MD:6405] PDUMP_OBJECT_ARRAY_SIZE
- From: "M.Fujii" <boochang@xxxxxxxxxxxx>
- Date: Tue, 15 Mar 2005 23:13:50 +0900 (JST)
- X-mailer: Mew version 4.1 on Emacs 21.4 / Mule 5.0 (SAKAKI)
藤井です。
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 )