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

[MD:3019]portable dumper for Emacs 21.1



Keiichiro Nagano (永野圭一郎) <knagano@xxxxxxxxx> writes:

> multibyte char. が表示できなかった問題を解決し、string data を 
> Lisp_Object space に展開する (1回の mmap で一気に読める) ようにした 
> patch です。code size が減り、global var. や struct, typedef, function 
> が減って複雑さが減り、copy-on-write が激減し、dump と load の速度が(分
> からない程度に)向上しました。^^ やっぱり最初からこうすべきだった。

copy-on-write 自体はそんなに気にする必要は無いと思います。と
いうのも、どのみち最初の GC でほとんどの page は copy されて
しまうからです。これをしないようにするには mark bit をやめて、
mark bitmap (例えば、32 個の cons cell に対して 32bit の整数
を割当て、各 bit の on off で cons cell が mark されているか
どうかを判断するような方法) を実装すればよいのですが、たぶん
誰もやらないでしょう。Ruby では mark bitmap も試してみたそう
ですが、GC は逆に遅くなったそうです。この辺は実際にやってみ
ないと Emacs でどうなるかはわかりませんが。

String の data は Lisp_String の後に付けるようにしたのですね。
pdump の string は通常の GC の code では扱われませんし、なか
なか良い選択だと思います。
# 普通に別領域に dump するくらいかな、と思っていました。

Code をざっと眺めていて気付いた点をいくつか。

Hash table がどうやって実装されているかは全然見ていませんが、
たぶん Vweak_hash_table は dump する必要があると思います。

alloc.c に HASH_KEY などが再定義されていますが、新しい
header を作ってしまって、そこにこいつらを放り込んで alloc.c
と fns.c から include するようにした方が良いと思います。

Interval tree は、Lisp_Object に対してやっているような感じで
register と dump をすると、pdump_forward_interval_tree_t の
代わりに struct interval をそのまま dump できるようになりま
す。そうすると、load 時に再構成する overhead がなくなります。
ただ、dump される interval の数はたいしたことない、というか
ごくわずかなので、わざわざ書き換える必要は無いと思いますが。

後、いくつか私は long * を使っているところがありますが、
Emacs 21.1 では POINTER_TYPE * を使うようになっているような
ので、変更しておいてください。

私が時間に追われて手抜きしているところも一般化されているし、
全体的に良く書けていると思います。もうちょっと bug を潰した
後で Meadow に対応できれば、CVS に commit してしまって良いと
思います。Meadow 2 自体まだ alpha ですし。後、commit してし
まうと他の人が否応無しに test せざるを得なくなる、という利点
もあります。:-)

-- 
Yoshiki Hayashi