Skip to content

Assertion in ~SkiaUnrefQueue() #82353

@knopp

Description

@knopp

Happens on IO thread in linux when closing window that has animation in it.

The problem is that unref tasks are posted with 8ms delay (see ShellIOManager constructor). When MessageLoop quits, these tasks are not expired yet, and thus they are simply disposed without being run. When last task is disposed, the queue is unreffed with objects_ not being empty.

Stack Trace

raise (@raise:45)
abort (@abort:60)
fml::KillProcess() (/home/matej/Projects/flutter/engine/src/flutter/fml/logging.cc:143)
fml::LogMessage::~LogMessage() (/home/matej/Projects/flutter/engine/src/flutter/fml/logging.cc:130)
flutter::SkiaUnrefQueue::~SkiaUnrefQueue() (/home/matej/Projects/flutter/engine/src/flutter/flow/skia_gpu_object.cc:21)
fml::RefCountedThreadSafe<flutter::SkiaUnrefQueue>::Release() const (/home/matej/Projects/flutter/engine/src/flutter/fml/memory/ref_counted.h:73)
fml::RefPtr<flutter::SkiaUnrefQueue>::~RefPtr() (/home/matej/Projects/flutter/engine/src/flutter/fml/memory/ref_ptr.h:108)
flutter::SkiaUnrefQueue::Unref(SkRefCnt*)::$_0::~$_0() (/home/matej/Projects/flutter/engine/src/flutter/flow/skia_gpu_object.cc:30)
std::__1::__compressed_pair_elem<flutter::SkiaUnrefQueue::Unref(SkRefCnt*)::$_0, 0, false>::~__compressed_pair_elem() (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/memory:2133)
std::__1::__compressed_pair<flutter::SkiaUnrefQueue::Unref(SkRefCnt*)::$_0, std::__1::allocator<flutter::SkiaUnrefQueue::Unref(SkRefCnt*)::$_0> >::~__compressed_pair() (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/memory:2210)
std::__1::__function::__alloc_func<flutter::SkiaUnrefQueue::Unref(SkRefCnt*)::$_0, std::__1::allocator<flutter::SkiaUnrefQueue::Unref(SkRefCnt*)::$_0>, void ()>::destroy() (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/functional:1552)
std::__1::__function::__func<flutter::SkiaUnrefQueue::Unref(SkRefCnt*)::$_0, std::__1::allocator<flutter::SkiaUnrefQueue::Unref(SkRefCnt*)::$_0>, void ()>::destroy_deallocate() (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/functional:1699)
std::__1::__function::__value_func<void ()>::~__value_func() (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/functional:1821)
std::__1::function<void ()>::~function() (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/functional:2406)
fml::DelayedTask::~DelayedTask() (/home/matej/Projects/flutter/engine/src/flutter/fml/delayed_task.cc:20)
std::__1::allocator<fml::DelayedTask>::destroy(fml::DelayedTask*) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/memory:1880)
void std::__1::allocator_traits<std::__1::allocator<fml::DelayedTask> >::__destroy<fml::DelayedTask>(std::__1::integral_constant<bool, true>, std::__1::allocator<fml::DelayedTask>&, fml::DelayedTask*) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/memory:1742)
void std::__1::allocator_traits<std::__1::allocator<fml::DelayedTask> >::destroy<fml::DelayedTask>(std::__1::allocator<fml::DelayedTask>&, fml::DelayedTask*) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/memory:1595)
std::__1::__deque_base<fml::DelayedTask, std::__1::allocator<fml::DelayedTask> >::clear() (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/deque:1179)
std::__1::deque<fml::DelayedTask, std::__1::allocator<fml::DelayedTask> >::clear() (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/deque:2874)
std::__1::deque<fml::DelayedTask, std::__1::allocator<fml::DelayedTask> >::__move_assign(std::__1::deque<fml::DelayedTask, std::__1::allocator<fml::DelayedTask> >&, std::__1::integral_constant<bool, true>) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/deque:1632)
std::__1::deque<fml::DelayedTask, std::__1::allocator<fml::DelayedTask> >::operator=(std::__1::deque<fml::DelayedTask, std::__1::allocator<fml::DelayedTask> >&&) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/deque:1609)
std::__1::priority_queue<fml::DelayedTask, std::__1::deque<fml::DelayedTask, std::__1::allocator<fml::DelayedTask> >, std::__1::greater<fml::DelayedTask> >::operator=(std::__1::priority_queue<fml::DelayedTask, std::__1::deque<fml::DelayedTask, std::__1::allocator<fml::DelayedTask> >, std::__1::greater<fml::DelayedTask> >&&) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/queue:467)
fml::TaskSource::ShutDown() (/home/matej/Projects/flutter/engine/src/flutter/fml/task_source.cc:19)
fml::MessageLoopTaskQueues::DisposeTasks(fml::TaskQueueId) (/home/matej/Projects/flutter/engine/src/flutter/fml/message_loop_task_queues.cc:91)
fml::MessageLoopImpl::DoRun() (/home/matej/Projects/flutter/engine/src/flutter/fml/message_loop_impl.cc:112)
fml::MessageLoop::Run() (/home/matej/Projects/flutter/engine/src/flutter/fml/message_loop.cc:49)
fml::Thread::Thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0::operator()() const (/home/matej/Projects/flutter/engine/src/flutter/fml/thread.cc:35)
decltype(std::__1::forward<fml::Thread::Thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fp)()) std::__1::__invoke<fml::Thread::Thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fml::Thread::Thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0&&) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/type_traits:3530)
void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, fml::Thread::Thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, fml::Thread::Thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>&, std::__1::__tuple_indices<>) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/thread:341)
void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, fml::Thread::Thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0> >(void*) (/home/matej/Projects/flutter/engine/src/third_party/libcxx/include/thread:351)
start_thread (@start_thread:51)
__clone (@__clone:26)

The behavior to not drain the SkiaUnrefQueue in destructor was introduced here.

/cc @jason-simmons /cc @chinmaygarde

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Important issues not at the top of the work listengineflutter/engine related. See also e: labels.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions