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
ebd6636a
Commit
ebd6636a
authored
7 years ago
by
Yukihiro "Matz" Matsumoto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Call write barriers for stack-modified fibers; fix #3699
parent
d7e09ffa
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
22 additions
and
9 deletions
+22
-9
mrbgems/mruby-fiber/src/fiber.c
mrbgems/mruby-fiber/src/fiber.c
+13
-8
src/vm.c
src/vm.c
+9
-1
No files found.
mrbgems/mruby-fiber/src/fiber.c
View file @
ebd6636a
...
...
@@ -171,6 +171,16 @@ fiber_check_cfunc(mrb_state *mrb, struct mrb_context *c)
}
}
static
void
fiber_switch_context
(
mrb_state
*
mrb
,
struct
mrb_context
*
c
)
{
if
(
mrb
->
c
->
fib
)
{
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
mrb
->
c
->
fib
);
}
c
->
status
=
MRB_FIBER_RUNNING
;
mrb
->
c
=
c
;
}
static
mrb_value
fiber_switch
(
mrb_state
*
mrb
,
mrb_value
self
,
mrb_int
len
,
const
mrb_value
*
a
,
mrb_bool
resume
,
mrb_bool
vmexec
)
{
...
...
@@ -207,9 +217,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
else
{
value
=
fiber_result
(
mrb
,
a
,
len
);
}
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
c
->
fib
);
c
->
status
=
MRB_FIBER_RUNNING
;
mrb
->
c
=
c
;
fiber_switch_context
(
mrb
,
c
);
if
(
vmexec
)
{
c
->
vmexec
=
TRUE
;
...
...
@@ -308,10 +316,8 @@ fiber_transfer(mrb_state *mrb, mrb_value self)
if
(
c
==
mrb
->
root_c
)
{
mrb
->
c
->
status
=
MRB_FIBER_TRANSFERRED
;
mrb
->
c
=
c
;
c
->
status
=
MRB_FIBER_RUNNING
;
fiber_switch_context
(
mrb
,
c
);
MARK_CONTEXT_MODIFY
(
c
);
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
c
->
fib
);
return
fiber_result
(
mrb
,
a
,
len
);
}
...
...
@@ -336,13 +342,12 @@ mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a)
fiber_check_cfunc
(
mrb
,
c
);
c
->
prev
->
status
=
MRB_FIBER_RUNNING
;
c
->
status
=
MRB_FIBER_SUSPENDED
;
mrb
->
c
=
c
->
prev
;
fiber_switch_context
(
mrb
,
c
->
prev
)
;
c
->
prev
=
NULL
;
if
(
c
->
vmexec
)
{
c
->
vmexec
=
FALSE
;
mrb
->
c
->
ci
->
acc
=
CI_ACC_RESUMED
;
}
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
c
->
fib
);
MARK_CONTEXT_MODIFY
(
mrb
->
c
);
return
fiber_result
(
mrb
,
a
,
len
);
}
...
...
This diff is collapsed.
Click to expand it.
src/vm.c
View file @
ebd6636a
...
...
@@ -867,7 +867,12 @@ mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stac
if
(
c
->
ci
-
c
->
cibase
>
cioff
)
{
c
->
ci
=
c
->
cibase
+
cioff
;
}
mrb
->
c
=
c
;
if
(
mrb
->
c
!=
c
)
{
if
(
mrb
->
c
->
fib
)
{
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
mrb
->
c
->
fib
);
}
mrb
->
c
=
c
;
}
return
result
;
}
...
...
@@ -1819,6 +1824,9 @@ RETRY_TRY_BLOCK:
else
{
struct
mrb_context
*
c
=
mrb
->
c
;
if
(
c
->
fib
)
{
mrb_write_barrier
(
mrb
,
(
struct
RBasic
*
)
c
->
fib
);
}
mrb
->
c
=
c
->
prev
;
c
->
prev
=
NULL
;
goto
L_RAISE
;
...
...
This diff is collapsed.
Click to expand it.
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