[xyzzy:04094] process-filter and C-g
- Subject: [xyzzy:04094] process-filter and C-g
- From: Yutaka OIWA <oiwa@xxxxxxxxxxxxxxxxxxxxx>
おおいわです。いつもお世話になってます。
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