次のmail(6734)でもう解決してるような気もしますが、資料として。

>|	5/7版でも同様です。
>|	- thread_connect()の中でrb_thread_fd_writable()を呼んでいますが、
>|	  一本しかthreadがないときはEISCONNになるまで返って来ないようにする
>|	- EALREADYなどのとき、thread_connect()から返らない。EISCONNに
>|	  なるまでは返ってはいけない。
>|	- EISCONNじゃないとやばい操作(例: getpeername)全ての前でEISCONNに
>|	なるまで待つ操作をいれる。
>|	のいずれかが必要な気がしますが、どうしたらいいのか...
>うーむ,「いずれか」で良いんですか?

	最後のはむちゃ面倒ですよね。

>とりあえず case EALREADY: (553行目)を削ると
>|	- EALREADYなどのとき、thread_connect()から返らない。EISCONNに
>|	  なるまでは返ってはいけない。
>は実現できるような気がするんですが,実際ナニが起きているのか
>良く分からないんで,全然自信が無いです.これじゃ絶対足りなそ
>うな気配が...
>もしかするとconnectが成功する(0を返す)だけじゃ不十分だという
>ことなんでしょうか?

	現在のコードだと、threadが1本しかない場合、connect()が0を返して
	いないのにthread_connect()から戻ってます。case EALREADYに
	たどりついた場合、そのまま戻っちゃいますよね。

itojun



--- thread_connect()に入るあたりから
   462 ruby     CALL  socket(0x18,0x1,0x6)
   462 ruby     RET   socket 3
   462 ruby     CALL  fcntl(0x3,0x3,0)
   462 ruby     RET   fcntl 2
   462 ruby     CALL  fcntl(0x3,0x4,0x6)
   462 ruby     RET   fcntl 0
   462 ruby     CALL  connect(0x3,0x12cc20,0x1c)	<- 一度目、EINPROGRESS
   462 ruby     RET   connect -1 errno 36 Operation now in progress
   462 ruby     CALL  write(0x2,0xefbfc5e0,0x12)	<- debug message出力
   462 ruby     GIO   fd 2 wrote 18 bytes
       "connect: errno=36
       "
   462 ruby     RET   write 18/0x12
   462 ruby     CALL  connect(0x3,0x12cc20,0x1c)	<- 2度目、EALREADY
   462 ruby     RET   connect -1 errno 37 Operation already in progress
   462 ruby     CALL  write(0x2,0xefbfc5e0,0x12)	<- debug message出力
   462 ruby     GIO   fd 2 wrote 18 bytes
       "connect: errno=37
       "
   462 ruby     RET   write 18/0x12
   462 ruby     CALL  fcntl(0x3,0x4,0x2)
   462 ruby     RET   fcntl 0
   462 ruby     CALL  getdtablesize
   462 ruby     RET   getdtablesize 64/0x40
   462 ruby     CALL  fcntl(0x3,0x3,0)
   462 ruby     RET   fcntl 2
   462 ruby     CALL  dup(0x3)
   462 ruby     RET   dup 4
   462 ruby     CALL  fcntl(0x4,0x3,0)
   462 ruby     RET   fcntl 2
   462 ruby     CALL  getpeername(0x3,0xefbfcb70,0xefbfcb6c)
   462 ruby     RET   getpeername -1 errno 57 Socket is not connected
   462 ruby     CALL  sigprocmask(0x3,0)
   462 ruby     RET   sigprocmask 0
   462 ruby     CALL  write(0x2,0x12cc80,0x2d)
   462 ruby     GIO   fd 2 wrote 45 bytes
       "sample/dualstack-fetch.rb:40:in `getpeername'"
   462 ruby     RET   write 45/0x2d
   462 ruby     CALL  write(0x2,0xefbfd0e0,0x2)
   462 ruby     GIO   fd 2 wrote 2 bytes
       ": "
   462 ruby     RET   write 2
   462 ruby     CALL  write(0x2,0x12cc40,0x28)
   462 ruby     GIO   fd 2 wrote 40 bytes
       "Socket is not connected - getpeername(2)"
   462 ruby     RET   write 40/0x28
   462 ruby     CALL  write(0x2,0xefbfd0e0,0x2)
   462 ruby     GIO   fd 2 wrote 2 bytes
       " ("
   462 ruby     RET   write 2
   462 ruby     CALL  write(0x2,0x115f00,0xf)
   462 ruby     GIO   fd 2 wrote 15 bytes
       "Errno::ENOTCONN"
   462 ruby     RET   write 15/0xf
   462 ruby     CALL  write(0x2,0xefbfd0c8,0x2)
   462 ruby     GIO   fd 2 wrote 2 bytes
       ")
       "
   462 ruby     RET   write 2
   462 ruby     CALL  write(0x2,0xefbfd0dc,0x23)
   462 ruby     GIO   fd 2 wrote 35 bytes
       "	from sample/dualstack-fetch.rb:40
       "
   462 ruby     RET   write 35/0x23
   462 ruby     CALL  exit(0x1)