зеркало из https://github.com/github/ruby.git
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
This commit is contained in:
Родитель
7ae24709a6
Коммит
d40694de72
13
cont.c
13
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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче