# \[Bug #3182\] multi-irb may run parallelly

**URL:** <https://www.ruby-forum.com/t/bug-3182-multi-irb-may-run-parallelly/187302>\
**Category:** Development\
**Created:** [April 21, 2010, 1:54pm UTC](https://www.ruby-forum.com/t/bug-3182-multi-irb-may-run-parallelly/187302 "2010-04-21T13:54:45Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [April 21, 2010, 1:54pm UTC](https://www.ruby-forum.com/t/bug-3182-multi-irb-may-run-parallelly/187302/1 "2010-04-21T13:54:45Z")

</div>

Bug #3182: multi-irb may run parallelly  
[http://redmine.ruby-lang.org/issues/show/3182](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. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [April 22, 2010, 2:31pm UTC](https://www.ruby-forum.com/t/bug-3182-multi-irb-may-run-parallelly/187302/2 "2010-04-22T14:31:21Z")

</div>

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: removed\_email\_address@domain.invalid \<\<—

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [April 22, 2010, 2:57pm UTC](https://www.ruby-forum.com/t/bug-3182-multi-irb-may-run-parallelly/187302/3 "2010-04-22T14:57:42Z")

</div>

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](http://redmine.ruby-lang.org/issues/show/3182)
