# \[Bug:trunk\] cannot resume Fiber from forked process

**URL:** <https://www.ruby-forum.com/t/bug-trunk-cannot-resume-fiber-from-forked-process/182014>\
**Category:** Development\
**Created:** [January 21, 2010, 3:11pm UTC](https://www.ruby-forum.com/t/bug-trunk-cannot-resume-fiber-from-forked-process/182014 "2010-01-21T15:11:41Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [January 21, 2010, 3:11pm UTC](https://www.ruby-forum.com/t/bug-trunk-cannot-resume-fiber-from-forked-process/182014/1 "2010-01-21T15:11:41Z")

</div>

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

fork e$B$N;R%W%m%;%9$+$i85%W%m%;%9$Ne(B Fiber e$B$,8F$Y$^$;$s!#e(B

$ ./ruby -e ’  
f = Fiber.new { }  
fork { f.resume }  
Process.waitpid  
’  
-e:3:in `resume': fiber called across trap (FiberError) from -e:3:in`block in ’  
from -e:3:in `fork' from -e:3:in`’

e$B$=$&$$$&;EMM$J$i$=$&$$$&;EMM$GJL$K9=$o$J$$$N$G$9$,!"e(Bfiber  
called across _trap_ e$B$H$$$&Nc30%a%C%;!\<%8$O$\*$+$7$$5$$,$7$^$9!#e(B

e$B$A$J$\_$K!"e(Btrap e$B$r$^$?$,$C$Fe(B Fiber  
e$B$r8F$V$3$H$O2DG=$J$h$&$G$9!#e(B

$ ./ruby -e ’  
f = Fiber.new { p :ok }  
trap(:USR1) { f.resume }  
Process.kill :USR1, $$  
sleep 0.2  
’  
:ok

$ ./ruby -e ’  
f = nil  
trap(:USR1) { f = Fiber.new { p :ok } }  
Process.kill :USR1, $$  
sleep 0.2  
f.resume  
’  
:ok

e$B$3$N%A%’%C%/$O$b$&I,MW$J$$$N$G$O$J$$$G$7$g$&$+!#H?BP$,$J$1$l$Pe(B  
e$B%3%\_%C%H$7$h$&$H;W$$$^$9!#e(B

diff --git a/cont.c b/cont.c  
index a77f35e…932b10e 100644  
— a/cont.c  
+++ b/cont.c  
@@ -388,7 +388,6 @@ cont\_restore\_1(rb\_context\_t \*cont)  
th-\>state = sth-\>state;  
th-\>status = sth-\>status;  
th-\>tag = sth-\>tag;

- th-\>trap\_tag = sth-\>trap\_tag;  
th-\>errinfo = sth-\>errinfo;  
th-\>first\_proc = sth-\>first\_proc;

@@ -621,9 +620,6 @@ rb\_cont\_call(int argc, VALUE \*argv, VALUE contval)  
if (cont-\>saved\_thread.self != th-\>self) {  
rb\_raise(rb\_eRuntimeError, “continuation called across threads”);  
}

- if (cont-\>saved\_thread.trap\_tag != th-\>trap\_tag) {

- rb\_raise(rb\_eRuntimeError, “continuation called across trap”);

- }  
if (cont-\>saved\_thread.fiber) {  
rb\_fiber\_t \*fcont;  
GetFiberPtr(cont-\>saved\_thread.fiber, fcont);  
@@ -940,9 +936,6 @@ fiber\_switch(VALUE fibval, int argc, VALUE \*argv,  
int is\_resume)  
if (cont-\>saved\_thread.self != th-\>self) {  
rb\_raise(rb\_eFiberError, “fiber called across threads”);  
}

- else if (cont-\>saved\_thread.trap\_tag != th-\>trap\_tag) {

- rb\_raise(rb\_eFiberError, “fiber called across trap”);

- }  
else if (fib-\>status == TERMINATED) {  
value = rb\_exc\_new2(rb\_eFiberError, “dead fiber called”);  
if (th-\>fiber != fibval) rb\_exc\_raise(value);  
diff --git a/eval.c b/eval.c  
index c5a72dc…aa01d81 100644  
— a/eval.c  
+++ b/eval.c  
@@ -677,19 +677,14 @@ rb\_protect(VALUE (\* proc) (VALUE), VALUE data,  
int \* state)  
int status;  
rb\_thread\_t \*th = GET\_THREAD();  
rb\_control\_frame\_t \*cfp = th-\>cfp;

- struct rb\_vm\_trap\_tag trap\_tag;  
rb\_jmpbuf\_t org\_jmpbuf;

- trap\_tag.prev = th-\>trap\_tag;

- PUSH\_TAG();

- th-\>trap\_tag = &trap\_tag;  
MEMCPY(&org\_jmpbuf, &(th)-\>root\_jmpbuf, rb\_jmpbuf\_t, 1);  
if ((status = EXEC\_TAG()) == 0) {  
SAVE\_ROOT\_JMPBUF(th, result = (\*proc) (data));  
}  
MEMCPY(&(th)-\>root\_jmpbuf, &org\_jmpbuf, rb\_jmpbuf\_t, 1);

- th-\>trap\_tag = trap\_tag.prev;  
POP\_TAG();

-struct rb\_vm\_trap\_tag {

- struct rb\_vm\_trap\_tag \*prev;  
-};
- 

#define RUBY\_VM\_VALUE\_CACHE\_SIZE 0x1000  
#define USE\_VALUE\_CACHE 0

@@ -414,7 +410,6 @@ typedef struct rb\_thread\_struct  
int transition\_for\_lock;

```
 struct rb_vm_tag *tag;

```

- struct rb\_vm\_trap\_tag \*trap\_tag;

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [January 25, 2010, 2:26pm UTC](https://www.ruby-forum.com/t/bug-trunk-cannot-resume-fiber-from-forked-process/182014/2 "2010-01-25T14:26:51Z")

</div>

e$B%A%1%C%He(B #2621 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B  
ruby -v ruby 1.9.2dev (2010-01-25 trunk 26406)  
[i686-linux]e$B$K%;%C%He(B

## e$BH?BP$,$J$+$C$?$N$G%3%\_%C%H$7$^$7$?e(B (r26407)

[http://redmine.ruby-lang.org/issues/show/2621](http://redmine.ruby-lang.org/issues/show/2621)

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [January 25, 2010, 7:28pm UTC](https://www.ruby-forum.com/t/bug-trunk-cannot-resume-fiber-from-forked-process/182014/3 "2010-01-25T19:28:24Z")

</div>

e$B%A%1%C%He(B #2621 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B$J$+$@$5$s$K$3$N%A%'%C%/$OI,MW$H8@$o$l$?$N$Ge(B revert  
e$B$7$^$7$?!#e(B  
rb\_protect e$B$re(B callcc  
e$B$GH4$1$i$l$k$H3N$+$K$^$:$=$&$G$7$?!#$9$\_$^$;$s!#e(B

# Fiber e$B$re(B resume

e$B$7$F$^$:$$Nc$O$h$/$o$+$j$^$;$s$,$H$j$"$($:La$7$^$7$?e(B

## e$B$=$l$G$be(B trap e$B$OJQ$J$N$G!"e(Btrap\_tag e$B$Oe(B protect\_tag e$B$K!"Nc30%a%C%;!\<%8$Ne(B across trap e$B$Oe(B across stack rewinding barrier e$B$KCV$-49$($^$7$?!#e(B

[http://redmine.ruby-lang.org/issues/show/2621](http://redmine.ruby-lang.org/issues/show/2621)
