MonitorMixin::ConditionVariable#wait timeout

e$B<j85$Ne(B Ubuntu 9.10 e$B$N4D6-$Ge(B Ruby 1.9.2 e$B$re(B make
test-all e$B$9$k$He(B
IMAPTest#test_exception_during_idle e$B$G%O%s%0$7$F=$o$j$^$;$s!#e(B
(net/imap e$B$@$1%F%9%H$9$k$H=
$o$C$?$j$b$7$^$9!#HyL/$J$H$3$m$G$9!#e(B)

e$BD4$Y$F$_$k$H!"%F%9%H$NCf$Ne(B c.wait e$B$G%O%s%0$7$F$$$k$h$&$G$9!#e(B
e$B$3$3$Ge(B c e$B$Oe(B MonitorMixin::ConditionVariable
e$B$N%$%s%9%?%s%9$G$9!#e(B

e$B$H$j$"$($:e(B wait e$B$K%?%$%`%"%&%H$rF~$l$F!"%O%s%0$7$J$$$Ge(B
test-all
e$B$,:G8e$^$G$$$/$h$&$K$7$h$&$+!"$H;W$C$?$N$G$9$,!"e(B
MonitorMixin::ConditionVariable#wait e$B$Ne(B timeout
e$B0z?t$r;XDj$9$k$He(B
timeout is not implemented yet e$B$H$$$&%a%C%;!<%8$Ge(B
NotImplementedError e$B$K$J$C$F$7$^$$$^$9!#e(B

Ruby 1.8 e$B$N$3$m$Oe(B timeout e$B0z?t$,F0:n$7$F$$$?$h$&$J$N$G$9$,!“e(B
Ruby 1.9 e$B$Ge(B timeout
e$B0z?t$,$^$?F0:n$9$k$h$&$K$J$kM=Dj$O$”$k$N$G$7$g$&$+!#e(B
e$B%a%C%;!<%8$+$i$9$k$H$=$N$&$A<BAu$5$l$k$h$&$J46$8$,$9$k$N$G$9$,!#e(B

e$BA0ED$G$9!#e(B

2010e$BG/e(B1e$B7ne(B30e$BF|e(B22:09 Tanaka A. [email protected]:

e$B<j85$Ne(B Ubuntu 9.10 e$B$N4D6-$Ge(B Ruby 1.9.2 e$B$re(B make test-all e$B$9$k$He(B
IMAPTest#test_exception_during_idle e$B$G%O%s%0$7$F=$o$j$^$;$s!#e(B
(net/imap e$B$@$1%F%9%H$9$k$H=
$o$C$?$j$b$7$^$9!#HyL/$J$H$3$m$G$9!#e(B)

e$B$9$_$^$;$s!#e(B

e$B$H$j$“$($:e(B wait e$B$K%?%$%`%”%&%H$rF~$l$F!“%O%s%0$7$J$$$Ge(B test-all
e$B$,:G8e$^$G$$$/$h$&$K$7$h$&$+!”$H;W$C$?$N$G$9$,!"e(B
MonitorMixin::ConditionVariable#wait e$B$Ne(B timeout e$B0z?t$r;XDj$9$k$He(B
timeout is not implemented yet e$B$H$$$&%a%C%;!<%8$Ge(B
NotImplementedError e$B$K$J$C$F$7$^$$$^$9!#e(B

Ruby 1.8 e$B$N$3$m$Oe(B timeout e$B0z?t$,F0:n$7$F$$$?$h$&$J$N$G$9$,!“e(B
Ruby 1.9 e$B$Ge(B timeout e$B0z?t$,$^$?F0:n$9$k$h$&$K$J$kM=Dj$O$”$k$N$G$7$g$&$+!#e(B
e$B%a%C%;!<%8$+$i$9$k$H$=$N$&$A<BAu$5$l$k$h$&$J46$8$,$9$k$N$G$9$,!#e(B

::ConditionVariable#waite$B$,e(Btimeoute$B$KBP1~$7$F$$$k$h$&$J$N$G!"0z?t$re(B
e$B$=$N$^$^EO$9$h$&$K$7$?$$$H;W$$$^$9!#e(B
e$B$?$@!"La$jCM$K$D$$$F$Oe(B1.8e$B$HHs8_49$K$J$j$^$9$,!“e(Btimeoute$B$GJV$C$FMh$?$N$+e(B
e$BH=Dj$9$k=Q$,$J$$$N$G!”>o$Ke(Btruee$B$rJV$9$3$H$K$7$?$$$H;W$$$^$9!#e(B

e$B$D$$$G$K%I%-%e%a%s%H$rDI2C$7$^$9!#e(B

e$BA0ED$5$s!"e(Bakr e$B$5$se(B
e$B1sF#$G$9!#e(B

2010e$BG/e(B2e$B7ne(B5e$BF|e(B14:48 Shugo M. [email protected]:

Ruby 1.8 e$B$N$3$m$Oe(B timeout e$B0z?t$,F0:n$7$F$$$?$h$&$J$N$G$9$,!“e(B
Ruby 1.9 e$B$Ge(B timeout e$B0z?t$,$^$?F0:n$9$k$h$&$K$J$kM=Dj$O$”$k$N$G$7$g$&$+!#e(B
e$B%a%C%;!<%8$+$i$9$k$H$=$N$&$A<BAu$5$l$k$h$&$J46$8$,$9$k$N$G$9$,!#e(B

::ConditionVariable#waite$B$,e(Btimeoute$B$KBP1~$7$F$$$k$h$&$J$N$G!"0z?t$re(B
e$B$=$N$^$^EO$9$h$&$K$7$?$$$H;W$$$^$9!#e(B
e$B$?$@!"La$jCM$K$D$$$F$Oe(B1.8e$B$HHs8_49$K$J$j$^$9$,!“e(Btimeoute$B$GJV$C$FMh$?$N$+e(B
e$BH=Dj$9$k=Q$,$J$$$N$G!”>o$Ke(Btruee$B$rJV$9$3$H$K$7$?$$$H;W$$$^$9!#e(B

e$B$D$$$G$K%I%-%e%a%s%H$rDI2C$7$^$9!#e(B

[Bug #2629] e$B$Ge(B ::ConditionVariable#wait e$B$Ne(B API e$B@_7W$Ke(B
race condition e$B$,e(B
e$B$“$k$3$H$,$o$+$j$^$7$?!#e(B
e$BIC?t$G$O$J$/@dBP;~9o$G;XDj$9$Y$-e(B
(e$B>/$J$/$H$b!”@dBP;~9o$O<u$1IU$1$k$Y$-e(B)
e$B$h$&$G$9!#$^$?!“e(Btimeout
e$B$G5”$C$F$-$?$+$I$&$+$rJV$jCM$H$7$FJV$7$?J}$,e(B
e$B$h$$$H$$$&;XE&$b$"$j$^$9!#e(B

e$B@dBP;~9o$r<u$1IU$1$k$?$a$K$Oe(B thread.c
e$B$r7k9=$$$m$$$mJQ$($J$$$H$$$1$J$$e(B
e$B$N$G!“$9$G$Ke(B feature freeze e$B8e$H$$$&$3$H$b$”$j!“J]<iE*$G$9$,e(B
1.9.2 e$B$G$Oe(B
revert e$B$7$h$&$H;W$$$^$9$,!”$$$+$,$G$7$g$&$+!#e(B

e$B$H$j$“$($:e(B wait e$B$K%?%$%`%”%&%H$rF~$l$F!“%O%s%0$7$J$$$Ge(B test-all
e$B$,:G8e$^$G$$$/$h$&$K$7$h$&$+!”$H;W$C$?$N$G$9$,!"e(B
MonitorMixin::ConditionVariable#wait e$B$Ne(B timeout e$B0z?t$r;XDj$9$k$He(B
timeout is not implemented yet e$B$H$$$&%a%C%;!<%8$Ge(B
NotImplementedError e$B$K$J$C$F$7$^$$$^$9!#e(B

e$B$3$C$A$NLdBj$K4X$7$F$O!“%?%$%_%s%0$K0MB8$9$k$N$GB?>/$@$5$$$G$9$,!”;~4Ve(B
e$B;XDj$Ne(B sleep e$B$r;H$($P$b$C$H4JC1$K$J$k$H;W$$$^$9!#e(B
test/ruby e$B0J2<$K$O$3$s$J%3!<%I$,$?$/$5$s$"$j$^$9!#e(B

e$B$?$@!"$3$N%F%9%H$,%F%9%H$7$?$$$N$,e(B imap.idle
e$B$N%V%m%C%/$+$i$NESCfC&=P$@e(B
e$B$H$7$?$i!"e(Bbreak e$B$9$k$@$1$G$$$$$+$b!)e(B

diff --git a/test/net/imap/test_imap.rb b/test/net/imap/test_imap.rb
index 501298c…b1994b1 100644
— a/test/net/imap/test_imap.rb
+++ b/test/net/imap/test_imap.rb
@@ -217,30 +217,18 @@ class IMAPTest < Test::Unit::TestCase
begin
imap = Net::IMAP.new(“localhost”, :port => port)
begin

  •      th = Thread.current
    
  •      m = Monitor.new
         in_idle = false
    
  •      exception_raised = false
    
  •      c = m.new_cond
    
  •      Thread.start do
    
  •        m.synchronize do
    
  •          until in_idle
    
  •            c.wait(0.1)
    
  •          end
    
  •        end
    
  •        th.raise(Interrupt)
    
  •        exception_raised = true
    
  •      th = Thread.start do
    
  •        Thread.pass until in_idle
    
  •        Thread.main.raise(Interrupt)
         end
         imap.idle do |res|
    
  •        m.synchronize do
    
  •          in_idle = true
    
  •          c.signal
    
  •          until exception_raised
    
  •            c.wait(0.1)
    
  •          end
    
  •        end
    
  •        in_idle = true
    
  •        sleep 1
         end
       rescue Interrupt
    
  •    ensure
    
  •      th.kill if th.alive?
       end
       assert_equal(2, requests.length)
       assert_equal("RUBY0001 IDLE\r\n", requests[0])
    

2010e$BG/e(B5e$B7ne(B5e$BF|e(B9:32 Yusuke ENDOH [email protected]:

[Bug #2629] e$B$Ge(B ::ConditionVariable#wait e$B$Ne(B API e$B@_7W$Ke(B race condition e$B$,e(B
e$B$“$k$3$H$,$o$+$j$^$7$?!#e(B
e$BIC?t$G$O$J$/@dBP;~9o$G;XDj$9$Y$-e(B (e$B>/$J$/$H$b!”@dBP;~9o$O<u$1IU$1$k$Y$-e(B)
e$B$h$&$G$9!#$^$?!“e(Btimeout e$B$G5”$C$F$-$?$+$I$&$+$rJV$jCM$H$7$FJV$7$?J}$,e(B
e$B$h$$$H$$$&;XE&$b$"$j$^$9!#e(B

e$BIC?t$G;XDj$9$Y$-$G$J$$:,5r$O2?$G$7$g$&e(B?

e$B@dBP;~9o$r<u$1IU$1$k$?$a$K$Oe(B thread.c e$B$r7k9=$$$m$$$mJQ$($J$$$H$$$1$J$$e(B
e$B$N$G!“$9$G$Ke(B feature freeze e$B8e$H$$$&$3$H$b$”$j!“J]<iE*$G$9$,e(B 1.9.2 e$B$G$Oe(B
revert e$B$7$h$&$H;W$$$^$9$,!”$$$+$,$G$7$g$&$+!#e(B

1.9.1
e$B$G$OF0$+$J$+$C$?$H$$$&OC$O$“$j$^$9$,!”$3$NIC?t$G%?%$%%"%&%H$9$k5!G=$Oe(B e$B$:$C$H@N$+$i$"$C$F!"F0:n$7$F$$$?$o$1$G$9!#e(B e$BD94|E*$J;kE@$+$i$_$k$H!"$=$l$r6X;_$9$k$H$$$&$N$OJ]<iE*$JA*Br$H$Oe(B e$B$$$($J$$$h$&$K;W$$$^$9!#e(B e$B$$7$m!“IC?t$G;XDj$9$k5!G=$rF0$/$h$&$K$7$F$”$k8=>u$N$[$&$,J]<iE*$G$7$g$&!#e(B

e$B$=$l$rF0$+$J$/$7$F!“>-Mh$b$C$H$$$$e(B API
e$B$KJQ$($k!”$H$$$&$N$O!“e(B
e$BD94|E*$J;kE@$+$i$9$k$HHs8_49@-$rF3F~$9$k$H$$$&OC$G$”$j!"e(B
e$B4JC1$K$&$J$:$1$kOC$G$O$J$$$N$G$O$J$$$G$7$g$&$+!#e(B

e$B$5$i$K!“KAF,$K=R$Y$?5?Ld$K$D$J$,$j$^$9$,!”;d$O!"e(B
e$BIC?t$G;XDj$G$-$k$H$$$&5!G=$O6X;_$9$k$[$I0-$$$b$N$G$O$J$$$H;W$C$F$$$^$9!#e(B

e$B$"$H!"e(Bfeature freeze e$B8e$Ke(B feature
e$B$r:o=|$9$k$N$O$$$$$s$G$9$+e(B?
e$B$=$&$@$H$9$k$He(B freeze e$B$H$$$&46$8$,$7$^$;$s$,!#e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B5e$BF|e(B10:53 Tanaka A. [email protected]:

e$BIC?t$G;XDj$9$Y$-$G$J$$:,5r$O2?$G$7$g$&e(B?

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_cond_wait.html

e$B$G!"e(Bpthread e$B$Ne(B RATIONALE e$B$H$7$F@bL@$5$l$F$$$^$9!#e(B

e$B%^%k%A%9%l%C%I4X78$Oe(B API e$B@_7W$b<BAu$be(B (e$B;d$K$Oe(B)
e$B$H$F$bFq$7$$$N$G!"e(B
pthread e$B$J$I8O$l$?@7W$,Cm0UE@$H$7$F>e$2$F$$$k$H$3$m$O!"LUL\E*$Ke(B
e$B??;w$k$N$,$$$$$H;W$C$F$7$^$$$^$9!#e(B
e$B$=$N$;$$$G!"Nc30$
$?$$$Ke(B C
e$B$K$J$$MWAG$,8=$l$k$H$-$O%f!<%6$N@UG$$Ke(B
e$B$J$C$F$7$^$&$N$,$$$1$F$J$$$G$9$,!#e(B[Bug #3212]

e$B!V<+?.$,$J$$$+$i2<<j$K$$$8$j$?$/$J$$!W$H$$$&$N$,;d$NF05!$J$N$G!“e(B
akr e$B$5$s$,6/$/?d$9$N$G$”$l$Pe(B
(e$B$“$H<BAu$b$7$F$/$l$k$N$G$”$l$Pe(B) e$B!"e(B
akr e$B$5$s$NJ}$r?.$8$^$9!#e(B

e$B@dBP;~9o$r<u$1IU$1$k$?$a$K$Oe(B thread.c e$B$r7k9=$$$m$$$mJQ$($J$$$H$$$1$J$$e(B
e$B$N$G!“$9$G$Ke(B feature freeze e$B8e$H$$$&$3$H$b$”$j!“J]<iE*$G$9$,e(B 1.9.2 e$B$G$Oe(B
revert e$B$7$h$&$H;W$$$^$9$,!”$$$+$,$G$7$g$&$+!#e(B

1.9.1 e$B$G$OF0$+$J$+$C$?$H$$$&OC$O$“$j$^$9$,!”$3$NIC?t$G%?%$%%"%&%H$9$k5!G=$Oe(B e$B$:$C$H@N$+$i$"$C$F!"F0:n$7$F$$$?$o$1$G$9!#e(B e$BD94|E*$J;kE@$+$i$_$k$H!"$=$l$r6X;_$9$k$H$$$&$N$OJ]<iE*$JA*Br$H$Oe(B e$B$$$($J$$$h$&$K;W$$$^$9!#e(B e$B$$7$m!“IC?t$G;XDj$9$k5!G=$rF0$/$h$&$K$7$F$”$k8=>u$N$[$&$,J]<iE*$G$7$g$&!#e(B

1.8 e$B$Ne(B ::ConditionVariable#wait e$B$K$Oe(B timeout
e$B$J$$$h$J$“$H;W$C$?$ie(B
MonitorMixin::ConditionVariable#wait e$B$G$O<+NO$G<BAu$7$F$$$?$N$G$9e(B
e$B$M!#F1$8$h$&$K$9$l$P!”$H;W$C$?$1$l$I!"e(BThread.critical=
e$B$r;H$C$F$ke(B
e$B$N$G$9$M!#$&!<$s!#e(B

e$B$=$l$rF0$+$J$/$7$F!“>-Mh$b$C$H$$$$e(B API e$B$KJQ$($k!”$H$$$&$N$O!“e(B
e$BD94|E*$J;kE@$+$i$9$k$HHs8_49@-$rF3F~$9$k$H$$$&OC$G$”$j!"e(B
e$B4JC1$K$&$J$:$1$kOC$G$O$J$$$N$G$O$J$$$G$7$g$&$+!#e(B

1.9.2 e$B$re(B 1.9.1 e$B$N5sF0$KLa$9$@$1$G$9!#e(B

e$B$5$i$K!“KAF,$K=R$Y$?5?Ld$K$D$J$,$j$^$9$,!”;d$O!"e(B
e$BIC?t$G;XDj$G$-$k$H$$$&5!G=$O6X;_$9$k$[$I0-$$$b$N$G$O$J$$$H;W$C$F$$$^$9!#e(B

e$B40A4$K6X;$7$?J}$,e(B pthread e$B$Ne(B RATIONALE
e$B$G5s$2$i$l$F$$$kLdBj$K$Oe(B
e$B$$$$$N$+$b$7$l$^$;$s$,!"MxJX@-E*$K$be(B 1.8
e$B$H$N8_49@-E*$K$b!"40A4$Ke(B
e$B6X;
$9$k$N$O$J$$$+$J$“!”$H$O;W$$$^$9!#e(B

e$B$"$H!"e(Bfeature freeze e$B8e$Ke(B feature e$B$r:o=|$9$k$N$O$$$$$s$G$9$+e(B?
e$B$=$&$@$H$9$k$He(B freeze e$B$H$$$&46$8$,$7$^$;$s$,!#e(B

feature freeze e$B$O?75,$KF3F~e(Be$B$5$l$&$ke(B feature
e$B$N3NDj$G$9!#e(B
e$B8@$o$l$F$_$l$P8@MU$,E,@Z$G$J$+$C$?$+$b$7$l$^$;$s!#e(Bfeature request
deadline e$B$H$+$NJ}$,$h$+$C$?!#e(B

feature set e$B$N3NDj$Oe(B 5
e$B7nKv$HL@5-$7$F$"$j$^$9!#$=$l$^$G$K0BDj$7e(B
e$B$J$+$C$?e(B feature e$B$Oe(B revert e$B$5$l$^$9!#e(BAPI
e$B@_7W>e$NLdBj$O2r7h$7$h$&e(B
e$B$,$J$$$N$G!"e(Brevert e$B$7$+$J$$$H;W$$$^$9!#e(B

=== release 1.9.2-preview2 (31 May.) ===

  • fix 1.9.2 feature set
  • 1.9.2 will NOT include all features that are not stable yet or that
    are considered uncompleted at this time; they will be reverted

2010e$BG/e(B5e$B7ne(B5e$BF|e(B11:46 Yusuke ENDOH [email protected]:

e$BIC?t$G;XDj$9$Y$-$G$J$$:,5r$O2?$G$7$g$&e(B?

pthread_cond_timedwait

e$B$G!"e(Bpthread e$B$Ne(B RATIONALE e$B$H$7$F@bL@$5$l$F$$$^$9!#e(B

Timed Wait Semantics e$B$N9`$G$9$+e(B?

e$B!V<+?.$,$J$$$+$i2<<j$K$$$8$j$?$/$J$$!W$H$$$&$N$,;d$NF05!$J$N$G!“e(B
akr e$B$5$s$,6/$/?d$9$N$G$”$l$Pe(B (e$B$“$H<BAu$b$7$F$/$l$k$N$G$”$l$Pe(B) e$B!"e(B
akr e$B$5$s$NJ}$r?.$8$^$9!#e(B

e$B@N$+$i$“$k5!G=$J$N$G!”$$$8$j$?$/$J$1$l$P8=>u$,$$$$$N$G$Oe(B?

1.9.2 e$B$re(B 1.9.1 e$B$N5sF0$KLa$9$@$1$G$9!#e(B

e$B$=$&$O$$$C$F$be(B 1.8 e$B0JA0$GF0$$$F$$$?$b$N$,e(B 1.9.1
e$B$GF0$+$J$$$7$J$!!#e(B

e$BK\Ev$K6X;$9$Y$-$b$N$J$ie(B
e$B$?$^$?$^e(B 1.9.1
e$B$GF0$+$J$+$C$?$N$G!"$3$l9,$$$H6X;
$7$F$7$^$&!“$H$$$&$N$be(B
e$B$”$j$&$kA*Br;h$+$b$7$l$^$;$s$,!#e(B

e$BLdBj$OK\Ev$K6X;_$9$Y$-$b$N$J$N$+!"$H$$$&E@$G$9$M!#e(B

e$B40A4$K6X;$7$?J}$,e(B pthread e$B$Ne(B RATIONALE e$B$G5s$2$i$l$F$$$kLdBj$K$Oe(B
e$B$$$$$N$+$b$7$l$^$;$s$,!"MxJX@-E*$K$be(B 1.8 e$B$H$N8_49@-E*$K$b!"40A4$Ke(B
e$B6X;
$9$k$N$O$J$$$+$J$“!”$H$O;W$$$^$9!#e(B

e$B$$=$i$/e(B absolute time e$B$Oe(B Time
e$B%
%V%8%'%/%H$G;XDj$9$k$3$H$K$J$k$G$7$g$&!#e(B
e$B$=$l$Oe(B relative time
e$B$rIC?t$J?tCM$G;XDj$9$k$N$H%/%i%9$J$$$7%a%=%C%I$G6hJL$G$-!"e(B
e$BN>J}%5%]!<%H$9$k$3$H$,2DG=$G$7$g$&!#e(B

e$B$=$&$$$&>uBV$rL;X$9$J$i!"e(Brelative time e$B$N5!G=$,e(B
1.9.2 e$B$GF0$+$J$$$3$H$K$3$@$o$kI,MW$O$J$$$s$8$c$J$$$G$7$g$&$+!#e(B
e$B:G=E$K$O<BAu$9$k$3$H$K$J$k$o$1$G$9$7!#e(B

feature set e$B$N3NDj$Oe(B 5 e$B7nKv$HL@5-$7$F$"$j$^$9!#$=$l$^$G$K0BDj$7e(B
e$B$J$+$C$?e(B feature e$B$Oe(B revert e$B$5$l$^$9!#e(BAPI e$B@_7W>e$NLdBj$O2r7h$7$h$&e(B
e$B$,$J$$$N$G!"e(Brevert e$B$7$+$J$$$H;W$$$^$9!#e(B

e$B$3$N5!G=$O@N$+$i$+$J$j0BDjE*$KDs6!$5$l$F$-$?5!G=$H$$$($J$$$G$7$g$&$+!#e(B

e$B>.:j$G$9e(B

e$BAGKQ$J5?Ld$G$9$,e(B ConditionVariable#wait
e$B$O2?8NIC?t$rJV$7$F$$$k$N$G$7$g$&$+!)e(B
e$B0z?t$,e(Bfloate$B$J$iJV5QCM$be(Bfloate$B$K$9$k$Y$-$@$H;W$$$^$9$,!#$=$&$9$l$P8mH=Dj$Oe(B
e$B$@$$$V8:$k$h$&$Je(B

2010e$BG/e(B5e$B7ne(B5e$BF|e(B13:22 Yusuke ENDOH [email protected]:

Timed Wait Semantics e$B$N9`$G$9$+e(B?

e$B$=$3$He(B Timed Condition Wait e$B$N$H$3$m$G$9!#e(B
e$B$?$@$7@5D>!“$=$NJ8>O$r@5$7$/M}2r$G$-$F$$$k<+?.$O$”$^$j$"$j$^$;$s!#e(B

e$B$“$NJ8>O$,8@$C$F$$$k$3$H$b$b$C$H$b$J$s$@$1$I!”$8$c$“;~9oJQ99$He(Bracee$B$,5/$-$?$ie(B
e$B$I$&$9$k$s$@$m$&$H$+0c$&LdBj$,$”$k5$$,$9$k$s$G$9$h$M$'!#e(B
e$B;d$,J,$+$C$F$J$$$@$1$+$b$7$l$^$;$s$,!#e(B

Timed Wait Semantics

e$B$N9`$K$O;~9o%9%-%C%W$,5/$-$?>l9g$NF0:n$K$D$$$Fe(B

e$B@bL@$O$“$j$^$9$,!”;~9o4,$-La$7;~$OKm$rG($i$;$H8@$C$F$$$k$h$&$K46$8$ke(B

e$B@dBP;~9o$,;XDj$G$-$J$$8B$j!“!V@5$7$$;H$$J}!W$,B8:_$7$J$$$H;W$$$^$9!#e(B
e$B$J$N$G!”@dBP;~9o;XDj$,<BAu$5$l$J$$8B$j!“e(B1.9.2 e$B$GCfESH>C<$J$b$N$HDs6!e(B
e$B$9$Y$-$G$J$$$H;W$$$^$9!#e(B
e$B@dBP;~9o;XDj$be(B new feature e$B$J$N$G!”:#$+$ie(B 1.9.2 e$B$K@9$j9~$`$Y$-$G$J$$e(B
e$B$H;W$$$^$9$,!“<BAu$9$k?M$,$$$k$J$iCG8GH?BP$H$$$&$[$I$G$O$”$j$^$;$s!#e(B

e$B$$$d$!!“AjBP;~9o$O$&$l$7$$$G$9$h!#E57?E*%f!<%9%1!<%9$Ke(BLaie$B$5$s$,$”$2$F$$$ke(B
Ne$BIC$K0l2s5/>2$7$F$-$FDj4|=hM}$r<B9T$9$k$H$$$&$N$,$"$j$^$9$,!"e(B
e$BMW5a$,!Ve(BNe$BIC$K#12s!W$J$N$GAjBP;~9o$N$[$&$,AGD>$@$7ICC10L$NOC$r$7$F$k$J$ie(B
preempte$B$N8m:9$J$s$F$?$+$,CN$l$F$$$k$7!&!&e(B

Timed Condition Wait
e$B$N$[$&$NOC$O@dBP;~9o$r0z?t$K$H$k$H$$$&0F$He(BLinuxe$B$Ne(Bselect(2)e$B$Ne(B
e$B$h$&$K7P2a;~9o$rJV$9$H$$$&0F$Ne(B2e$B0F$,$"$k$N$@$1$I!“AjBP;~9oe(BAPIe$B$O@dBP;~9oe(BAPIe$B$Ne(B
e$B%i%C%Q$H$7$F<BAu$G$-$k$G$7$g!#$H$$$&$N$,e(Bpthreade$B$NM}6~$@$H;W$C$F$$$Fe(B
e$B$”$s$^$j;H$$>!<j$X$NG[N8$,$J$$$J$!$H46$8$F$$$^$9!#e(B

e$B$^$?e(B [Bug #2629] e$B$G$O!“e(Btimeout e$B$G%j%?!<%s$7$?$+$I$&$+$rJV$jCM$H$7$Fe(B
e$BEA$($k$Y$-$@!”$H$$$&;XE&$b$"$j$^$9!#$3$l$,!"e(B

  • e$B$J$$$H$^$:$$e(B
  • e$B$J$/$F$b$h$$e(B
  • e$B$"$k$H$^$:$$e(B

e$B$N$I$l$+$H$$$&H=CG$b$$$^$$$A$7$+$M$F$$$^$9!#$3$C$A$O$I$&;W$$$^$9$+!)e(B

+1 => e$B$J$$$H$^$:$$e(B

e$B0lHLO@$H$7$F$$$&$H!"860xITL@$G$b<BAu$G$-$k$N$O%j%H%i%$$,0BA4$J%1!<%9$K8B$i$l$k$H;W$C$F$$$Fe(B
Cond#waite$B$N>l9g!“e(BCond#signale$B$5$l$?$”$H$b$&0l2se(Bwaite$B$9$k$H?2$F$7$^$&$N$Ge(B
e$B!V$G$-$k$+$$1!W$HJI$rC!$/%1!<%9$,=P$k$s$8$c$J$$$+$Je(B

e$BKM$NCf$G$O!"AjBP;~9o$r<h$C$F$$$k$3$H$h$j$be(B

e$B!&7P2a;~9o$,IC?t$K4]$a$i$l$F$*$j!"$+$De(B
e$B!&e(BETIMEDOUTe$B$+$I$&$+$rCN$k<jCJ$,$J$$e(B

e$B$,LdBj$K8+$($^$9!#e(B

e$B40A4$KM>CL$G$9$,!"e(BMutex#locked? e$B$b%m%8%C%/Cf$G;H$&$Y$-$G$J$$MWCm0Ue(B

e$B%a%=%C%I$@$H;W$C$F$$$^$9!#e(B

- Mutex#locked? はいらない子? - まめめも

- Mutex#locked? はいらない子?の続き - まめめも

e$BC&@~$D$$$G$Ke(BLinux kernele$B$NOC$r$9$k$H!"e(Bhogehoge_is_locked()
e$B$O$[$H$s$Ie(BBUG_ON
e$B!Je(BLinuxe$B$NCf$G$Ne(Basserte$BAjEv!K$G;H$o$l$F$$$^$9!#e(B
e$B!J0lIte(BAdaptive mutexe$BEy$N<BAu$K;H$C$F$$$kJQBV$5$s$,$$$k$1$I!Ke(B

e$B$G!“%F%9%H$H$+$r9M$($k$H4X?t@hF,$K!Ve(BXYe$B%m%C%/$,$H$l$F$J$+$C$?$ie(Bpanice$B!W$H$$$&e(B
e$B=hM}$OMWK>$,$”$k$h$&$K;W$$$^$9!Je(BRubye$B$@$HNc30$K$J$k$N$+$Je(B?e$B!Ke(B

e$B;d$NM}2r$G$O!“$”$C$A$N@$3&$G=jM-<T%A%'%C%/$r$7$F$$$J$$$N$O!"e(B
e$BC1$K$[$%G%P%C%0MQ$N5!G=$KJ#;($J<BAuF~$l9~$_$?$/$J$$$+$ie(B
e$B$@$HM}2r$7$F$$$^$9!#e(B

e$B$J$N$G!"e(BRubye$B$Ne(BMutex#is_locked? e$B$bF1$8$G!"e(Binitial
implemente$B;~$Ke(B
ownere$B$r<BAu$9$k$N$,LLE]$@$C$?$@$1$@$H?dB,$7$F$$$^$9!#e(B

Mutex#own?
e$B$N<BAu$K$D$$$F$O!VH?BP$9$kM}M3$O$J$$$1$I;vA0$G$O$-$C$H$d$i$J$$!We(B
e$B$0$i$$$N2ACM4Q$G$9$+$M$'!#e(Bunless is_locked? e$B$Ne(Bfalse
positivee$B$OBgJQ%l%"$J$N$Ge(B
e$B%F%9%HDxEY$J$i:$$j$^$;$s$7!#e(Brdoce$B$KCm0U=q$-$0$i$$$,3Z$G$h$$$N$G$O$J$$$+$J$!e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B5e$BF|e(B12:56 Tanaka A. [email protected]:

2010e$BG/e(B5e$B7ne(B5e$BF|e(B11:46 Yusuke ENDOH [email protected]:

e$BIC?t$G;XDj$9$Y$-$G$J$$:,5r$O2?$G$7$g$&e(B?

pthread_cond_timedwait

e$B$G!"e(Bpthread e$B$Ne(B RATIONALE e$B$H$7$F@bL@$5$l$F$$$^$9!#e(B

Timed Wait Semantics e$B$N9`$G$9$+e(B?

e$B$=$3$He(B Timed Condition Wait e$B$N$H$3$m$G$9!#e(B
e$B$?$@$7@5D>!“$=$NJ8>O$r@5$7$/M}2r$G$-$F$$$k<+?.$O$”$^$j$"$j$^$;$s!#e(B

e$BK\Ev$K6X;$9$Y$-$b$N$J$ie(B
e$B$?$^$?$^e(B 1.9.1 e$B$GF0$+$J$+$C$?$N$G!"$3$l9,$$$H6X;
$7$F$7$^$&!“$H$$$&$N$be(B
e$B$”$j$&$kA*Br;h$+$b$7$l$^$;$s$,!#e(B

e$BLdBj$OK\Ev$K6X;_$9$Y$-$b$N$J$N$+!"$H$$$&E@$G$9$M!#e(B

e$B;H$C$?$ie(B race condition e$B$NH/@8$rB%?J$7$F$7$^$&$h$&$Je(B API
e$B$@$H$7$?$i!"e(B
e$BDs6!$9$Y$-$G$J$$$H;W$$$^$9!#e(B
e$B>/$J$/$H$b!"e(Brdoc
e$B$GCm0U$H@5$7$$;H$$J}$r<($9$Y$-$@$H;W$$$^$9!#e(B

e$B@dBP;~9o$,;XDj$G$-$J$$8B$j!“!V@5$7$$;H$$J}!W$,B8:_$7$J$$$H;W$$$^$9!#e(B
e$B$J$N$G!”@dBP;~9o;XDj$,<BAu$5$l$J$$8B$j!“e(B1.9.2
e$B$GCfESH>C<$J$b$N$HDs6!e(B
e$B$9$Y$-$G$J$$$H;W$$$^$9!#e(B
e$B@dBP;~9o;XDj$be(B new feature e$B$J$N$G!”:#$+$ie(B 1.9.2
e$B$K@9$j9~$`$Y$-$G$J$$e(B
e$B$H;W$$$^$9$,!“<BAu$9$k?M$,$$$k$J$iCG8GH?BP$H$$$&$[$I$G$O$”$j$^$;$s!#e(B

e$B$^$?e(B [Bug #2629] e$B$G$O!“e(Btimeout
e$B$G%j%?!<%s$7$?$+$I$&$+$rJV$jCM$H$7$Fe(B
e$BEA$($k$Y$-$@!”$H$$$&;XE&$b$"$j$^$9!#$3$l$,!"e(B

  • e$B$J$$$H$^$:$$e(B
  • e$B$J$/$F$b$h$$e(B
  • e$B$"$k$H$^$:$$e(B

e$B$N$I$l$+$H$$$&H=CG$b$$$^$$$A$7$+$M$F$$$^$9!#$3$C$A$O$I$&;W$$$^$9$+!)e(B

e$B40A4$KM>CL$G$9$,!"e(BMutex#locked?

e$B$b%m%8%C%/Cf$G;H$&$Y$-$G$J$$MWCm0Ue(B

e$B%a%=%C%I$@$H;W$C$F$$$^$9!#e(B

- Mutex#locked? はいらない子? - まめめも

- Mutex#locked? はいらない子?の続き - まめめも

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B19:39 Tanaka A. [email protected]:

e$B$^$?!"e(B[ruby-dev:41162] e$B$G;XE&$5$l$F$$$k$h$&$K!“e(B
e$B%7%9%F%$N;~9o$,JQ$o$k>l9g!"%W%m%0%i%^$N0U?^$,e(B relative time e$B$J$N$Ke(B absolute time e$B$G<BAu$9$k$H!";~9o$r?J$a$k>l9g$O0U?^$h$j$bAa$/%?%$%%”%&%H$7!“e(B
e$B;~9o$r4,$-La$9>l9g$O0U?^$h$j$bCY$/%?%$%`%”%&%H$7$^$9!#e(B
e$BAa$$$N$O:FEYBT$F$P$$$$$3$H$G$9$,!"CY$$$N$O<h$jJV$7$,$D$+$J$$$+$b$7$l$^$;$s!#e(B

Mutex.sleep e$B$Oe(B pthread_cond_timedwait
e$B$G<BAu$5$l$F$$$k$?$a!"e(BAPI e$B>e$Ge(B
relative time
e$B$r<u$1<h$C$F$b%7%9%F%`%/%m%C%/JQ99BP:v$O<B8=$G$-$J$$$Ne(B
e$B$G$O$J$$$G$7$g$&$+!#e(B

e$B@dBP;~9o;XDj$be(B new feature e$B$J$N$G!“:#$+$ie(B 1.9.2 e$B$K@9$j9~$`$Y$-$G$J$$e(B
e$B$H;W$$$^$9$,!”<BAu$9$k?M$,$$$k$J$iCG8GH?BP$H$$$&$[$I$G$O$"$j$^$;$s!#e(B

e$B$H$j$"$($:e(B race e$B$O5$$K$7$J$$$3$H$Ge(B API e$B$@$1e(B Time e$B$b<u$1IU$1$k$h$&$K$9$k$J$ie(B
ConditionVariable#wait e$B$N@hF,$Ke(B

?# xxx: mutex.sleep should support Time argument.
?timeout = timeout - Time.now if timeout.kind_of? Time

e$B$HF~$l$k$H$+$G$7$g$&$+!#e(B

e$B$(!<!<!#$H;W$$$^$9$,!“e(BCV#wait e$B$Ke(B timeout e$B$rF~$l$?e(B akr
e$B$5$s$O0l;~E*$Ke(B
thread.rb e$B$N%a%s%F%J$G$”$k$H9M$($^$9!#e(B[Bug #2629]
e$B$N7o$b$"$o$;$F0z$-e(B
e$B$H$C$FD:$1$k$J$i!"H?BP$7$^$;$s!#e(B

2010e$BG/e(B5e$B7ne(B5e$BF|e(B13:22 Yusuke ENDOH [email protected]:

e$B$=$3$He(B Timed Condition Wait e$B$N$H$3$m$G$9!#e(B
e$B$?$@$7@5D>!“$=$NJ8>O$r@5$7$/M}2r$G$-$F$$$k<+?.$O$”$^$j$"$j$^$;$s!#e(B

e$B>.:j$5$s$NOC$b9M$($k$H!“7k6I!”%W%m%0%i%^$N0U?^$,e(B
absolute time e$B$J$H$-$Oe(B absolute time e$B$G;XDj$7!"e(B
relative time e$B$J$H$-$Oe(B relative time e$B$G;XDj$9$Y$-!"e(B
e$B$J$s$8$c$J$$$+$H$$$&5$$,$7$^$9!#e(B

POSIX e$B$N5-=R$K$“$k$h$&$K!”%W%m%0%i%^$N0U?^$,e(B absolute time
e$B$J$N$Ke(B
relative time e$B$G<BAu$9$k$H!“e(Brelative time
e$B$NCM$r7W;;$7$?%?%$%_%s%0$He(B
e$B$=$NCM$,e(B wait e$BFb$G;H$o$l$k4V$N;~4V$,2CL#$5$l$^$;$s!#e(B
e$B2DG=@-$H$7$F$O$=$N;~4V$K%3%s%F%-%9%H%9%$%C%A$5$l$?$j$7$F4|BT$9$k$[$I$Ke(B
e$BC;$$;~4V$G$O$J$$$+$b$7$l$J$$!”$H$$$&$N$,e(B POSIX
e$B$N$$$o$s$H$7$F$$$k$H$3$m$@$He(B
e$BM}2r$7$^$7$?!#e(B

e$B$^$?!"e(B[ruby-dev:41162] e$B$G;XE&$5$l$F$$$k$h$&$K!“e(B
e$B%7%9%F%$N;~9o$,JQ$o$k>l9g!"%W%m%0%i%^$N0U?^$,e(B relative time e$B$J$N$Ke(B absolute time e$B$G<BAu$9$k$H!";~9o$r?J$a$k>l9g$O0U?^$h$j$bAa$/%?%$%%”%&%H$7!“e(B
e$B;~9o$r4,$-La$9>l9g$O0U?^$h$j$bCY$/%?%$%`%”%&%H$7$^$9!#e(B
e$BAa$$$N$O:FEYBT$F$P$$$$$3$H$G$9$,!"CY$$$N$O<h$jJV$7$,$D$+$J$$$+$b$7$l$^$;$s!#e(B

e$B$3$l$i$r9M$($k$H!"$I$A$i$N0U?^$b$J$k$Y$/@5$7$/<BAu$9$k$K$O!"e(B
e$B$I$A$i$N0U?^$bI=8=$G$-$ke(B API e$B$K$9$Y$-$G!"e(Babsolute time
e$B$He(B relative time e$B$rN>J}e(B
e$B<u$1IU$1$k$7$+$J$$$s$8$c$J$$$G$7$g$&$+!#e(B

e$B@dBP;~9o;XDj$be(B new feature e$B$J$N$G!“:#$+$ie(B 1.9.2 e$B$K@9$j9~$`$Y$-$G$J$$e(B
e$B$H;W$$$^$9$,!”<BAu$9$k?M$,$$$k$J$iCG8GH?BP$H$$$&$[$I$G$O$"$j$^$;$s!#e(B

e$B$H$j$"$($:e(B race e$B$O5$$K$7$J$$$3$H$Ge(B API e$B$@$1e(B Time
e$B$b<u$1IU$1$k$h$&$K$9$k$J$ie(B
ConditionVariable#wait e$B$N@hF,$Ke(B

xxx: mutex.sleep should support Time argument.

timeout = timeout - Time.now if timeout.kind_of? Time

e$B$HF~$l$k$H$+$G$7$g$&$+!#e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B20:13 Tanaka A. [email protected]:

e$B$=$&$$$&4D6-$G$O@5$7$/F0$-!“$=$&$G$J$$4D6-$G$O;DG0$G$9$,e(B
e$B;~9o$r4,$-La$7$?>l9g$OCY$/%?%$%`%”%&%H$9$k$3$H$K$J$k$G$7$g$&!#e(B

e$B$7$+$7!"e(Babsolute time e$B$7$+;XDj$G$-$J$1$l$P!“e(B
e$BCY$/%?%$%`%”%&%H$7$J$$$H$$$&5!G=$rDs6!$9$k$3$H$OIT2DG=$G$9!#e(B

e$B$=$&$G$9$M!#N>J}<u$1IU$1$i$l$k$h$&$K$9$k$N$KH?BP$G$O$"$j$^$;$s!#e(B

e$B$(!<!<!#$H;W$$$^$9$,!“e(BCV#wait e$B$Ke(B timeout e$B$rF~$l$?e(B akr e$B$5$s$O0l;~E*$Ke(B
thread.rb e$B$N%a%s%F%J$G$”$k$H9M$($^$9!#e(B[Bug #2629] e$B$N7o$b$"$o$;$F0z$-e(B
e$B$H$C$FD:$1$k$J$i!"H?BP$7$^$;$s!#e(B

e$B;d$O<+J,$,e(B thread.rb e$B$N%a%s%F%J$G$"$k$H$O9M$($F$$$^$;$s!#e(B

[Bug #2629] e$B$Oe(B CV#wait e$B$Ke(B timeout
e$B$,F~$C$?$;$$$G@8$8$?LdBj$G$9!#e(B

#2629
e$B$N5!G=$O!":Y$+$$$3$H$r8@$($P;EMMJQ99$rH<$$$^$9!#$=$l$,>.:j$5$s$Ne(B
e$B8@$&$h$&$K!V$J$$$H$^$:$$!W5!G=$@$H$7$?$i!“e(BCV#wait e$B$Ke(B timeout
e$B$rDI2C$9$ke(B
e$B:]$Ne(B API e$B@_7W$KITHw$,$”$C$?$H$$$&$3$H$@$H;W$$$^$9!#e(B
e$B$J$N$G!“86B’$K=>$($Pe(B revert e$B$7$+A*Br;h$O$”$j$^$;$s!#e(B

e$B$?$@!“$=$l$J$j$K0BDj$7$F$$$F<{MW$b$”$k$i$7$$5!G=$J$N$G!“e(Bthread.rb
e$B$Ne(B
e$B%a%s%F%J$,$$$l$P$=$N:[NL$NHO0OFb$G7h$a$F$$$$$N$G$O!”$H;W$$$^$9!#e(B
akr e$B$5$s$,e(B (e$B0l;~E*$G$$$$$N$Ge(B)
e$B%a%s%F%J$H$J$C$F=hM}$7$F$/$l$^$;$s$+!#e(B

2010e$BG/e(B5e$B7ne(B5e$BF|e(B16:48 KOSAKI Motohiro
[email protected]:

+1 => e$B$J$$$H$^$:$$e(B

e$B0lHLO@$H$7$F$$$&$H!"860xITL@$G$b<BAu$G$-$k$N$O%j%H%i%$$,0BA4$J%1!<%9$K8B$i$l$k$H;W$C$F$$$Fe(B
Cond#waite$B$N>l9g!“e(BCond#signale$B$5$l$?$”$H$b$&0l2se(Bwaite$B$9$k$H?2$F$7$^$&$N$Ge(B
e$B!V$G$-$k$+$$1!W$HJI$rC!$/%1!<%9$,=P$k$s$8$c$J$$$+$Je(B

e$B$?$H$(e(B wait e$B$,e(B ETIMEDOUT e$B$GJV$C$FMh$?$H$7$F$b!"e(B
signal
e$B$5$l$F$$$J$$$3$H$OJ]>Z$5$l$J$$$N$G$O$J$$$+$H;W$&$s$G$9$,$I$&$G$7$g$&e(B?

wait e$B$,%?%$%`%"%&%H$GD|$a$?8e!"e(Bmutex e$B$r%m%C%/$9$kA0$K!"e(B
e$BB>$N%9%l%C%I$K%3%s%F%-%9%H%9%$%C%A$7$Fe(B signal
e$B$,5/$3$k$3$H$OL5$$$s$G$7$g$&$+!#e(B

e$B$b$7M-$k$H$9$k$H!“e(BETIMEDOUT
e$B$G%j%H%i%$$9$k$H!”?2$F$7$^$C$F1J5W$K5/$-$J$$!"e(B
e$B$H$$$&>e5-$G7|G0$5$l$F$$$k>u67$K7k6I$J$jF@$k$N$G$O$J$$$+$H;W$&$s$G$9$,!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B19:58 Yusuke ENDOH [email protected]:

Mutex.sleep e$B$Oe(B pthread_cond_timedwait e$B$G<BAu$5$l$F$$$k$?$a!"e(BAPI e$B>e$Ge(B
relative time e$B$r<u$1<h$C$F$b%7%9%F%`%/%m%C%/JQ99BP:v$O<B8=$G$-$J$$$Ne(B
e$B$G$O$J$$$G$7$g$&$+!#e(B

e$B$=$&$G$9$M!#e(B
relative time
e$B$G<u$1IU$1$k5!G=?t$,$"$k4D6-$G$7$+40A4$K$O<B8=$G$-$J$$e(B
e$B$+$b$7$l$^$;$s!#e(B
(MacOS X e$B$Ne(B pthread_cond_timedwait_relative_np e$B$H$+e(B?)

e$B$=$&$$$&4D6-$G$O@5$7$/F0$-!“$=$&$G$J$$4D6-$G$O;DG0$G$9$,e(B
e$B;~9o$r4,$-La$7$?>l9g$OCY$/%?%$%`%”%&%H$9$k$3$H$K$J$k$G$7$g$&!#e(B

e$B$7$+$7!"e(Babsolute time e$B$7$+;XDj$G$-$J$1$l$P!“e(B
e$BCY$/%?%$%`%”%&%H$7$J$$$H$$$&5!G=$rDs6!$9$k$3$H$OIT2DG=$G$9!#e(B

e$B$(!<!<!#$H;W$$$^$9$,!“e(BCV#wait e$B$Ke(B timeout e$B$rF~$l$?e(B akr e$B$5$s$O0l;~E*$Ke(B
thread.rb e$B$N%a%s%F%J$G$”$k$H9M$($^$9!#e(B[Bug #2629] e$B$N7o$b$"$o$;$F0z$-e(B
e$B$H$C$FD:$1$k$J$i!"H?BP$7$^$;$s!#e(B

e$B;d$O<+J,$,e(B thread.rb e$B$N%a%s%F%J$G$"$k$H$O9M$($F$$$^$;$s!#e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B20:58 Tanaka A. [email protected]:

e$B$?$H$(e(B wait e$B$,e(B ETIMEDOUT e$B$GJV$C$FMh$?$H$7$F$b!"e(B
signal e$B$5$l$F$$$J$$$3$H$OJ]>Z$5$l$J$$$N$G$O$J$$$+$H;W$&$s$G$9$,$I$&$G$7$g$&e(B?

wait e$B$,%?%$%`%"%&%H$GD|$a$?8e!"e(Bmutex e$B$r%m%C%/$9$kA0$K!"e(B
e$BB>$N%9%l%C%I$K%3%s%F%-%9%H%9%$%C%A$7$Fe(B signal e$B$,5/$3$k$3$H$OL5$$$s$G$7$g$&$+!#e(B

e$B>/$J$/$H$be(B pthread e$B$G$OJ]>Z$5$l$F$$$^$;$s!#Nc$Ne(B pthread
e$B$Ne(B RATIONALE e$B$K$be(B

Similarly, when pthread_cond_timedwait() returns with the timeout
error,
the associated predicate may be true due to an unavoidable race
between
the expiration of the timeout and the predicate state change.

The application needs to recheck the predicate on any return because
it
cannot be sure there is another thread waiting on the thread to handle
the signal, and if there is not then the signal is lost. The burden is
on the application to check the predicate.

e$B$H!“e(BETIMEOUT e$B$+$I$&$+$K4X$o$i$:e(B predicate
e$B$O%A%'%C%/$7$m!”$H$"$j$^$9!#e(B

e$B$b$7M-$k$H$9$k$H!“e(BETIMEDOUT e$B$G%j%H%i%$$9$k$H!”?2$F$7$^$C$F1J5W$K5/$-$J$$!"e(B
e$B$H$$$&>e5-$G7|G0$5$l$F$$$k>u67$K7k6I$J$jF@$k$N$G$O$J$$$+$H;W$&$s$G$9$,!#e(B

e$B$3$N$h$&$Ke(B ETIMEOUT e$B$Oe(B CV#wait
e$B$N8m$C$?;H$$J}$r?d>)$7$+$M$J$$J*$J$N$G!“e(B
e$B;d$be(B #2629
e$B$G:G=i$OH?BP$7$F$$$^$7$?!#$=$l$G$b!V$J$$$H$^$:$$!W$3$H$,$J$$e(B
e$B$N$+$I$&$+<+?.$,$”$j$^$;$s!#<+?.$,$J$$$J$i!“e(Bpthread_cond_timedwait
e$B$Ke(B
e$BJo$C$FJV$7$F$*$/$N$,$$$$$+$J!”$H;W$$$^$9!#e(B

e$B$[$s$H%9%l%C%I$OFq$7$$$G$9$M!#e(B

kosakie$B$G$9e(B

e$B$(!<$H!#$O$$!#$=$&$G$9$M!#e(B
e$B$D$i$D$i$H9M$($F$_$?$H$3$me(Bakre$B$5$s$N$[$&$,@5$7$=$&$G$9!#e(B

+1 => e$B$J$$$H$^$:$$e(B

e$B0lHLO@$H$7$F$$$&$H!"860xITL@$G$b<BAu$G$-$k$N$O%j%H%i%$$,0BA4$J%1!<%9$K8B$i$l$k$H;W$C$F$$$Fe(B
Cond#waite$B$N>l9g!“e(BCond#signale$B$5$l$?$”$H$b$&0l2se(Bwaite$B$9$k$H?2$F$7$^$&$N$Ge(B
e$B!V$G$-$k$+$$1!W$HJI$rC!$/%1!<%9$,=P$k$s$8$c$J$$$+$Je(B

e$B$?$H$(e(B wait e$B$,e(B ETIMEDOUT e$B$GJV$C$FMh$?$H$7$F$b!"e(B
signal e$B$5$l$F$$$J$$$3$H$OJ]>Z$5$l$J$$$N$G$O$J$$$+$H;W$&$s$G$9$,$I$&$G$7$g$&e(B?

e$B@5$7$$$G$9!#e(B
posix_cond_wait()e$B%l%Y%k$G$I$A$i$N<BAu$b5v$7$F$$$k$H$$$&G’<1$G$9!#e(B

e$B<B:]$Ke(B*BSDe$B$He(BLinuxe$B$H$G5sF0$,0c$&%1!<%9$,$"$C$?5$$,$9$k$1$I!":Y$+$$>r7o$Oe(B

e$B;W$$=P$;$:!#!#!#e(B

e$B$9$$$^$;$se(B

wait e$B$,%?%$%`%"%&%H$GD|$a$?8e!"e(Bmutex e$B$r%m%C%/$9$kA0$K!"e(B
e$BB>$N%9%l%C%I$K%3%s%F%-%9%H%9%$%C%A$7$Fe(B signal e$B$,5/$3$k$3$H$OL5$$$s$G$7$g$&$+!#e(B

e$B$b$7M-$k$H$9$k$H!“e(BETIMEDOUT e$B$G%j%H%i%$$9$k$H!”?2$F$7$^$C$F1J5W$K5/$-$J$$!"e(B
e$B$H$$$&>e5-$G7|G0$5$l$F$$$k>u67$K7k6I$J$jF@$k$N$G$O$J$$$+$H;W$&$s$G$9$,!#e(B

e$B$=$N$H$$j$G$9$M!#:#$N%$%s%?!<%U%’!<%9$@$H!"$I$N$_$Ae(BCV#signale$B%9%l%C%I$He(BCV#wait
e$B$9$k%9%l%C%I$O!“5/>2>r7o$K$?$$$7$F$”$k<o$N9g0U$,$"$k$O$:$G!"e(B
CV#waite$B$9$kB&$N%9%l%C%I$,e(BCV#waite$B$9$kD>A0$K>r7o$,K~$?$5$l$F$$$k$+%A%’%C%/$9$k$3$H$K$h$je(B
e$BLdBj$O$
$-$J$$!#$He(B

e$B$H$$$&$o$1$G!"@h$NH/8@$OE12s$7$^$9!#9MN8$,B-$j$J$/$F$9$$$^$;$s!#e(B

e$B$"$H!"$A$g$C$HC&@~$J$N$G$9$,!";H$&B&$+$i8+$k$H860x$r@Z$jJ,$1$?$$$N$C$FFs<oN$"$k5$$,$7$^$9$M!#e(B e$B#1!Ke(B e$B%?%$%%"%&%H$He(BCV#sinal
e$B#2!Ke(B e$B%?%$%`%"%&%H$He(Bspurious wakeup

e$B#1$O:#$N5DO@$Ge(Bpredicatee$B$r8F$S=P$7B&$,%A%’%C%/$9$k$O$:$@$+$i9MN8ITMW$H$$$&7kO@$K$J$C$?$He(B
e$B;W$$$^$9!##2$O$I$&$7$^$7$g$&!):#$N%$%s%?!<%U%’!<%9$@$He(BCV#waite$B$NLa$jCM$Oe(Bselfe$B$J$N$G!"e(B
e$BH=DjIT2DG=$G$9$h$M!)e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B20:40 Yusuke ENDOH [email protected]:

#2629 e$B$N5!G=$O!":Y$+$$$3$H$r8@$($P;EMMJQ99$rH<$$$^$9!#$=$l$,>.:j$5$s$Ne(B
e$B8@$&$h$&$K!V$J$$$H$^$:$$!W5!G=$@$H$7$?$i!“e(BCV#wait e$B$Ke(B timeout e$B$rDI2C$9$ke(B
e$B:]$Ne(B API e$B@_7W$KITHw$,$”$C$?$H$$$&$3$H$@$H;W$$$^$9!#e(B
e$B$J$N$G!“86B’$K=>$($Pe(B revert e$B$7$+A*Br;h$O$”$j$^$;$s!#e(B

e$B>.:j$5$s$N!V$J$$$H$^$:$$!W5!G=$G$"$k$H$$$&<gD%$OE12s$5$l$?$N$Ge(B
e$BLdBj$O$J$/$J$C$?$H9M$($F$$$$$G$9$+e(B?

2010e$BG/e(B5e$B7ne(B6e$BF|e(B21:50 KOSAKI Motohiro
[email protected]:

e$B#2!Ke(B e$B%?%$%`%"%&%H$He(Bspurious wakeup

e$B#1$O:#$N5DO@$Ge(Bpredicatee$B$r8F$S=P$7B&$,%A%‘%C%/$9$k$O$:$@$+$i9MN8ITMW$H$$$&7kO@$K$J$C$?$He(B
e$B;W$$$^$9!##2$O$I$&$7$^$7$g$&!):#$N%$%s%?!<%U%’!<%9$@$He(BCV#waite$B$NLa$jCM$Oe(Bselfe$B$J$N$G!"e(B
e$BH=DjIT2DG=$G$9$h$M!)e(B

e$B%?%$%%"%&%H$O35G0E*$Ke(B Thread.new { sleep t; cv.signal } e$B$_$?$$$JOC$H$be(B e$B9M$($i$l$k$N$G!"%?%$%%"%&%H$H$$$&$N$be(B predicate e$B$N0l<o$G!“e(B
wait e$B$r8F$S=P$7$?B&$,:FEY8!::$9$Y$-!”$+$J$!!#e(B

e$B%?%$%`%“%&%H$O>r7o$,@.N)$7$?$i!”$=$N8e$K>r7o$,[email protected])$KJQ2=$9$k$3$H$,L5$$$N$G!"e(B
e$B$=$N:F8!::$r>J$/$3$H$,$G$-$=$&$@$H$$$&E@$O8zN($NE@$G@K$7$$$H$3$m$G$9$,!#e(B

e$B0lHLE*2=$9$k$H!"$J$s$i$+$NCN<1$K$h$j>uBV$,C1D4$KJQ2=$9$k$3$H$,$o$+$C$F$$$l$P!“e(B
signal e$B$5$l$?$3$H$,$o$+$k$H$$$&$N$O!”?.MQ$G$-$k$N$G$7$g$&!#e(B

e$B$7$+$7!“%?%$%%"%&%H$K$D$$$F$Oe(B (e$BFf$N860x$Ge(B) spurious wakeup e$B$7$?8e!"e(B e$B8!::$9$k$^$G$N4V$K%?%$%%”%&%H$9$k!“$H$$$&e(B race
e$B$b$”$k$7$J$!!#e(B

e$B:F8!::$rHr$1$k$H$$$&0J30$KH=Dj$7$?$$M}M3$OM-$j$^$9$+$M!)e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B21:50 KOSAKI Motohiro
[email protected]:

e$B$H$$$&$o$1$G!"@h$NH/8@$OE12s$7$^$9!#9MN8$,B-$j$J$/$F$9$$$^$;$s!#e(B

e$B$H$s$G$b$J$$$G$9!#$40U8+$"$j$,$H$&$4$6$$$^$9!#e(B

e$B$“$H!”$A$g$C$HC&@~$J$N$G$9$,!“;H$&B&$+$i8+$k$H860x$r@Z$jJ,$1$?$$$N$C$FFs<oN$"$k5$$,$7$^$9$M!#e(B e$B#1!Ke(B e$B%?%$%%”%&%H$He(BCV#sinal
e$B#2!Ke(B e$B%?%$%`%"%&%H$He(Bspurious wakeup

e$B#1$O:#$N5DO@$Ge(Bpredicatee$B$r8F$S=P$7B&$,%A%‘%C%/$9$k$O$:$@$+$i9MN8ITMW$H$$$&7kO@$K$J$C$?$He(B
e$B;W$$$^$9!##2$O$I$&$7$^$7$g$&!):#$N%$%s%?!<%U%’!<%9$@$He(BCV#waite$B$NLa$jCM$Oe(Bselfe$B$J$N$G!"e(B
e$BH=DjIT2DG=$G$9$h$M!)e(B

e$B<B:]$K!"e(B

  • 3 e$BIC$4$H$Ke(B wakeup e$B$7$FDj4|=hM}$r$9$ke(B
  • predicate e$B$,??$K$J$C$?$i$9$0$K=*$o$ke(B

e$B$H$$$&=hM}$r=q$$$F9M$($F$_$^$7$?e(B
(e$B$3$N%f!<%9%1!<%9$,E,@Z$+$I$&$+$O5DO@$Ne(B
e$BM>CO$,$"$ke(B) e$B!#e(B

e$B8=>u$G$be(B

m.synchronize do
t = Time.now + 3
until predicate
t2 = Time.now
cv.wait(m, t - t2) if t > t2
break if predicate
if Time.now > t
t += 3
# e$BDj4|=hM}$r$9$ke(B
end
end
# predicate e$B$,??$K$J$C$?e(B
end

e$B$H$9$l$P!"H=Dj$G$-$k$h$&$J5$$,$7$^$9!#e(B

CV#wait e$B$,e(B ETIMEOUT e$B$N;~$Ke(B true
e$B$rJV$7!"$=$&$G$J$$$H$-$Ke(B false e$B$rJV$9$He(B
e$B$9$k$He(B

m.synchronize do
t = Time.now + 3
until predicate
t2 = Time.now
if t <= t2 || cv.wait(m, t - t2)
break if predicate
t += 3
# e$BDj4|=hM}$r$9$ke(B
end
end
# predicate e$B$,??$K$J$C$?e(B
end

e$B$H=q$1$k$H;W$$$^$9!#e(B1 e$B9T8:$C$?$@$1$G!"Bg$7$FJQ$o$j$^$;$s!#e(B

e$B$b$7e(B cv.wait
e$B$,@dBP;~9o$r<u$1<h$k!"$+$D!“M?$($i$l$?;~9o$,2a5n$@$C$?>l9g$Oe(B
e$BD>$A$K%j%?!<%s$9$k!”$H$$$&;EMM$@$C$?>l9g$O!"e(B

m.synchronize do
t = Time.now + 3
until predicate
if cv.wait(m, t) && !predicate
t += 3
# e$BDj4|=hM}$r$9$ke(B
end
end
# predicate e$B$,??$K$J$C$?e(B
end

e$B$H!“$@$$$V$9$C$-$j$9$k$h$&$J5$$,$7$^$9!#$d$O$j$3$l$,$”$k$Y$-;Q$J$N$+$b!#e(B

e$B$?$@$7!“$I$N%3!<%I$b<B:]$KAv$i$;$F$$$^$;$s$7!”;d$,5$$E$$$F$J$$LdBj$,$"$ke(B
e$B$+$b$7$l$^$;$s!#%9%l%C%I$3$o$$!#e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B22:31 Tanaka A. [email protected]:

2010e$BG/e(B5e$B7ne(B6e$BF|e(B20:40 Yusuke ENDOH [email protected]:

#2629 e$B$N5!G=$O!":Y$+$$$3$H$r8@$($P;EMMJQ99$rH<$$$^$9!#$=$l$,>.:j$5$s$Ne(B
e$B8@$&$h$&$K!V$J$$$H$^$:$$!W5!G=$@$H$7$?$i!“e(BCV#wait e$B$Ke(B timeout e$B$rDI2C$9$ke(B
e$B:]$Ne(B API e$B@_7W$KITHw$,$”$C$?$H$$$&$3$H$@$H;W$$$^$9!#e(B
e$B$J$N$G!“86B’$K=>$($Pe(B revert e$B$7$+A*Br;h$O$”$j$^$;$s!#e(B

e$B>.:j$5$s$N!V$J$$$H$^$:$$!W5!G=$G$"$k$H$$$&<gD%$OE12s$5$l$?$N$Ge(B
e$BLdBj$O$J$/$J$C$?$H9M$($F$$$$$G$9$+e(B?

#2629 e$B$Ne(B Hongli L.
e$B$5$s$b!V$J$$$H$^$:$$!W$H<gD%$7$F$$$^$9$N$G!"e(B
e$B$=$C$A$b@bF@$7$F$$$?$@$1$^$9$+!#M}M3$r=q$$$Fe(B reject
e$B$9$k$@$1$G$be(B
e$B9=$$$^$;$s$,!#e(B

e$B;d$OK\Ev$K!V$J$/$F$b$h$$!W$N$+A4$/<+?.$,;}$F$^$;$s$,!"H?BP$O$7$^$;$s!#e(B

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B6e$BF|e(B20:13 Tanaka A. [email protected]:

e$B$=$&$$$&4D6-$G$O@5$7$/F0$-!“$=$&$G$J$$4D6-$G$O;DG0$G$9$,e(B
e$B;~9o$r4,$-La$7$?>l9g$OCY$/%?%$%`%”%&%H$9$k$3$H$K$J$k$G$7$g$&!#e(B

e$B$7$+$7!"e(Babsolute time e$B$7$+;XDj$G$-$J$1$l$P!“e(B
e$BCY$/%?%$%`%”%&%H$7$J$$$H$$$&5!G=$rDs6!$9$k$3$H$OIT2DG=$G$9!#e(B

e$B9M$($F$_$?$i!"e(Brelative time e$B$r;XDj$7$F$b!“e(Bspurious wakeup
e$B$7$?>l9g$K!“e(B
e$B%7%9%F%`%/%m%C%/$,?.Mj$G$-$J$$$H$J$k$H!”$”$H$I$l$@$1e(B wait
e$B$9$Y$-$J$N$+e(B
e$B7W;;$G$-$J$$5$$,$7$^$7$?!#e(B

e$B!V$“$H$I$l$@$1e(B wait
e$B$9$Y$-!W$H$$$&>pJs$b$”$o$;$F65$($F$/$l$k5!G=$,e(B
e$B$"$k4D6-$C$FB8:_$9$k$s$G$9$+$M!#e(B