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

[MD:1337]A solution for "Bitmap kills emacs" problem.



堀口です. 原因は完全にわかった..と思います.

 とりあえず 1.06b1 へのパッチもいれましたが, 副作用が"もしかして
重いかも^^;" とういことでおそらくお蔵入りでしょう. ;_;

 問題は byte-character の不整合とかではなく, バッファの中のポイン
トのしかたの間違いです. というか当初予期していなかったところで
xmallocが使われるようになってしまったというか..

 起きていることは簡単に言うと以下の通りです. (まえにも似たような
ことを書きましたが..)

  「再配置可能なメモリである(emacsの)バッファのなかをさしているポ
    インタを使っているときに xmalloc を使ったせいでもとのバッファ
    のメモリが移動してしまうため, そのポインタが無効な領域を指す
    ようになってしまう」

 これに対して, おいてけぼりを食らっていたポインタもバッファの移動
に追従させてしまうようにするパッチを添付しました.
 下記の(B)の方法です. ちょっと見ていただたいのですがいいでしょう
か? > himiさん?  or 半田さん?

  A) 結構アドホック
    関連の関数がすべて current_buffer に対する操作しかしないなら, 
    呼び出しを上位側にたどって行きながらすべての呼び出し元でバッ
    ファ内へのポインタを str_cmpchar_id を通る前後で使いつづけな
    いように修正する. 当然関数のパラメータにはポインタではなくバ
    イトオフセットを使うようにする.

    感想: うーん, どうなんですか? これでできればそれはそれでいい
          と思うのですが..
          

  B) もうちょっとスマートに, でもちょっと大胆かも
     r_alloc_sbrk でそのブロックの先頭を指すポインタひとつだけで
    なく, 複数のポインタのブロック先頭からのオフセットを保存する
    ように変更する機構をつける. ある意味汚い.

     r_alloc_relate_pointer(&pointer) // 名前がダサいけど堪忍

     とかやって複数のポインタを登録できて, それらのポインタは
    r_alloc_sbrk の時に自動的に修正される. これでパフォーマンスに
    影響するほど sbrk は使われるものではないですよね.

    結果: とりあえず深く考えずに実装してみました. 結果はとりあえ
          ず問題はなくなりました. (問題の場所の通過をデバッガで確
          認しています) ただし, 例のテストプログラムでは結構細か
          い単位で変数自体の登録と削除が繰り返されるのか重いよう
          な気がします^^; 企画倒れっぽいですね ;_;

  C) その他.
    アンマリなので書きません.    
--
堀口恭太郎
============================================================
 今回私が出したいじめ関数で起きたことは具体的には以下の通りです.

 display_text_line@xxxxxxx:
   バッファ内の位置は int pos で表現. 途中で 
   BYTE_POS_ADDR(CHAR_TO_BYTE(pos)) した結果のポインタを 
   STRING_CHAR_AND_LENGTH(ここでは結果として 
   string_to_non_ascii_char)に引き渡している.

 string_to_non_ascii_char@xxxxxxxxx
   display_text_line で作られたバッファ内を指すポインタをそのまま 
   str_cmpchar_id に引き渡している.

 str_cmpchar_id@xxxxxxxxx:1496
   string_to_non_ascii_char から引き渡されたポインタの場所にある 
   composite character を検索するが, なかった場合は composite
   character id のためのハッシュテーブルの拡張, キャラクタテーブ
   ルの拡張で xmalloc が行われる#ことがある#.

   さらにこのときに一旦領域が足りないと r_alloc_sbrk でバッファが
   移動する#ことがあり#そのせいでポインタが"死んで"しまって, 最終
   的に charset.c:1632 if (*bufp == 0xA0) のところで SEGV となる.
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