[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:04094] process-filter and C-g



おおいわです。いつもお世話になってます。

process-filter を使ってネットワークからの受信データを
ユーザ操作と並行処理するような lisp プログラムを書いた時に、
ユーザが foreground で C-g を押してしまうと、background の
filter が中断されてしまい、ネットワークからの受信データが
欠けてしまいます。

Emacs では

> 通常、フィルタ関数内では中断は禁止されています。中断が禁止されていな
> ければ、コマンド・レベルでの`C-g'の入力やユーザー・コマンドの中断に
> よる影響を予測できなくなります。フィルタ関数内で中断を有効にするには、
> `inhibit-quit'に`nil'を束縛してください。*Note Quitting::。

となっているのですが、xyzzy の場合は自動的に設定されないので、
filter の先頭で *inhibit-quit* を t に設定しても、
race condition が存在して、そこを実行する前に C-g が認識されると
やっぱり中断されちゃう気がします。

試しに filter の先頭に (let ((*inhibit-quit* t) ...) ...) を
入れてみたのですが、前より減った気はするものの
やっぱりデータが欠けます。

# *inhibit-quit* って special variable ですよね?

というわけで、ここの動作が Emacs の様にデフォルト inhibit になるか、
あるいは process の属性として指定できるといいと思うのですが、
いかがでしょうか。

## 「*inhibit-quit* 自体は有効だよなぁ」と、
## ESC ESC (let ((*inhibit-quit* t)) (hanoi 8)) とやって
## はまったのは秘密。(hanoi 20) とかじゃなくてよかった。

-- 
大岩 寛   Yutaka Oiwa        
       東京大学大学院 理学系研究科情報科学専攻 修士課程 米澤研究室
      <oiwa@xxxxxxxxxxxxxxxxxxxxx>, <yutaka@xxxxxxxxxxxxxxxxxxxxx>
PGP fingerprint = C9 8D 5C B8 86 ED D8 07  EA 59 34 D8 F4 65 53 61

Index Home