summaryrefslogtreecommitdiff
path: root/cont.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-12 20:49:19 (GMT)
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-12 20:49:19 (GMT)
commitd40694de726aab80ced4d4a264d08664db2112d2 (patch)
treee2057bc01109b93901b0afa1c10b1f0d572b9bb0 /cont.c
parent7ae24709a6316a5f5387cde6332b5d97db431b07 (diff)
cont.c (fiber_memsize): do not rely on ROOT_FIBER_CONTEXT
We can check if the fiber we're interested in is the th->root_fiber for the owner thread, so there is no need to use ROOT_FIBER_CONTEXT. Note: there is no guarantee th->ec points to &th->root_fiber->cont.saved_ec, thus vm::thread_memsize may not account for root fiber correctly (pre-existing bug). [Bug #15050] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64705 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/cont.c b/cont.c
index 2b83c52..27f956f 100644
--- a/cont.c
+++ b/cont.c
@@ -493,12 +493,15 @@ static size_t
fiber_memsize(const void *ptr)
{
const rb_fiber_t *fib = ptr;
- size_t size = 0;
+ size_t size = sizeof(*fib);
+ const rb_execution_context_t *saved_ec = &fib->cont.saved_ec;
+ const rb_thread_t *th = rb_ec_thread_ptr(saved_ec);
- size = sizeof(*fib);
- if (fib->cont.type != ROOT_FIBER_CONTEXT &&
- fib->cont.saved_ec.local_storage != NULL) {
- size += st_memsize(fib->cont.saved_ec.local_storage);
+ /*
+ * vm.c::thread_memsize already counts th->ec->local_storage
+ */
+ if (saved_ec->local_storage && fib != th->root_fiber) {
+ size += st_memsize(saved_ec->local_storage);
}
size += cont_memsize(&fib->cont);
return size;