[Bug #3182] multi-irb may run parallelly

Bug #3182: multi-irb may run parallelly
http://redmine.ruby-lang.org/issues/show/3182

e$B5/I<<Te(B: Yusuke E.
e$B%9%F!<%?%9e(B: Open, e$BM%@hEYe(B: Normal
e$BC4Ev<Te(B: Keiju Ishitsuka, e$B%+%F%4%je(B: lib, Target version:
1.9.2
ruby -v: ruby 1.9.2dev (2010-04-21 trunk 27432) [i686-linux]

e$B$$$7$D$+$5$se(B
e$B1sF#$G$9!#e(B

#3139 e$B$G!"e(Birb e$B$,e(B SEGV e$B$9$k$H$$$&Js9p$,>e$,$C$F$$$^$9!#e(B
e$B$3$s$J46$8$G:F8=$9$k$i$7$$$G$9!#e(B

irb String
irb Array
kill String
jobs
jobs
jobs #=> SEGV

e$B;d$N4D6-$G:F8=$O$7$J$$$N$G$9$,!"F1$8<j=g$r<B9T$9$k$H!“e(Bkill
e$B$7$?$”$H$G!"e(B
e$B%-!<F~NO$,IT;W5D$J5sF0$K$J$j$^$7$?!#e(B

irb(main):001:0> irb String
irb#1(String):001:0> irb Array
irb#2(Array):001:0> kill String
=> #<IRB::Irb: @context=#IRB::Context:0x84096bc,
@signal_status=:IN_EVAL, @scanner=#RubyLex:0x84080a0>
irb(main):002:0> => [String]
irb#2(Array):002:0> j
NameError: undefined local variable or method j' for main:Object from (irb):2 from ../ruby-trunk-local/bin/irb:12:in
irb(main):003:0> obs
NameError: undefined local variable or method obs' for main:Object from (irb):3 from ../ruby-trunk-local/bin/irb:12:in

e$BD4$Y$F$_$?$H$3$m!"e(Bmulti-irb e$B$GJ#?t$Ne(B irb
e$B$N%9%l%C%I$,F1;~$KAv$j=P$7$Fe(B
e$B$$$F!“J#?t$N%9%l%C%I$+$ie(B Readline.readline
e$B$r8F$V$?$aF~NO$NC%$$9g$$$Ke(B
e$B$J$C$F$$$k$h$&$G$9!#e(B
e$B$?$V$s!”$3$l$,Js9p<T$N4D6-$G$Oe(B SEGV
e$B$K$J$C$?$N$G$O$J$$$+$HM=A[$7$^$9e(B
(e$B:F8=$7$J$$$N$G$o$+$i$J$$$G$9$,e(B) e$B!#e(B

SEGV e$B$O$*$$$H$$$F!“J#?t$Ne(B irb e$B%9%l%C%I$,Av$j$@$9$N$Oe(B
multi-irb e$B$N%P%0e(B
e$B$@$H;W$$$^$9!#e(B
irb e$B$,=*N;$7$?$H$-$K!”?F$Ne(B irb e$B%9%l%C%I$re(B run
e$B$9$k%3!<%I$,$"$j$^$9$,!“e(B
kill e$B$5$l$?;~$Oe(B kill e$B$7$?e(B irb
e$B%9%l%C%I$,$9$G$KAv$C$F$$$k$N$G!”?F$re(B run
e$B$5$;$k$Y$-$G$J$$$H;W$$$^$9!#e(B

e$B0J2<$N$h$&$K!"e(Bkill e$B$5$l$?e(B irb
e$B0lMw$rJ];}$7$F$*$$$F!"e(Bkill e$B$5$l$?e(B irb e$B$Ne(B
e$B=*N;;~$K$O?F$r5/$3$5$J$$$h$&$K$7$?$H$3$m!"IT;W5D$J5sF0$O$J$/$J$j$^$7$?!#e(B

diff --git a/lib/irb/ext/multi-irb.rb b/lib/irb/ext/multi-irb.rb
index 7bb1a7c…df9c789 100644
— a/lib/irb/ext/multi-irb.rb
+++ b/lib/irb/ext/multi-irb.rb
@@ -19,6 +19,7 @@ module IRB
def initialize
# @jobs = [[thread, irb],…]
@jobs = []

  •  @killed_irbs = {}
     @current_job = nil
    
    end

@@ -64,6 +65,7 @@ module IRB
for key in keys
th, irb = search(key)
IRB.fail IrbAlreadyDead unless th.alive?

  •    @killed_irbs[irb] = true
    

    th.exit
    end
    end
    @@ -104,6 +106,7 @@ module IRB
    end
    until assoc = @jobs.pop; end unless @jobs.empty?
    @jobs.push assoc

  •  @killed_irbs.delete(key)
    

    end

    def inspect
    @@ -171,7 +174,7 @@ module IRB
    #fail
    ensure
    unless system_exit

  • @JobManager.delete(irb)
  • unless @JobManager.delete(irb)
    if parent_thread.alive?
    @JobManager.current_job = @JobManager.irb(parent_thread)
    parent_thread.run
    @@ -179,6 +182,7 @@ module IRB
    @JobManager.current_job = @JobManager.main_irb
    @JobManager.main_thread.run
    end
  •      end
    
    end
    end
    end


Yusuke E. [email protected]

e$B$1$$$8$e!w$$$7$D$+$G$9e(B.

In [ruby-dev:41031] the message: “[ruby-dev:41031] [Bug #3182]
multi-irb may run parallelly”, on Apr/21 20:54(JST) Yusuke E.
writes:

e$B$$$7$D$+$5$se(B
e$B1sF#$G$9!#e(B

     from (irb):2
     from ../ruby-trunk-local/bin/irb:12:in `<main>'

irb(main):003:0> obs
NameError: undefined local variable or method obs' for main:Object from (irb):3 from ../ruby-trunk-local/bin/irb:12:in

SEGV e$B$O$*$$$H$$$F!"J#?t$Ne(B irb e$B%9%l%C%I$,Av$j$@$9$N$Oe(B multi-irb e$B$N%P%0e(B
e$B$@$H;W$$$^$9!#e(B

e$B3N$+$Ke(B.

irb e$B$,=*N;$7$?$H$-$K!"?F$Ne(B irb e$B%9%l%C%I$re(B run e$B$9$k%3!<%I$,$"$j$^$9$,!“e(B
kill e$B$5$l$?;~$Oe(B kill e$B$7$?e(B irb e$B%9%l%C%I$,$9$G$KAv$C$F$$$k$N$G!”?F$re(B run
e$B$5$;$k$Y$-$G$J$$$H;W$$$^$9!#e(B

e$B0J2<$N$h$&$K!"e(Bkill e$B$5$l$?e(B irb e$B0lMw$rJ];}$7$F$*$$$F!"e(Bkill e$B$5$l$?e(B irb e$B$Ne(B
e$B=*N;;~$K$O?F$r5/$3$5$J$$$h$&$K$7$?$H$3$m!"IT;W5D$J5sF0$O$J$/$J$j$^$7e(B
e$B$?!#e(B

e$B3N$+$K$3$l$G$b$h$$5$$,$7$^$9$,e(B, e$BC1=c$Ke(B
e$B$=$N=*N;$9$ke(Bsubirbe$B$,%+%l%s%H%8%ge(B
e$B%V$N;~$N$_%+%l%s%H%8%g%V$NCV$-49$($r$9$k$h$&$K$9$k$G==J,$J$h$&$G$9e(B.
e$B$3e(B
e$B$A$i$N%Q%C%A$r:NMQ$7$?$$$H;W$$$^$9e(B.

— lib/irb/ext/multi-irb.rb (e$B%j%S%8%g%se(B 27443)
+++ lib/irb/ext/multi-irb.rb (e$B:n6H%3%T!<e(B)
@@ -172,12 +172,14 @@
ensure
unless system_exit
@JobManager.delete(irb)

  • if parent_thread.alive?
  •  @JobManager.current_job = @JobManager.irb(parent_thread)
    
  •  parent_thread.run
    
  • else
  •  @JobManager.current_job = @JobManager.main_irb
    
  •  @JobManager.main_thread.run
    
  • if @JobManager.current_job == irb
  •  if parent_thread.alive?
    
  •    @JobManager.current_job = @JobManager.irb(parent_thread)
    
  •    parent_thread.run
    
  •  else
    
  •    @JobManager.current_job = @JobManager.main_irb
    
  •    @JobManager.main_thread.run
    
  •  end
    
    end
    end
    end

__
---------------------------------------------------->> e$B@PDMe(B
e$B7=<ye(B <<—
---------------------------------->> e-mail: [email protected] <<—

e$B%A%1%C%He(B #3182 e$B$,99?7$5$l$^$7$?!#e(B (by Keiju Ishitsuka)

e$B%9%F!<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

This issue was solved with changeset r27444.
Yusuke, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


http://redmine.ruby-lang.org/issues/show/3182