[#23805] net/smtp — 佐藤 大輔 <densuke@...2.so-net.ne.jp>

佐藤です。

26 messages 2000/07/12
[#23806] Re: net/smtp — matz@... (Yukihiro Matsumoto) 2000/07/12

まつもと ゆきひろです

[#23808] Re: net/smtp — 佐藤 大輔 <densuke@...2.so-net.ne.jp> 2000/07/12

佐藤です。

[#23809] Re: net/smtp — matz@... (Yukihiro Matsumoto) 2000/07/12

まつもと ゆきひろです

[#23811] Re: net/smtp — Minero Aoki <aamine@...> 2000/07/12

あおきです。

[#23812] Re: net/smtp — matz@... (Yukihiro Matsumoto) 2000/07/12

まつもと ゆきひろです

[#23890] Ruby Entry Package and cygwin1.dll — Noritsugu Nakamura <nnakamur@...>

25 messages 2000/07/18
[#23895] Re: Ruby Entry Package and cygwin1.dll — WATANABE Hirofumi <eban@...> 2000/07/18

わたなべです.

[#23896] Re: Ruby Entry Package and cygwin1.dll — Noritsugu Nakamura <nnakamur@...> 2000/07/18

[#23897] Re: Ruby Entry Package and cygwin1.dll — Katsuyuki Komatsu <komatsu@...> 2000/07/19

小松です。

[#23898] Re: Ruby Entry Package and cygwin1.dll — WATANABE Hirofumi <eban@...> 2000/07/19

わたなべです.

[#23899] Re: Ruby Entry Package and cygwin1.dll — Katsuyuki Komatsu <komatsu@...> 2000/07/19

小松です。

[#23923] Re: [ruby-dev:10353] Re: should prohibit `module_function' for class Class — Masatoshi SEKI <m_seki@...>

11 messages 2000/07/19

[#23940] String#unpack と scanf の関係 — kiwamu <kiwamu@...>

こんにちは。岡部@東京都立大学と申します。

16 messages 2000/07/20

[ruby-list:23652] Re: [mswin32] Ctrl-C while socket operation (Re: Ruby 1.4.5)

From: Katsuyuki Komatsu <komatsu@...>
Date: 2000-07-02 02:53:22 UTC
List: ruby-list #23652
小松です。

In the message of [ruby-list:23631]
    on 2000/7/1 11:50 "Shigeo Kobayashi" <shigeo@tinyforest.gr.jp> wrote:

> しっかりつっこまれると思っていました。 ^^;;;

せっかく期待していただいたのに、遅くなってしまって (笑)。

> ただ、CTRL+C は別にしても、(UNIX では pthread
> 等)マルチスレッド環境では select が戻って来ない
> と、全てのスレッドをきれいにシャットダウンできま
> せん。

Rubyの方のaccept()中にCtrl-Cを押すと落ちる問題は、
Ctrl-Cを通知するために新規のスレッドが生成されて、
一気にマルチ (native) スレッド問題になっている
という点で同様です。

> ノンブロッキングモードにするかタイムアウト後に
> ポーリングする以外の方法を考えつかないので
> 私は、以下のようなやり方をよく使います。

そうですね。この形にすることもよくあります。
win32/win32.cのmyaccept()をこの形にするとだいたい
以下のようになるでしょう。timeoutは100msにしてみました。

# TRAP_BEG, TRAP_END, CHECK_INTSの使い方は自信無し。

どんなもんでしょう?

2.のすぐに止まらない件もmyselect()の中で同様に
しましょうか?

Win32だけなら、ソケットに対してWSACreateEvent()と
WSAEventSelect()を使ってイベントを作って、例の中の
DidUserRequestGlobalShutdown()もイベント通知にして、
WaitForMultipleObjects()のシリーズのAPIでそれらの
イベントを待つという形にすることも多いです。

diff -ru1p ruby-1.4.5.dist/win32/win32.c ruby-1.4.5/win32/win32.c
--- ruby-1.4.5.dist/win32/win32.c	Tue Jun 27 14:42:14 2000
+++ ruby-1.4.5/win32/win32.c	Sun Jul  2 11:45:11 2000
@@ -13,2 +13,3 @@
 #include "ruby.h"
+#include "rubysig.h"
 #include <fcntl.h>
@@ -1890,2 +1891,6 @@ myaccept (SOCKET s, struct sockaddr *add
     SOCKET r;
+    int rc;
+    fd_set rd_set;
+    struct timeval tv;
+    int trap_immediate = rb_trap_immediate;
 
@@ -1894,4 +1899,29 @@ myaccept (SOCKET s, struct sockaddr *add
     }
-    if ((r = accept (TO_SOCKET(s), addr, addrlen)) == INVALID_SOCKET)
-	errno = WSAGetLastError();
+
+    TRAP_END;
+    for (;;) {
+	FD_ZERO(&rd_set);
+	myfdset(s, &rd_set);
+	tv.tv_sec = 0; tv.tv_usec = 100000;	/* 100 [ms] */
+	rc = myselect(1, &rd_set, 0, 0, &tv);
+	if (rc < 0) {
+	    errno = WSAGetLastError();
+	    if (WSAGetLastError() == WSAEWOULDBLOCK)
+		continue;
+	    r = INVALID_SOCKET;
+	    break;
+	}
+	if (rc > 0) {
+	    r = accept(TO_SOCKET(s), addr, addrlen);
+	    if (r == INVALID_SOCKET) {
+		errno = WSAGetLastError();
+		if (WSAGetLastError() == WSAEWOULDBLOCK)
+		    continue;
+	    }
+	    break;
+	}
+	CHECK_INTS;
+    }
+    if (trap_immediate)
+	TRAP_BEG;
     return r;

--
小松克行 / Katsuyuki Komatsu <komatsu@sarion.co.jp>

In This Thread