[mew-dist 26705] Re: フォールバック実験

Kyotaro HORIGUCHI horiguti at example.com
2005年 11月 30日 (水) 21:45:01 JST


堀口@Meadow です.

> こうなってくると、Meadow のバグだと思います。
> 正常系はうまく動いているけど、エラー系にはバグがあるのでしょう。

 即時に出ないエラー(ENOTCONN)を検知できませんでした.

 Meadow3 r3991 ではできるようになりました. ただし現在ほかの面で少々
不安定でそのため NetInstall はとりあえず今週いっぱいは出ません. 今
週中にはまともに直る予定です.

 Meadow3 を手元でコンパイルできる方は r3991 を, r3991が不安な方は
以下のパッチをあててコンパイルすればよいはずです(若干位置が違うか
もしれません).

 ちなみにこのパッチをあててENOTCONN が出た場合には[mew-win32
 04307]のコードを実行すると, エラー検出の際に

| SEN1: failed with code 10035

 と出てきてプロセス自体は消えません.  これでよいでしょうか.

 なお, エラーコードが WSAENOTCONN = 10057 ではなくWSAEWOULDBLOCK
= 10035 になっているのは元の emacs がその後別の Winsock API を呼び
出して書き換えているせいです.

-- 
堀口恭太郎


Index: w32proc.c
===================================================================
--- w32proc.c	(revision 3990)
+++ w32proc.c	(revision 3991)
@@ -1332,11 +1332,21 @@
 #ifdef MEADOW
     if (wfds)
       {
+	int i;
+	SELECT_TYPE efds = *wfds;
+	struct timeval tm = {0, 0};
+
+	nw = sys_select_socket (nfds, NULL, wfds, &efds, &tm);
+
+	/* merge retuend efds and wfds */
+	for (i = 0 ; i < nfds ; i++)
+	  {
+	    if (FD_ISSET (i, &efds))
+	      FD_SET (i, wfds);
+	  }
+
 	/* Assume this socket is waiting for connection of
 	   non-blocking socket. */
-	struct timeval tm = {0, 0};
-	nw = sys_select_socket (nfds, NULL, wfds, NULL, &tm);
-
 	if (nw < 0)
 	  return nw;
       }






Mew-dist メーリングリストの案内