From: Ikumi K. <ik...@ik...> - 2014-11-26 14:31:37
|
twmode で (setq twittering-use-master-password t) として master password を使っている皆さん。emacs を起動して最初の M-x twit で、認証デー タを読み込んだ後に無限ループに入ってしまうという方はいらっしゃるでしょう か。私はしょっちゅう起こっています。 無限ループになっても、C-g で中断すると認証済み情報がセットされて、もう 一度 M-x twit とすると問題なく使えるので、実用上は困ってなくてこれまでそ うやって利用していたのですが、昨日業を煮やして調べてみたところ、一応ある 程度の原因はわかって修正もできたので、情報共有のため報告します。これが正 しい対処法なのかどうかもよくわかってないので、詳しい方からのご意見やご指 摘が頂けましたら幸いです。 (1) 無限ループは twittering-verify-credentials の中の ;; wait for verification to finish. (twittering-wait-while nil 0.1 (and (twittering-account-authorization-queried-p) (twittering-process-alive-p proc))) の箇所で起こっている。 (2) ここに debug code を挿入して、twittering-debug-mode をオンにして試し てみたところ、無限ループの最中は (input-pending-p t) が t を返す状態 が続いていることがわかった。 (3) このためマクロ twittering-wait-while の展開結果に現れる sit-for が入 力待ちにならずに直ちに帰っている。その結果、バックグラウンドで呼んだ curl の出力を emacs が受け取れる状態にならない(ここは推測。elisp reference の「Output from Processes」の節に Output from a subprocess can arrive only while Emacs is waiting: when reading terminal input ... in `sit-for' and `sleep-for' ..., and in `accept-process-output' (*note Accepting Output::). とあることと、sit-for の実装を見ると (input-pending-p t) が non-nil を返す時は実際に入力待ちを担っているらしき read-event まで処理が回ら ずに終了してしまう所から見て、process の出力を受け取れる状態にならな いまま sit-for が終わってしまっているっぽい)。 (4) そのため、curl が取得した認証確認情報が処理されたり、curl の process が終了して status が変化するタイミングがないので、終了条件がみたされ ずに無限ループとなる。 そこで、添付 patch のように、twittering-wait-while 中の sit-for を sleep-forに置き換えて確実に待機を起こすようにしてみると、どうやらこちら では問題はなく動作するようになりました(patch 中のもう1点の修正は、事情 がよく解ってなかった頃この辺りの処理を追っていて、「ここ無条件で認証成功 の結果を返しちゃまずいんじゃないの?」と思ってついでに入れたものです。何 か思い違いをしていたらすみません)。 ただ、「(input-pending-p t) がずっと t を返す状態になる」というのが正 しい動作なのかどうかはよくわかりません。ひょっとしたら emacs の bug だっ たりコンパイルに失敗していたりするのかもしれず、そこら辺は判断できる知識 がないので、この sit-for→sleep-for という置き換えが本当に正しい処置なの かどうかはイマイチ自信が持てない所です。 井汲 景太 |