わたなべです。

Koji Arai <JCA02266 / nifty.ne.jp> writes:

> 直すとすれば以下でしょうか?
> 
> | Win32版 ruby (cygwin、mingw、mswin32, bccwin32)では、以下も Thread
> | の切替えが起こらないために timeout できません。
> | 
> |     # Win32ネイティブ版(mingw, mswin32, bccwin32)
> | 
> |     require 'timeout'
> | 
> |     begin
> | 	timeout(5) do
> | 	  $stdin.gets
> | 	end
> |     rescue TimeoutError
> | 	print "timeout\n"
> |     end
> | 
> |     # Cygwin版
> | 
> |     i = 0
> |     begin
> | 	timeout(5) do
> | 	  while true
> | 	      puts (i+=1)
> | 	  end
> | 	end
> |     rescue TimeoutError
> | 	print "timeout\n"
> |     end
> | 
> | win32ネイティブ版では、$stdin.gets が、cygwin では、puts で 
> | Thread の切替えを発生させないためです。

Cygwin版は先日#undef HAVE_SETITIMER相当の変更をしたので、
timeoutします。1.6.8, 1.7.3からということにするのがいいかな。

> この説明だと、以下がちゃんとタイムアウトする理由が不明ではあ
> ります。うーん、puts でダメな理由がいまいちわかってない。
> 
> require 'timeout'
> 
> i = 0
> begin
>   timeout(5) do
>     while true
>     end
>   end
> rescue TimeoutError
>   print "timeout\n"
> end

これもtimeoutしてなかったと思います。
要するにrb_thread_schedule()に移るような処理が間にない限りだ
めだったってことで。sleep(0)やpは内部的にそういう処理をします。

-- 
わたなべひろふみ