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
d4d4f1b0
Commit
d4d4f1b0
authored
Mar 21, 2014
by
take_cheeze
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
implement Fiber#transfer
parent
07bd65ae
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
32 additions
and
0 deletions
+32
-0
mrbgems/mruby-fiber/src/fiber.c
mrbgems/mruby-fiber/src/fiber.c
+13
-0
mrbgems/mruby-fiber/test/fiber.rb
mrbgems/mruby-fiber/test/fiber.rb
+19
-0
No files found.
mrbgems/mruby-fiber/src/fiber.c
View file @
d4d4f1b0
...
...
@@ -226,6 +226,18 @@ fiber_eq(mrb_state *mrb, mrb_value self)
return
mrb_bool_value
(
fiber_ptr
(
self
)
==
fiber_ptr
(
other
));
}
static
mrb_value
fiber_transfer
(
mrb_state
*
mrb
,
mrb_value
self
)
{
mrb_value
result
=
fiber_resume
(
mrb
,
self
);
mrb_assert
(
mrb
->
c
->
prev
);
mrb_assert
(
mrb
->
c
->
prev
->
prev
);
mrb
->
c
->
prev
->
status
=
MRB_FIBER_SUSPENDED
;
mrb
->
c
->
prev
=
mrb
->
c
->
prev
->
prev
;
return
result
;
}
mrb_value
mrb_fiber_yield
(
mrb_state
*
mrb
,
int
len
,
mrb_value
*
a
)
...
...
@@ -300,6 +312,7 @@ mrb_mruby_fiber_gem_init(mrb_state* mrb)
mrb_define_method
(
mrb
,
c
,
"initialize"
,
fiber_init
,
MRB_ARGS_NONE
());
mrb_define_method
(
mrb
,
c
,
"resume"
,
fiber_resume
,
MRB_ARGS_ANY
());
mrb_define_method
(
mrb
,
c
,
"transfer"
,
fiber_transfer
,
MRB_ARGS_ANY
());
mrb_define_method
(
mrb
,
c
,
"alive?"
,
fiber_alive_p
,
MRB_ARGS_NONE
());
mrb_define_method
(
mrb
,
c
,
"=="
,
fiber_eq
,
MRB_ARGS_REQ
(
1
));
...
...
mrbgems/mruby-fiber/test/fiber.rb
View file @
d4d4f1b0
...
...
@@ -8,6 +8,25 @@ assert('Fiber#resume') {
f
.
resume
(
2
)
}
assert
(
'Fiber#transfer'
)
do
f1
=
Fiber
.
new
do
|
v
|
assert_raise
(
FiberError
)
{
Fiber
.
current
.
transfer
}
Fiber
.
yield
v
end
f2
=
Fiber
.
new
do
f1
.
transfer
(
1
)
Fiber
.
yield
2
end
assert_equal
1
,
f2
.
resume
assert_equal
2
,
f2
.
resume
f1
.
resume
f2
.
resume
assert_false
f1
.
alive?
assert_false
f2
.
alive?
assert_raise
(
FiberError
)
{
Fiber
.
current
.
transfer
}
end
assert
(
'Fiber#alive?'
)
{
f
=
Fiber
.
new
{
Fiber
.
yield
}
f
.
resume
...
...
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