Ruby$B3+H/%_!<%F%#%s%0%m%0(B

e$B!!$5$5$@$G$9!%e(B

e$B!!;22C$G$-$=$&$J?M$K@<$r$+$1$F!$e(BRubye$B3+H/%_!<%F%#%s%0$r3+$-$^$7$?!%%a%b$re(B
e$B$*Aw$j$7$^$9!%e(B

Rubye$B3+H/%_!<%F%#%s%0e(B
e$B>l=j!’=)MU86e(B
e$BF|;~!'e(B2008/12/11 9:00-12:30
e$B;22C<T!'e(Bmatz, akr, nobu, yugui, ko1

e$B$d$C$?$3$H!'e(BRedmine e$B$N%A%1%C%H$r8+D>$7e(B
e$B0J2<!$%a%b!'e(B

  • Bug #6: e$BCfED$5$s$,$&$5$5$s$K8@$&e(B
  • Bug #233 [ruby-dev:35392]: e$B:G0-e(B knownbug
    e$B$G$h$$!Je(B1.9.1e$B!Ke(B
    e$B$?$@$7!$4D6-$r>o$K=E$M$k$N$O$^$:$$$s$G!$$3$l$O2~A1$9$k$Y$-e(B
  • Feature #235 [ruby-core:17652]: e$B$*$$$H$/e(B
  • Bug #256 [ruby-core:17739]: e$B$3$NLdBj$Oe(B3e$B$D$NLdBj$,4^$^$l$ke(B
    • defined? e$B$Ge(B const_missing e$B$,8F$P$l$J$$e(B ->
      e$B$3$l$O$=$N$^$^e(B
    • require ‘rubygems’ e$B$7$F$be(B RubyGems::VERSION
      e$B$,Dj5A$5$l$J$$e(B
      • rubygems e$B$,%m!<%I$5$l$J$$e(B
      • RubyGems::VERSION e$B$,Dj5A$5$l$J$$e(B
        -> akr: e$B$[$C$H$/e(B
        matz: e$B$3$l$K4X$7$F$Oe(B reject,
        e$BI,MW$K1~$8$F:F%]%9%H$7$F$[$7$$e(B
        e$B%a!<%k$+$/e(B
  • Bug #373 [ruby-dev:35648]: known bug
    e$B$G$b$$$$$,%F%9%H$G;_$^$k$N$O:$$ke(B
    • e$B%F%9%H$G%V%m%C%/$7$J$$$h$&$K$J$s$H$+$9$ke(B -> akr
  • Bug #470 [ruby-dev:35915]: File.open e$B$He(B IO.open
    e$B$rJB$Y$F=q$/e(B -> yugui
  • Bug #497 [ruby-dev:35970]: yugi e$B$5$s$,4hD%$ke(B
  • Bug #501 [ruby-core:18387]: e$BD>$C$?5$$,$9$ke(B, e$B3NG’$9$ke(B
    (yugui)
  • Bug #525 [ruby-dev:36062]: e$B%F%9%H$,0-$$e(B ->
    e$B%F%9%H>C$7$F1sF#$5$s$K3NG’e(B
    (matz)
  • Bug #527 [ruby-dev:36063]: e$BJ|CV!$e(BRC issue e$B$+$i30$9e(B
  • Bug #549 [ruby-core:18479]: e$B:F8=$G$-$:!$e(BEric e$B$KJ9$/e(B
    (yugui)
  • Bug #553 [ruby-dev:36230]: closed
  • Bug #555 [ruby-core:18527]: Eric e$B$KJ9$/e(B (yugui)
  • Bug #566 [ruby-core:18600]: e$B8e$G!J%a!<%k$+$b!Ke(B(matz)
  • Bug #572 [ruby-core:18639]: e$BF#2,$5$s$K3NG’e(B (yugui)
  • Bug #595 [ruby-dev:36511]: 1.9.1 e$B$G$Oe(B knownbug e$B$G$b$h$$e(B
    (ko1) 12/25
    e$B$=$l$+e(B Document e$B$G<U$ke(B
  • Bug #607 [ruby-core:18994]: close
  • Bug #696 [ruby-core:19601]: e$BJ|CVe(B (1.9.1 rc e$B$G$O$J$$!Ke(B
  • Feature #711 [ruby-core:19702]:
    • -K e$B$O8_49@-$@$+$i$$$i$J$$$s$8$c!)e(B
    • -E e$B$OI,MW$J$N$+!)e(B
    • e$B$"$H$Ge(B
  • Bug #730 [ruby-core:19750]: StringIO e$B$NNce(B (#632)
    e$B$b$"$o$;$F4hD%$ke(B (ko1)
  • Bug #771 [ruby-core:20014]: accept (akr)
  • Bug #799 [ruby-core:20131]: e$B2?$H$+$9$ke(B (nobu)
  • Bug #821 [ruby-dev:37275]:
    • akr e$B0Fe(B
      • (1) testrb e$B$r;H$&e(B
      • (2) e$B8_49@-e(B 100% e$B5a$a$k$N$J$ie(B gem install test
        e$B$9$ke(B
    • e$B$3$l0J9_$N5DO@$Oe(B 1.9.2 e$B$K8~$1$F!JI,MW$J$i!Ke(B
  • Bug #849: e$B$5$/$C$HD>$9e(B (nobu)
  • Bug #848 [ruby-core:20450]: e$B$H$j$"$($:8+$ke(B (matz)e$B!$C4Ev$Oe(B
    ko1
  • Bug #842 [ruby-dev:37338]: reject,
    e$B$3$Ne(Bpatche$B$O$=$b$=$bJQ$o$ke(B
  • Bug #832 [ruby-dev:37294]: e$BC4Eve(B matz
  • Bug #827 [ruby-dev:37282]: eric e$B$KJ9$/e(B (yugui)
  • Bug #803 [ruby-dev:37240]:
    • (1) 1.8 e$B$K$"$o$;$k$h$&$K4hD%$ke(B (ko1)
    • (2) e$B$3$l$O$3$N$^$^e(B (priority e$B$ODc$=$&!$<BAu$OBgJQe(B)
  • Bug #776 [ruby-core:20043]: e$B:F8=$G$-$J$$$H8@$&e(B (nobu)
  • Bug #770 [ruby-core:20013]: accept e$B$G$$$$$@$m$&e(B, ryan
    e$B$K8@$&e(B (yugui)
  • Feature #767 [ruby-dev:37132]: 1.9.1 e$BE*$K$O%9%k!<e(B
  • Bug #763 [ruby-core:19990]: akr, ko1
    e$B$N:n6H$G$J$s$H$+$J$i$J$$$+8!F$e(B
  • Bug #755 [ruby-core:19946]: Windows specific. e$B$&$5$5$s$KJ9$/e(B
    (akr)
  • Bug #732 [ruby-dev:37046]:
    • (1) e$B;2>H$O$G$-$k$h$&$K$9$ke(B
    • (2) nil e$B$K$9$ke(B -> e$BM%@hEY$ODc$$!%e(Bat_exit
      e$B$h$jA0$K$D$V$9$Y$-e(B
  • Feature #710 [ruby-core:19690]: undef e$B$K$9$ke(B (akr)
  • Bug #693 [ruby-core:19581]: 1.9.1 e$B$+$i:o=|!$e(Btrunk
    e$B$G$OD>$7$Fe(B 1.9.2 e$B$Ge(B
    (ko1)
  • Bug #688 [ruby-dev:36968]: e$B9M$($k!$$^$?$O:o$ke(B (akr)
  • Bug #657 [ruby-core:19385]: close e$B$9$ke(B (nobu)
  • Bug #653 [ruby-core:19351]: Eric e$B$K$U$ke(B (yugui)
  • Bug #650 [ruby-dev:36750]: 1.9.1 e$B$G$Oe(B Planned Feature

e$B<!2s!'e(B12/22 10:00-14:00 e$B=)MU86e(B

e$B%j%j!<%9%W%i%s!'e(B

  • e$B:#F|Cfe(B (12/11e$B!K$K%A%1%C%H3d$j?6$je(B
  • e$B6aF|Cf$K!$e(B12e$B7n$Ne(BRC1e$B$N0U;WI=<($r9T$&!Je(B-dev,
    -coree$B!Ke(B
  • 12/22 e$B$K$b$&0lEY%_!<%F%#%s%0!wEl5~e(B
  • 12/25 e$B$Ke(B RC1 e$B%j%j!<%9e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:37378] Rubye$B3+H/%_!<%F%#%s%0%m%0e(B”
on Dec.11,2008 12:28:57, [email protected] wrote:

  • Bug #6: e$BCfED$5$s$,$&$5$5$s$K8@$&e(B

e$BCfED$5$s$,$o$+$C$F$k$J$i$=$l$GF~$l$F$b$i$($l$P!#e(B
e$B;d$O$$$^$$$A!V$J$k$[$I!W$8$c$J$$$N$G!#e(B

  • Bug #755 [ruby-core:19946]: Windows specific. e$B$&$5$5$s$KJ9$/e(B (akr)

e$BBP1~%Q%C%A$r:n$C$F$3$NLdBj$,2r7h$9$k$H$3$m$^$G$O$?$I$jCe$$$Fe(B
e$B$k$N$G$9$,!“%a%b%j4XO”$N%P%0$r;E9~$s$G$$$k$i$7$/JL$N%F%9%H$Ge(B
[BUG]e$B$k$h$&$K$J$C$F$7$^$C$?$N$G:$$C$F$$$k$H$3$m$G$9!#e(B
e$BC/$+%Q%C%A$N%P%0$rC5$7$F$/$l$k?M$,$$$k$J$i$=$N%Q%C%A$r=P$7$^e(B
e$B$9$,e(B…

e$B$=$l$G$O!#e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:37381] Re: Rubye$B3+H/%_!<%F%#%s%0%m%0e(B”
on Dec.11,2008 13:44:58, [email protected] wrote:

  • Bug #755 [ruby-core:19946]: Windows specific. e$B$&$5$5$s$KJ9$/e(B (akr)

e$BBP1~%Q%C%A$r:n$C$F$3$NLdBj$,2r7h$9$k$H$3$m$^$G$O$?$I$jCe$$$Fe(B
e$B$k$N$G$9$,!“%a%b%j4XO”$N%P%0$r;E9~$s$G$$$k$i$7$/JL$N%F%9%H$Ge(B
[BUG]e$B$k$h$&$K$J$C$F$7$^$C$?$N$G:$$C$F$$$k$H$3$m$G$9!#e(B
e$BC/$+%Q%C%A$N%P%0$rC5$7$F$/$l$k?M$,$$$k$J$i$=$N%Q%C%A$r=P$7$^e(B
e$B$9$,e(B…

e$B$3$l!"860x$o$+$j$^$7$?!#e(B

blocking regione$BFb$Ge(BGCe$B$,H/@8$9$k$H!“e(Bblocing
regione$B$8$c$J$$%9%le(B
e$B%C%Ie(B(e$B$J$s$+L>A0$J$$$+$Je(B)e$B$N%9%?%C%/$,0l@Ze(Bmarke$B$5$l$J$$$?$a!”$=e(B
e$B$N%9%l%C%I$G%9%?%C%/>e$K$"$ke(BVALUEe$B$,2s<}$5$l$F$7$^$$$^$9!#e(B
e$BBP:v$H$7$F$O!"e(B

(1) blocking regione$B$+$ie(BGCe$B$,5/$3$5$l$?$H$-$Oe(Bblocking
regione$B$8$ce(B
e$B$J$$%9%l%C%I$r;_$a$F$=$N%9%l%C%I$N%9%?%C%/$re(Bmarke$B$7$Fe(BGCe$B$re(B
e$BB39T$5$;$k!#e(B
e$B"*e(B e$BL5M}$,$"$j$=$&e(B

(2) blocking regione$B$+$ie(BGCe$B$r5/$3$5$;$J$$e(B

(a) xmalloce$BEy$O;HMQ6X;_$H$9$ke(B
e$B"*e(B e$BLLE]$J$N$G$O$J$$$+e(B

(b) blocking
regione$B$+$ie(Bxmalloce$BEy$,8F$P$l$?$H$-$O%a%b%j3NJ]e(B
e$B$G$-$J$/$F$be(BGCe$B$7$J$$e(B

e$B$H$$$C$?$"$?$j$,e(BIRCe$B$G$O=P$^$7$?!#e(B

e$B$=$l$G$O!#e(B

e$B!!$5$5$@$G$9!%e(B

U.Nakamura wrote::

   e$B"*e(B e$BL5M}$,$"$j$=$&e(B

(2) blocking regione$B$+$ie(BGCe$B$r5/$3$5$;$J$$e(B

(a) xmalloce$BEy$O;HMQ6X;_$H$9$ke(B
e$B"*e(B e$BLLE]$J$N$G$O$J$$$+e(B

(b) blocking regione$B$+$ie(Bxmalloce$BEy$,8F$P$l$?$H$-$O%a%b%j3NJ]e(B
e$B$G$-$J$/$F$be(BGCe$B$7$J$$e(B

e$B$H$$$C$?$"$?$j$,e(BIRCe$B$G$O=P$^$7$?!#e(B

© blocking_region e$B$NCf$G!$$5$i$Ke(B ruby
e$B$J4D6-$K$5$o$l$k>uBV$K$J$j!Je(BGVL
e$B$r<hF@$9$k!K!$%a%b%j3NJ]$r9T$&!$$H$$$&$3$H$,9M$($i$l$^$9!%@-G=$O$b$A$m$se(B
e$BMn$A$^$9$,!J;H$$$I$3$m$r4V0c$($k$H!$$H$F$b$H$F$bCY$/$J$j$^$9!K!$$I!<$7$Fe(B
e$B$bI,MW$J>l9g$O;H$&!$$C$F$3$H$,=PMh$k$+$H;W$$$^$9!%e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:37448] [Bug: trunk] GC from blocking region”
on Dec.15,2008 22:44:31, [email protected] wrote:

(c) blocking_region e$B$NCf$G!$$5$i$Ke(B ruby e$B$J4D6-$K$5$o$l$k>uBV$K$J$j!Je(BGVL
e$B$r<hF@$9$k!K!$%a%b%j3NJ]$r9T$&!$$H$$$&$3$H$,9M$($i$l$^$9!%@-G=$O$b$A$m$se(B
e$BMn$A$^$9$,!J;H$$$I$3$m$r4V0c$($k$H!$$H$F$b$H$F$bCY$/$J$j$^$9!K!$$I!<$7$Fe(B
e$B$bI,MW$J>l9g$O;H$&!$$C$F$3$H$,=PMh$k$+$H;W$$$^$9!%e(B

e$B8=>u$3$l$,$G$-$ke(BAPIe$B$,$J$$$o$1$G$9$,!“DI2C$G$-$k$b$N$J$i$9$k$He(B
e$B$7$F$b!”$$$D:"$3$l$,2DG=$K$J$j$=$&$G$9$+e(B?

e$B$=$l$G$O!#e(B

e$B!!$5$5$@$G$9!%e(B

U.Nakamura wrote::

In message “[ruby-dev:37448] [Bug: trunk] GC from blocking region”
on Dec.15,2008 22:44:31, [email protected] wrote:

(c) blocking_region e$B$NCf$G!$$5$i$Ke(B ruby e$B$J4D6-$K$5$o$l$k>uBV$K$J$j!Je(BGVL
e$B$r<hF@$9$k!K!$%a%b%j3NJ]$r9T$&!$$H$$$&$3$H$,9M$($i$l$^$9!%@-G=$O$b$A$m$se(B
e$BMn$A$^$9$,!J;H$$$I$3$m$r4V0c$($k$H!$$H$F$b$H$F$bCY$/$J$j$^$9!K!$$I!<$7$Fe(B
e$B$bI,MW$J>l9g$O;H$&!$$C$F$3$H$,=PMh$k$+$H;W$$$^$9!%e(B

e$B8=>u$3$l$,$G$-$ke(BAPIe$B$,$J$$$o$1$G$9$,!“DI2C$G$-$k$b$N$J$i$9$k$He(B
e$B$7$F$b!”$$$D:"$3$l$,2DG=$K$J$j$=$&$G$9$+e(B?

e$B!!:n$C$F$_$^$7$?!%$3$l$GF0$/$+$d$C$F$b$i$($^$;$s$+!%$“$H!$L>A0$N%;%s%9$,e(B
e$B0-$9$.$k$H$+!$$=$&$$$&OC$b$”$k$+$H;W$&$N$G!$$$$$L>A0Jg=8Cf$G$9!%e(B

e$BCm0U!'e(B

  • rb_thread_call_with_gvl() e$B$KEO$94X?t$NJVCM$Oe(B VALUE e$B$@$He(B
    mark e$B$5$l$J$$$3$H$,$"$k$N$G!$e(BVALUE
    e$B$N<u$1EO$7$O4pK\E*$K$7$J$$e(B

e$B!!$A$J$_$K!$e(B[ruby-dev:37448]
e$B$G<($7$?2r7h:v$O7j$,$“$C$F!$e(Bxmalloc e$B$7$?%ae(B
e$B%b%j$Oe(B xfree
e$B$7$J$1$l$P$J$i$J$$$H$$$&@)Ls$,$”$j$^$9!%$J$N$G!$0J2<$N$h$&e(B
e$B$K$9$k$N$,$h$$$N$G$O$J$$$+$H;W$$$^$9!%e(B

(a) malloc e$B;n9Te(B → e$B<:GTe(B
(b) rb_thread_call_with_gvl() e$B$r;H$C$Fe(B GC e$B$r6/@)H/@8e(B
(c) malloc e$B;n9Te(B → e$B<:GTe(B
(d) C e$B%l%Y%k$G$N;q8;$r2s<}!J8e;OKv!Ke(B
(e) rb_thread_call_with_gvl() e$B$G8F$S=P$7$?4X?tCf$Ge(B NoMemoryError
e$BH/@8e(B

Index: vm_core.h

— vm_core.h (e$B%j%S%8%g%se(B 20894)
+++ vm_core.h (e$B:n6H%3%T!<e(B)
@@ -363,6 +363,7 @@ typedef struct rb_thread_struct
int slice;

 native_thread_data_t native_thread_data;
  • void *blocking_region_buffer;

    VALUE thgroup;
    VALUE value;
    Index: thread.c
    ===================================================================
    — thread.c (e$B%j%S%8%g%se(B 20894)
    +++ thread.c (e$B:n6H%3%T!<e(B)
    @@ -947,6 +947,7 @@ static inline void
    blocking_region_begin(rb_thread_t *th, struct rb_blocking_region_buffer
    *region,
    rb_unblock_function_t *func, void *arg)
    {

  • th->blocking_region_buffer = region;
    region->prev_status = th->status;
    set_unblock_function(th, func, arg, &region->oldubf);
    th->status = THREAD_STOPPED;
    @@ -1033,6 +1034,32 @@ rb_thread_blocking_region(
    }, ubf, data2);

    return val;
    +}

+/* alias of rb_thread_blocking_region() */
+VALUE
+rb_thread_call_without_gvl(

  • rb_blocking_function_t *func, void *data1,
  • rb_unblock_function_t *ubf, void *data2)
    +{
  • return rb_thread_blocking_region(func, data1, ubf, data2);
    +}

+void *
+rb_thread_call_with_gvl(void *(*func)(void *), void *data1)
+{

  • rb_thread_t *th = ruby_thread_from_native();
  • struct rb_blocking_region_buffer *brb =
  •  (struct rb_blocking_region_buffer *)th->blocking_region_buffer;
    
  • struct rb_unblock_callback prev_unblock = th->unblock;
  • void *r;
  • blocking_region_end(th, brb);
  • /* enter to the Ruby world */
  • r = (*func)(data1);
  • /* levae from Ruby world */
  • blocking_region_begin(th, brb, prev_unblock.func,
    prev_unblock.arg);
  • return r;
    }

/*

e$B!!$5$5$@$G$9!%e(B

U.Nakamura wrote::

In message “[ruby-dev:37531] Re: [Bug: trunk] GC from blocking region”
on Dec.22,2008 09:37:09, [email protected] wrote:

e$B!!:n$C$F$_$^$7$?!%$3$l$GF0$/$+$d$C$F$b$i$($^$;$s$+!%$“$H!$L>A0$N%;%s%9$,e(B
e$B0-$9$.$k$H$+!$$=$&$$$&OC$b$”$k$+$H;W$&$N$G!$$$$$L>A0Jg=8Cf$G$9!%e(B

rb_thread_from_native()e$B$,e(BNULLe$B$rJV$7$F;`$K$^$/$j$G$7$?!#e(B

e$B!!$J$+$@$5$s!$$3$NJU$C$F$I$&$J$C$F$^$7$?$C$1!%e(B

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:37531] Re: [Bug: trunk] GC from blocking region”
on Dec.22,2008 09:37:09, [email protected] wrote:

e$B!!:n$C$F$_$^$7$?!%$3$l$GF0$/$+$d$C$F$b$i$($^$;$s$+!%$“$H!$L>A0$N%;%s%9$,e(B
e$B0-$9$.$k$H$+!$$=$&$$$&OC$b$”$k$+$H;W$&$N$G!$$$$$L>A0Jg=8Cf$G$9!%e(B

rb_thread_from_native()e$B$,e(BNULLe$B$rJV$7$F;`$K$^$/$j$G$7$?!#e(B

e$B$=$l$G$O!#e(B