** Also affects: mir (Ubuntu) Importance: Undecided Status: New -- You received this bug notification because you are a member of Ubuntu Touch seeded packages, which is subscribed to mir in Ubuntu. https://bugs.launchpad.net/bugs/1464690
Title: [regression] titlebar in "canonical" example WM + KeyRepeatDispatcher causes deadlock Status in Mir: Fix Committed Status in mir package in Ubuntu: New Bug description: Introducing the KeyRepeatDispatcher means that input events can now occur on two threads: the "Input dispatch" thread and the GLibMainLoop thread. This leads to lock contention in EventFilterChainDispatcher which isn't necessarily fatal - but I think we'd be better using a single thread for dispatching input (to impose an order on events). What is fatal is that this breaks the (dubious) assumption in CanonicalWindowManagerPolicyCopy that we can wait for swap_buffers() while handling an input event. This leads to a deadlock if an input event is on the GLibMainLoop thread (in the original description this is in EventFilterChainDispatcher, but that just prevents it occurring in BasicWindowManagerCopy). Original text: I caused this while testing a branch (lp:~alan- griffiths/mir/msh_SystemCompositorWindowManager), but I don't think the problem originates there: $ sudo bin/mir_demo_server --file /tmp/mir_socket --vt 2 --arw-file --window-manager system-compositor $ bin/mir_demo_server --host /tmp/mir_socket --window-manager canonical $ bin/mir_demo_client_multiwin & bin/mir_demo_client_eglplasma & After a few Alt+Tab focus switches things lock up in the nested server. Attaching with GDB gets the following stack traces: The event loop (via) KeyRepeatDispatcher is waiting for a lock in EventFilterChainDispatcher::handle(). #0 __lll_lock_wait () at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135 #1 0x00007ffff6960cfd in __GI___pthread_mutex_lock (mutex=0x7ca060) at ../nptl/pthread_mutex_lock.c:80 #2 0x00007ffff76e7815 in __gthread_mutex_lock (__mutex=0x7ca060) at /usr/include/x86_64-linux-gnu/c++/4.9/bits/gthr-default.h:748 #3 0x00007ffff76e8738 in std::mutex::lock (this=0x7ca060) at /usr/include/c++/4.9/mutex:135 #4 0x00007ffff76e8b2e in std::lock_guard<std::mutex>::lock_guard (this=0x7fffffffdbb0, __m=...) at /usr/include/c++/4.9/mutex:377 #5 0x00007ffff775d1db in mir::input::EventFilterChainDispatcher::handle (this=0x7ca050, event=...) at /home/alan/display_server/mir3/src/server/input/event_filter_chain_dispatcher.cpp:34 #6 0x00007ffff775d510 in mir::input::EventFilterChainDispatcher::dispatch (this=0x7ca050, event=...) at /home/alan/display_server/mir3/src/server/input/event_filter_chain_dispatcher.cpp:67 #7 0x00007ffff7796e2e in mir::input::KeyRepeatDispatcher::<lambda()>::operator()(void) (__closure=0x7fffe000a0a0) at /home/alan/display_server/mir3/src/server/input/key_repeat_dispatcher.cpp:117 #8 0x00007ffff7797512 in std::_Function_handler<void(), mir::input::KeyRepeatDispatcher::handle_key_input(MirInputDeviceId, const MirKeyboardEvent*)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/4.9/functional:2039 #9 0x00007ffff76ee54c in std::function<void ()>::operator()() const (this=0x7fffe0000e68) at /usr/include/c++/4.9/functional:2439 #10 0x00007ffff773b626 in mir::BasicCallback::operator() (this=0x7fffe0000e60) at /home/alan/display_server/mir3/src/server/basic_callback.cpp:28 #11 0x00007ffff773b111 in mir::LockableCallbackWrapper::operator() (this=0x7fffe00036f0) at /home/alan/display_server/mir3/src/server/lockable_callback_wrapper.cpp:41 #12 0x00007ffff770face in mir::detail::TimerGSource::dispatch (source=0x949320) at /home/alan/display_server/mir3/src/server/glib_main_loop_sources.cpp:299 #13 0x00007ffff5443c3d in g_main_context_dispatch () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #14 0x00007ffff5443f20 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #15 0x00007ffff5443fcc in g_main_context_iteration () from /lib/x86_64-linux-gnu/libglib-2.0.so.0 #16 0x00007ffff7705f91 in mir::GLibMainLoop::run (this=0x6f6e70) ---Type <return> to continue, or q <return> to quit--- The lock is held by the window manager (which is trying to paint a titlebar). #0 pthread_cond_wait@@GLIBC_2.3.2 () at ../sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185 #1 0x00007ffff64f7d1c in std::condition_variable::wait(std::unique_lock<std::mutex>&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #2 0x00000000004b270b in std::condition_variable::wait<(anonymous namespace)::swap_buffers(const std::shared_ptr<mir::scene::Surface>&, mir::graphics::Buffer*&)::<lambda()> >(std::unique_lock<std::mutex> &, (anonymous namespace)::<lambda()>) ( this=0x7fffee2f21b0, __lock=..., __p=...) at /usr/include/c++/4.9/condition_variable:98 #3 0x00000000004aeaa4 in (anonymous namespace)::swap_buffers (surface=std::shared_ptr (count 4, weak 4) 0x7fffc4006750, surface_buffer=@0x7fffc4006fc0: 0x7fffc40113f0) at /home/alan/display_server/mir3/examples/server_example_canonical_window_manager.cpp:277 #4 0x00000000004aecea in (anonymous namespace)::paint_titlebar (titlebar=std::shared_ptr (count 4, weak 4) 0x7fffc4006750, titlebar_info=..., intensity=255) at /home/alan/display_server/mir3/examples/server_example_canonical_window_manager.cpp:297 #5 0x00000000004b0f45 in mir::examples::CanonicalWindowManagerPolicyCopy::select_active_surface (this=0x944cd8, surface=std::shared_ptr (count 3, weak 5) 0x7fffc4004fd0) at /home/alan/display_server/mir3/examples/server_example_canonical_window_manager.cpp:742 #6 0x00000000004b042a in mir::examples::CanonicalWindowManagerPolicyCopy::handle_keyboard_event (this=0x944cd8, event=0x7fffe0000910) at /home/alan/display_server/mir3/examples/server_example_canonical_window_manager.cpp:577 #7 0x00000000004a0c5e in mir::examples::BasicWindowManagerCopy<mir::examples::CanonicalWindowManagerPolicyCopy, mir::examples::CanonicalSessionInfoCopy, mir::examples::CanonicalSurfaceInfoCopy>::handle_keyboard_event (this=0x944cc0, event=0x7fffe0000910) at /home/alan/display_server/mir3/examples/server_example_basic_window_manager.h:190 #8 0x00007ffff78beccb in mir::shell::AbstractShell::handle (this=0x944bf0, event=...) at /home/alan/display_server/mir3/src/server/shell/abstract_shell.cpp:245 #9 0x00007ffff775d27c in mir::input::EventFilterChainDispatcher::handle (this=0x7ca050, event=...) at /home/alan/display_server/mir3/src/server/input/event_filter_chain_dispatcher.cpp:45 #10 0x00007ffff775d510 in mir::input::EventFilterChainDispatcher::dispatch (this=0x7ca050, event=...) at /home/alan/display_server/mir3/src/server/input/event_filter_chain_dispatcher.cpp:67 #11 0x00007ffff7796d22 in mir::input::KeyRepeatDispatcher::dispatch (this=0x7ca0d0, event=...) at /home/alan/display_server/mir3/src/server/input/key_repeat_dispatcher.cpp:63 ---Type <return> to continue, or q <return> to quit--- I guess the titlebar paint doesn't complete because the event loop is waiting. To manage notifications about this bug go to: https://bugs.launchpad.net/mir/+bug/1464690/+subscriptions -- Mailing list: https://launchpad.net/~touch-packages Post to : touch-packages@lists.launchpad.net Unsubscribe : https://launchpad.net/~touch-packages More help : https://help.launchpad.net/ListHelp