[#26664] refactoring tcltklib.c (deleted ip check) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

22 messages 2005/08/01
[#26665] Re: refactoring tcltklib.c (deleted ip check) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/01

山本です。

[#26668] Re: refactoring tcltklib.c (deleted ip check) — Hidetoshi NAGAI <nagai@...> 2005/08/01

永井@知能.九工大です.

[#26678] Re: refactoring tcltklib.c (deleted ip check) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/01

山本です。

[#26684] Re: refactoring tcltklib.c (deleted ip check) — Hidetoshi NAGAI <nagai@...> 2005/08/01

永井@知能.九工大です.

[#26686] Re: refactoring tcltklib.c (deleted ip check) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/01

山本です。

[#26817] test/socket/test_tcp.rb freeze on windows — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

12 messages 2005/08/18

[#26829] cannot check EOF of pipe on windows — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

19 messages 2005/08/19
[#26830] Re: cannot check EOF of pipe on windows — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/19

山本です。

[#26831] Re: cannot check EOF of pipe on windows — "U.Nakamura" <usa@...> 2005/08/19

こんにちは、なかむら(う)です。

[#26832] Re: cannot check EOF of pipe on windows — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/19

山本です。

[#26836] Re: cannot check EOF of pipe on windows — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/08/19

なかだです。

[#26872] irb -I/ruby -Iと$LOAD_PATH — akira yamada / やまだあきら <akira@...>

Debianユーザからruby -Iとirb -Iで

17 messages 2005/08/24
[#26873] Re: irb -I/ruby -Iと$LOAD_PATH — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/08/24

なかだです。

[#26875] Re: irb -I/ruby -Iと$LOAD_PATH — akira yamada / やまだあきら <akira@...> 2005/08/24

nobuyoshi nakada wrote:

[#26885] Re: irb -I/ruby -Iと$LOAD_PATH — keiju@... (石塚圭樹) 2005/08/26

けいじゅ@いしつかです.

[#26897] fail on make install — KIMURA Koichi <kimura.koichi@...>

木村です。

28 messages 2005/08/29
[#26898] Re: fail on make install — "U.Nakamura" <usa@...> 2005/08/29

こんにちは、なかむら(う)です。

[#26903] Re: fail on make install — KIMURA Koichi <kbk@...> 2005/08/29

木村です。

[#26922] Re: fail on make install — KIMURA Koichi <kimura.koichi@...> 2005/08/30

木村です。

[#26926] Re: fail on make install — KIMURA Koichi <kimura.koichi@...> 2005/08/31

木村です。

[#26927] Re: fail on make install — "U.Nakamura" <usa@...> 2005/08/31

こんにちは、なかむら(う)です。

[#26928] Re: fail on make install — KIMURA Koichi <kimura.koichi@...> 2005/08/31

木村です。

[#26929] Re: fail on make install — "U.Nakamura" <usa@...> 2005/08/31

こんにちは、なかむら(う)です。

[#26930] Re: fail on make install — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/08/31

なかだです。

[#26931] Re: fail on make install — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/08/31

山本です。

[#26933] Re: fail on make install — nobu@... 2005/08/31

なかだです。

[#26938] Re: fail on make install — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/09/01

なかだです。

[#26939] Re: fail on make install — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/09/01

山本です。

[#26900] multiplying empty string — nobuyoshi nakada <nobuyoshi.nakada@...>

19 messages 2005/08/29
[#26904] Re: multiplying empty string — Yukihiro Matsumoto <matz@...> 2005/08/29

まつもと ゆきひろです

[#26907] Re: multiplying empty string — Tanaka Akira <akr@...17n.org> 2005/08/29

In article <1125327516.070646.12845.nullmailer@x31.priv.netlab.jp>,

[#26909] Re: multiplying empty string — Yukihiro Matsumoto <matz@...> 2005/08/29

まつもと ゆきひろです

[ruby-dev:26837] Re: cannot check EOF of pipe on windows

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2005-08-19 10:13:35 UTC
List: ruby-dev #26837
山本です。

>タイミングっぽいです。
>
>  io.write %q{
>    p 1
>    print 'xy'
>    sleep 0
>  }
>
>と最後にsleep 0を入れると最後まで通るようになりました。

ですね。こうすると、こんどは全く読み込めなくなりました。

  IO.popen('ruby', 'r+'){|io|
    io.write %q{
      p 1
      print 'xy'
    }
    io.close_write
    sleep 1

    while c = io.read(1)
      p c
      p io.eof?
    end
  }

読めなくなるタイミングというのが、ちょうど read で
ERROR_NETNAME_DELETED が返るタイミングのようなので、
これを無視してはいけないような雰囲気です。

# io.close_write が何か良からぬことをしてるんでしょうか

>想像ですが、ソケットの場合送信側と受信側のバッファが分かれてい
>て、プロセスの終了かWSACleanup()で送信側のバッファに残っていて
>も捨てられてしまうんじゃないでしょうか。ERROR_NETNAME_DELETEDは
>ソケットにおいてERROR_BROKEN_PIPEに相当しているのかもしれません。

http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/debugging-tcp.html
を読んだときに私もそうじゃないかと思ったのですが、調べてみると
子プロセスは親プロセスより長生きしているようなので、この場合は
違うのかもしれません。(断言はできませんが)

  puts Process.pid

  IO.popen('ruby', 'r+'){|io|
    io.write %q{
      p 1
      print 'xy'
    }
    io.close_write
    sleep 1

    while c = io.read(1)
      p c
      p io.eof?
    end
  }


Index: win32.c
===================================================================
RCS file: /src/ruby/win32/win32.c,v
retrieving revision 1.164
diff -u -w -b -p -r1.164 win32.c
--- win32.c	18 Aug 2005 02:07:28 -0000	1.164
+++ win32.c	19 Aug 2005 10:02:34 -0000
@@ -180,6 +180,12 @@ static struct {
     {	WSAENOTEMPTY,			ENOTEMPTY	}
 };
 
+static void
+debug(const char *msg)
+{
+    printf("%s (%d)\n", msg, getpid());
+}
+
 static int
 map_errno(DWORD winerr)
 {
@@ -1992,6 +1998,14 @@ rb_w32_select(int nfds, fd_set *rd, fd_s
 }
 
 static void
+CleanSockets(void)
+{
+    debug("WSACleanup");
+
+    WSACleanup();
+}
+
+static void
 StartSockets(void)
 {
     WORD version;
@@ -2007,7 +2021,7 @@ StartSockets(void)
     if (LOBYTE(retdata.wVersion) != 2)
 	rb_fatal("could not find version 2 of winsock dll\n");
 
-    atexit((void (*)(void)) WSACleanup);
+    atexit(CleanSockets);
 
     main_thread.handle = GetCurrentThreadHandle();
     main_thread.id = GetCurrentThreadId();
@@ -2279,6 +2293,8 @@ open_ifs_socket(int af, int type, int pr
     int error_code;
     SOCKET out = INVALID_SOCKET;
 
+debug("open_ifs_socket");
+
     if (WSAEnumProtocols(NULL, NULL, &proto_buffers_len) == SOCKET_ERROR) {
 	error_code = WSAGetLastError();
 	if (error_code == WSAENOBUFS) {
@@ -3286,22 +3302,28 @@ catch_interrupt(void)
     CHECK_INTS;
 }
 
-#if defined __BORLANDC__ || defined _WIN32_WCE
-#undef read
 int
-read(int fd, void *buf, size_t size)
+rb_w32_read(int fd, void *buf, size_t size)
 {
+    int oerr = errno;
     int trap_immediate = rb_trap_immediate;
     int ret = _read(fd, buf, size);
-    if ((ret < 0) && (errno == EPIPE)) {
-	errno = 0;
+#if defined __BORLANDC__ || defined _WIN32_WCE
+    if (ret < 0 && errno == EPIPE) {
+	errno = oerr;
+	ret = 0;
+    }
+#endif
+/*
+    if (ret < 0 && GetLastError() == ERROR_NETNAME_DELETED) {
+	errno = oerr;
 	ret = 0;
     }
+*/
     rb_trap_immediate = trap_immediate;
     catch_interrupt();
     return ret;
 }
-#endif
 
 #undef fgetc
 int
@@ -3506,6 +3528,9 @@ rb_w32_fclose(FILE *fp)
     }
     _set_osfhnd(fd, (SOCKET)INVALID_HANDLE_VALUE);
     fclose(fp);
+
+    debug("closesocket");
+
     if (closesocket(sock) == SOCKET_ERROR) {
 	errno = map_errno(WSAGetLastError());
 	return -1;
@@ -3524,6 +3549,9 @@ rb_w32_close(int fd)
     }
     _set_osfhnd(fd, (SOCKET)INVALID_HANDLE_VALUE);
     _close(fd);
+    
+    debug("closesocket");
+    
     if (closesocket(sock) == SOCKET_ERROR) {
 	errno = map_errno(WSAGetLastError());
 	return -1;


E:\ruby-cvs\win32>ruby \z.rb
1036
open_ifs_socket (1036)
open_ifs_socket (1036)
closesocket (1036)
/z.rb:12:in `read': Invalid argument (Errno::EINVAL)
        from /z.rb:12
        from /z.rb:4
WSACleanup (1036)
WSACleanup (1164)

In This Thread