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

[MD:1094]Bitmap downs meadow when gnus startup.



堀口です. gnus の起動時にこける問題ですが, 安定して症状が出せたの
で(^^;), 昨晩しつこく追いかけたら怪しいところが出てきました.

 原因は移動可能なメモリブロックを指すポインタを使っているときにそ
のポインタが指しているメモリブロックが移動してしまうことのようで
す.

 場所が場所なだけに対処法が簡単ではなさそうなのでとりあえず状況の
報告だけをします.

At 02 Mar 1999 17:43:43 +0900, Keiichi Suzuki <keiichi@xxxxxxxxxxxx> wrote in <u1zj8ffi8.fsf@xxxxxxxxxxxxxxxx>
> >> 起動直後にいきなり M-x gnus をすると現状で 100% Meadow が落ちます。
> >> しかし、マウスで frame サイズを大きくしてから変えてやってから同じ操作を
> >> すると落ちなくなります。
> 
> himi> うーん、MeadowNT -qで、.gnus.elの内容だけで起動してみましたが、
> himi> 再現しません。やっぱり、bitmap-mule周りでしょうか。
> 
> やはりそのようで、 Gnus の logo を表示しないようにすると、うまく起動でき
> ます。

 わたしのところでは str_cmpchar_id@xxxxxxxxx で落ちるのですが, これを
もうちょっとしつこく追いまわしてみました. コールスタックは

  str_cmpchar_id
  string_to_non_ascii_char
  display_text_line
  try_window
  redisplay_windows
  .....

 という具合なのですが, 問題はこの str_cmpchar_id の中で xmalloc 
が呼ばれていることのようです.

 str_cmpchar_id / string_to_non_ascii_char がパラメータとして受け
取る str はカレントバッファのテキストバッファの中を指しています.

 ビットマップのあるバッファの描画を行うと, コンポジットキャラクタ
を扱う過程で xmalloc が呼び出されます. 必要なメモリが多いせいかこ
のなかで morecore が呼び出されることがあります. このときはこんな
感じになっていました.

  relocate_blocs
  r_alloc_sbrk
  align
  morecore
  _malloc_internal
  malloc
  _malloc_internal
  malloc
  emacs_blocked_malloc
  malloc
  xmalloc

 で, str の指す先にあるはずだったブロックが移動されてそこがクリア
されてしまいます.

 結果として str の先にあるはずだったデータが消えて(0クリア)そこを
アクセスして SEGV となっています.


# 余談

 これを追いかけている最中に blockinput.h に以下のものを見つけまし
た.

> /* W32 API is reentrant. So block input system is not needed. */
> /* 96.10.2 by himi */
> #ifdef MEADOW
> #undef BLOCK_INPUT
> #undef UNBLOCK_INPUT

 でもこれって Win32 API だけじゃなくて Emacs 自体の non-reentrant
code を守るのにも必要なような気がするのですが平気なんでしょうか.

 ちなみにこれをそのまま生かすと w32_window@xxxxxxxxx の 
WAIT_REPLY_MESSAGE で固まってしまいます. この部分だけを 
UNBLOCK_INPUT すると動いていましたが, gnus 起動時に固まる症状は変
わりませんでした^^;

--
堀口恭太郎