Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mruby
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
mruby
Commits
62f05614
Commit
62f05614
authored
Mar 15, 2014
by
take_cheeze
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add Fiber's double resume test and fix it.
parent
fc75cff1
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
18 additions
and
3 deletions
+18
-3
include/mruby.h
include/mruby.h
+1
-1
mrbgems/mruby-fiber/src/fiber.c
mrbgems/mruby-fiber/src/fiber.c
+4
-2
mrbgems/mruby-fiber/test/fiber.rb
mrbgems/mruby-fiber/test/fiber.rb
+13
-0
No files found.
include/mruby.h
View file @
62f05614
...
...
@@ -70,7 +70,7 @@ typedef struct {
enum
mrb_fiber_state
{
MRB_FIBER_CREATED
=
0
,
MRB_FIBER_RUNNING
,
MRB_FIBER_
RESUM
ED
,
MRB_FIBER_
SUSPEND
ED
,
MRB_FIBER_TERMINATED
,
};
...
...
mrbgems/mruby-fiber/src/fiber.c
View file @
62f05614
...
...
@@ -161,14 +161,13 @@ fiber_resume(mrb_state *mrb, mrb_value self)
mrb_raise
(
mrb
,
E_ARGUMENT_ERROR
,
"can't cross C function boundary"
);
}
}
if
(
c
->
status
==
MRB_FIBER_R
ESUMED
)
{
if
(
c
->
status
==
MRB_FIBER_R
UNNING
)
{
mrb_raise
(
mrb
,
E_RUNTIME_ERROR
,
"double resume"
);
}
if
(
c
->
status
==
MRB_FIBER_TERMINATED
)
{
mrb_raise
(
mrb
,
E_RUNTIME_ERROR
,
"resuming dead fiber"
);
}
mrb_get_args
(
mrb
,
"*"
,
&
a
,
&
len
);
mrb
->
c
->
status
=
MRB_FIBER_RESUMED
;
if
(
c
->
status
==
MRB_FIBER_CREATED
)
{
mrb_value
*
b
=
c
->
stack
+
1
;
mrb_value
*
e
=
b
+
len
;
...
...
@@ -181,6 +180,7 @@ fiber_resume(mrb_state *mrb, mrb_value self)
if
(
c
->
prev
->
fib
)
mrb_field_write_barrier
(
mrb
,
(
struct
RBasic
*
)
c
->
fib
,
(
struct
RBasic
*
)
c
->
prev
->
fib
);
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
c
->
fib
);
mrb
->
c
->
status
=
MRB_FIBER_SUSPENDED
;
c
->
status
=
MRB_FIBER_RUNNING
;
mrb
->
c
=
c
;
...
...
@@ -192,6 +192,7 @@ fiber_resume(mrb_state *mrb, mrb_value self)
if
(
c
->
prev
->
fib
)
mrb_field_write_barrier
(
mrb
,
(
struct
RBasic
*
)
c
->
fib
,
(
struct
RBasic
*
)
c
->
prev
->
fib
);
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
c
->
fib
);
mrb
->
c
->
status
=
MRB_FIBER_SUSPENDED
;
c
->
status
=
MRB_FIBER_RUNNING
;
mrb
->
c
=
c
;
return
fiber_result
(
mrb
,
a
,
len
);
...
...
@@ -227,6 +228,7 @@ mrb_fiber_yield(mrb_state *mrb, int len, mrb_value *a)
}
c
->
prev
->
status
=
MRB_FIBER_RUNNING
;
c
->
status
=
MRB_FIBER_SUSPENDED
;
mrb
->
c
=
c
->
prev
;
c
->
prev
=
NULL
;
MARK_CONTEXT_MODIFY
(
mrb
->
c
);
...
...
mrbgems/mruby-fiber/test/fiber.rb
View file @
62f05614
...
...
@@ -62,3 +62,16 @@ assert('Yield raises when called on root fiber') {
true
end
}
assert
(
'Double resume of Fiber'
)
do
f1
=
Fiber
.
new
{}
f2
=
Fiber
.
new
{
f1
.
resume
assert_raise
(
RuntimeError
)
{
f2
.
resume
}
Fiber
.
yield
0
}
assert_equal
0
,
f2
.
resume
f2
.
resume
assert_false
f1
.
alive?
assert_false
f2
.
alive?
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment