Ticket #357 (new 不具合)

Opened 2 years ago

Last modified 1 year ago

accept-process-output が非同期ネットワーク接続時に接続完了イベントを処理しない

Reported by: gotoh Assigned to:
Priority: major Milestone:
Component: その他/一般 Version: 3.00 (開発中)
Keywords: Cc:

Description

Meadow のネットワーク非同期通信の実装に一部おかしなところがあるようです。 具体的には make-network-process<f>:nowait tを指定してコネクションを 作成した後、プロセス状態がconnectからopenに移行するのを待とうとして accept-process-output<f>を使うと、いつまでたってもopenにならない というもの。sit-for<f>で状態変化を待つと、こちらはうまくいきます。

再現コードは以下のようなもの。 後半の"切り替え"の部分を t にすると sit-for<f> で時間をつぶし、 nil だと accept-process-output<f> で行います。 UNIX上のEmacs 22.0.90だといずれのケースでも動作しますが、 Meadowだと nil の場合、つまり accept-process-output<f>を使う場合に問題があります。 r4180を使って試していますが、これは以前からあった問題のようです。

(let ((proc (make-network-process
             :name "test"
             :buffer (current-buffer)
             :host "farm.meadowy.org"
             :service 22
             :filter 'myfilter
             :sentinel 'mysentinel
             :nowait t
             )))
  (while (not (member (process-status proc) '(open run closed)))
    (list-processes)
    (message "waiting")
    (if t   ;;; <<=== 切り替え
	(sit-for 0.5)
      (if (accept-process-output nil 1)
	  (message "accepted")
	(message "timeout"))))
  (process-send-eof "test")
  (list-processes)
  )

具体的な支障としてはurlライブラリでのネットワーク接続に支障が出ます。 なので、それなりに影響が大きいのではないかと思います。 以下の単純なコードは返って来ません。ネットワーク的にはコネクト済みなのに Meadowがそう認識しないため、待ち続けます。

(url-retrieve-synchronously "http://www.meadowy.org/")

ちなみに最近のurl-gw.elの変更で :nowait (featurep 'make-network-process '(:nowait t)) という指定になったため影響が表に出てきました。 これを暫定的に回避するには以下のパッチで非同期を使わないようにすればOK.

  • url-gw.el

    old new  
    253253                          ;; Use non-blocking socket if we can. 
    254254                          (make-network-process :name name :buffer buffer 
    255255                                                :host host :service service 
    256                                                 :nowait  
    257                                                 (featurep 'make-network-process '(:nowait t)))) 
     256                                                :nowait nil)) 
     257                                                ;;(featurep 'make-network-process '(:nowait t)))) 
    258258                         (socks 
    259259                          (socks-open-network-stream name buffer host service)) 
    260260                         (telnet 

Attachments

Change History

(follow-up: ↓ 2 ) 11/19/06 10:20:51 changed by miyoshi

プロセス周りのMeadow独自の実装の意味ってありましたっけ?

ないのであれば、その部分の実装を捨てちゃいましょうか。

(in reply to: ↑ 1 ) 11/19/06 14:53:40 changed by gotoh

Replying to miyoshi:

プロセス周りのMeadow独自の実装の意味ってありましたっけ? ないのであれば、その部分の実装を捨てちゃいましょうか。

非同期処理に際して堀口さんがsys_select()を改造してくれていて、w32proc.csys_select()から w32.csys_select_socket()を呼び出すあたりが若干Meadow独自です。 accept-process-output<f>がselect()を呼んでるのですが、そこで本来非同期接続も考慮している はずなのに、なにかがひとつ足りてないだけのように思えて、つまりあとちょっと、という気がするので それを捨てるのは少々もったいない気がしてます。

ちょっと追ってみてはいるのですが、あたまが追いつかず。

11/19/06 20:03:21 changed by miyoshi

了解です。Meadowのバグを修正することにしましょう。

07/09/07 15:38:27 changed by gotoh

2007-01-08のsync-up (r4184)の際に、ms-w32.hBLOCKEN_NON_BLOCKING_CONNECT が導入されたため、Meadow独自に行った実装も 現在は無効(死にコード)となっているようです。結果としてこの現象は r4184 以降(現在 r4213 まで)では 再現できないので、注意。


Add/Change #357 (accept-process-output が非同期ネットワーク接続時に接続完了イベントを処理しない)




Change Properties
Action