UI freezes when simultaneously moving mouse & plug/unplug HDMI

Bug #1538632 reported by kevin gunn
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Canonical Pocket Desktop
Critical
kevin gunn
Canonical System Image
Critical
Unassigned
Mir
Fix Released
Critical
Andreas Pokorny
0.19
Fix Released
Critical
Andreas Pokorny
mir (Ubuntu)
Undecided
Unassigned

Bug Description

confirmed to happen in latest image with usc0.3 and previous images with usc0.2

steps
1) flash ubuntu-touch/rc-proposed/ubuntu-pd
2) connect bt mouse and see unity8 go into windowed mode
3) move mouse about screen while at the same time connect slimport hdmi cable

ui will then freeze but seems content, let it sit for 30 min no reboot or restart, no crash files, power button does not do anything.
It's also possible to have the slimport already connected - move mouse around disconnect, the ui will freeze altho in this case unity8 always seems to restart.

There are no usc crash files.

The problem is a dead lock on the Display/DisplaySyncGroup mutexes between CompositingFunctor->SystemWindowManager->GraphicsDisplayLayout and DisplayInputRegion.

Thread 6 (Thread 0xb0dff3d0 (LWP 1530)):
#0 0xb6cd5d44 in __libc_do_syscall () from /lib/arm-linux-gnueabihf/libpthread.so.0
No symbol table info available.
#1 0xb6cd395c in __lll_lock_wait () from /lib/arm-linux-gnueabihf/libpthread.so.0
No symbol table info available.
#2 0xb6ccf19e in pthread_mutex_lock () from /lib/arm-linux-gnueabihf/libpthread.so.0
No symbol table info available.
#3 0xb6426f02 in __gthread_mutex_lock (__mutex=0x1b34f14)
    at /usr/include/arm-linux-gnueabihf/c++/4.9/bits/gthr-default.h:748
No locals.
#4 lock (this=0x1b34f14) at /usr/include/c++/4.9/mutex:135
No locals.
#5 lock_guard (__m=..., this=0xb0dfeaf0) at /usr/include/c++/4.9/mutex:377
No locals.
#6 mir::graphics::android::Display::configuration (this=0x1b34ef8)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/platforms/android/server/display.cpp:231
        lock = {_M_device = @0x1b34f14}
#7 0xb6e656ca in mir::shell::GraphicsDisplayLayout::place_in_output (this=<optimized out>, id=...,
    rect=...)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/shell/graphics_display_layout.cpp:72
        config = std::unique_ptr<mir::graphics::DisplayConfiguration> containing 0xb6eb69c8
        placed = false
#8 0xb6e6a888 in mir::shell::SystemCompositorWindowManager::add_display (this=0x1d07b24)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/shell/system_compositor_window_manager.cpp:1 output_id = <optimized out>
        rect = {top_left = {x = {value = 0}, y = {value = 0}}, size = {width = {value = 768}, height = {
              value = 1280}}}
        surface = std::shared_ptr (count 3, weak 4) 0x0
        __for_range = <optimized out>
        lock = {_M_device = @0x1d07b3c}
#9 0xb6e1ab32 in operator() (buffer=..., __closure=<optimized out>)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/compositor/multi_threaded_compositor.cpp:96
No locals.
#10 std::_Function_handler<void (mir::graphics::DisplayBuffer&), mir::compositor::CompositingFunctor::operator()()::{lambda()#2}::operator()() const::{lambda(mir::graphics::DisplayBuffer&)#1}>::_M_invoke(std::_Any_data const&, mir::graphics::DisplayBuffer&) (__functor=..., __args#0=...)
    at /usr/include/c++/4.9/functional:2039
No locals.
#11 0xb64288a8 in operator() (__args#0=..., this=0xb0dfeca0) at /usr/include/c++/4.9/functional:2439
No locals.
#12 mir::graphics::android::DisplayGroup::for_each_display_buffer(std::function<void (mir::graphics::DisplayBuffer&)> const&) (this=0x1b35024, f=...)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/platforms/android/server/display_group.cpp:51
        __for_range = std::map with 1 elements = {
          [mir::graphics::android::DisplayName::primary] = std::unique_ptr<mir::graphics::android::ConfigurableDisplayBuffer> containing 0x1c0db40}
        lk = {_M_device = 0x1b35028, _M_owns = true}
#13 0xb6e1b896 in operator() (__closure=<optimized out>)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/compositor/multi_threaded_compositor.cpp:96
No locals.
#14 PairedCalls (deleter=<optimized out>, creator=<optimized out>, this=0xb0dfec84)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/include/common/mir/raii.h:33
No locals.
#15 paired_calls<mir::compositor::CompositingFunctor::operator()()::<lambda()>, mir::compositor::CompositingFunctor::operator()()::<lambda()> > (deleter=<optimized out>, creator=<optimized out>)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/include/common/mir/raii.h:66
No locals.
#16 mir::compositor::CompositingFunctor::operator() (this=0x1d112d8)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/compositor/multi_threaded_compositor.cpp:98
        disp_listener = std::shared_ptr (count 5, weak 2) 0x1d07aac
        display_registration = {deleter = {__this = 0x1d112d8,
            __disp_listener = std::shared_ptr (count 5, weak 2) 0x1d07aac}, owner = true}
        compositor_registration = <optimized out>
        compositors = std::vector of length 1, capacity 1 = {std::tuple containing = {[1] = 0x1c0db40,
            [2] = std::unique_ptr<mir::compositor::DisplayBufferCompositor> containing 0xb0499848}}
        lock = {_M_device = 0xb0402c44, _M_owns = true}
#17 0xb6e8aa58 in operator() (this=0xb0dfed84) at /usr/include/c++/4.9/functional:2439
No locals.
#18 execute (this=0xb0dfed84)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/thread/basic_thread_pool.cpp:40
No locals.
#19 operator() (this=0x1d1ce88)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/thread/basic_thread_pool.cpp:91
        task = {
          task = {<std::_Maybe_unary_or_binary_function<void>> = {<No data fields>}, <std::_Function_base> = {static _M_max_size = 8, static _M_max_align = 4, _M_functor = {_M_unused = {_M_object = 0x1d112d8,
                  _M_const_object = 0x1d112d8, _M_function_pointer = 0x1d112d8,38
                  _M_member_pointer = (void (std::_Undefined_class::*)(std::_Undefined_class * const)) 0x1d112d8}, _M_pod_data = "\330\022\321\001\000\000\000"},
              _M_manager = 0xb6e1ab91 <std::_Function_base::_Ref_manager<mir::compositor::CompositingFunctor>::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation)>},
            _M_invoker = 0xb6e1bf3d <std::_Function_handler<void (), std::reference_wrapper<mir::compositor::CompositingFunctor> >::_M_invoke(std::_Any_data const&)>}, promise = {
            _M_future = std::shared_ptr (count 2, weak 0) 0x1d1c7f0,
            _M_storage = std::unique_ptr<std::__future_base::_Result<void>> containing 0x1d0ae90},
          task_exception = {_M_exception_object = 0x0}}
        lock = {_M_device = 0x1d1ceb4, _M_owns = false}
#20 __invoke<(anonymous namespace)::Worker> (__f=...) at /usr/include/c++/4.9/functional:202
No locals.
#21 operator()<> (this=<optimized out>) at /usr/include/c++/4.9/functional:435
No locals.
#22 _M_invoke<> (this=<optimized out>) at /usr/include/c++/4.9/functional:1700
No locals.
#23 operator() (this=<optimized out>) at /usr/include/c++/4.9/functional:1688
No locals.
#24 std::thread::_Impl<std::_Bind_simple<std::reference_wrapper<(anonymous namespace)::Worker>()> >::_M_run(void) (this=<optimized out>) at /usr/include/c++/4.9/thread:115
No locals.
#25 0xb6c332a0 in ?? () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6
No symbol table info available.
#26 0xb6ccd490 in start_thread () from /lib/arm-linux-gnueabihf/libpthread.so.0
No symbol table info available.
#27 0xb6b27c4c in ?? () from /lib/arm-linux-gnueabihf/libc.so.6
No symbol table info available.
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

#0 0xb6cd5d44 in __libc_do_syscall () from /lib/arm-linux-gnueabihf/libpthread.so.0
No symbol table info available.
#1 0xb6cd395c in __lll_lock_wait () from /lib/arm-linux-gnueabihf/libpthread.so.0
No symbol table info available.
#2 0xb6ccf19e in pthread_mutex_lock () from /lib/arm-linux-gnueabihf/libpthread.so.0
No symbol table info available.
#3 0xb642887e in __gthread_mutex_lock (__mutex=0x1b35028)
    at /usr/include/arm-linux-gnueabihf/c++/4.9/bits/gthr-default.h:748
No locals.
#4 lock (this=0x1b35028) at /usr/include/c++/4.9/mutex:135
No locals.
#5 lock (this=0xafbfe9a4) at /usr/include/c++/4.9/mutex:474
No locals.
#6 unique_lock (__m=..., this=0xafbfe9a4) at /usr/include/c++/4.9/mutex:406
No locals.
#7 mir::graphics::android::DisplayGroup::for_each_display_buffer(std::function<void (mir::graphics::DisplayBuffer&)> const&) (this=0x1b35024, f=...)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/platforms/android/server/display_group.cpp:48
        lk = {_M_device = 0x1b35028, _M_owns = false}
#8 0xb6de02c0 in operator() (group=..., __closure=<optimized out>)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/input/display_input_region.cpp:70
No locals.
#9 std::_Function_handler<void(mir::graphics::DisplaySyncGroup&), mir::input::DisplayInputRegion::confine(mir::geometry::Point&)::<lambda(mir::graphics::DisplaySyncGroup&)> >::_M_invoke(const std::_Any_data &, mir::graphics::DisplaySyncGroup &) (__functor=..., __args#0=...)
    at /usr/include/c++/4.9/functional:2039
No locals.
#10 0xb64258ee in operator() (__args#0=..., this=0xafbfea10) at /usr/include/c++/4.9/functional:2439
No locals.
#11 mir::graphics::android::Display::for_each_display_sync_group(std::function<void (mir::graphics::DisplaySyncGroup&)> const&) (this=0x1b34ef8, f=...)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/platforms/android/server/display.cpp:226
        lock = {_M_device = @0x1b34f14}
#12 0xb6de04ae in mir::input::DisplayInputRegion::confine (this=<optimized out>, point=...)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/input/display_input_region.cpp:71
        rectangles = {rectangles = std::vector of length 0, capacity 0, bounding_rectangle_ = {
            top_left = {x = {value = 0}, y = {value = 0}}, size = {width = {value = 0}, height = {
                value = 0}}}}
#13 0xb6de37e0 in mir::input::Seat::update_cursor (this=this@entry=0x1d09078,
    event=event@entry=0xaf217308)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/input/seat.cpp:193
        movement = <optimized out>
#14 0xb6de3d0c in mir::input::Seat::update_seat_properties (this=0x1d09078,
    event=event@entry=0xaf217308)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/input/seat.cpp:106
        pointer = 0xaf217308
        id = 5
        stored_data = {<std::__detail::_Node_iterator_base<std::pair<long long const, mir::input::Seat::DeviceData>, false>> = {_M_cur = 0xaf213908}, <No data fields>}
        __PRETTY_FUNCTION__ = "void mir::input::Seat::update_seat_properties(const MirInputEvent*)
#15 0xb6ddb2c0 in mir::input::DefaultInputDeviceHub::RegisteredDevice::handle_input (this=0xaf2138b8,
    event=...)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/server/input/default_input_device_hub.cpp:171
        type = <optimized out>
        __PRETTY_FUNCTION__ = "virtual void mir::input::DefaultInputDeviceHub::RegisteredDevice::handle_input(MirEvent&)"
        input_event = 0xaf217308
#16 0xb1fe3c90 in mir::input::evdev::LibInputDevice::process_event (this=0xaf213770,
    event=event@entry=0xaf20c5c0)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/platforms/evdev/libinput_device.cpp:93
No locals.
#17 0xb1fe6fbe in mir::input::evdev::Platform::process_input_events (this=0x1d0bc28)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/platforms/evdev/platform.cpp:123
        ev = std::unique_ptr<libinput_event> containing 0xaf20c5c0
        dev = <optimized out>
        status = <optimized out>
        __PRETTY_FUNCTION__ = "void mir::input::evdev::Platform::process_input_events()"
        next_event = {lilib = 0x1d0bad8}
#18 0xb6d5c714 in operator() (this=<optimized out>) at /usr/include/c++/4.9/functional:2439
No locals.
#19 mir::dispatch::ReadableFd::dispatch (this=<optimized out>, events=<optimized out>)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/common/dispatch/readable_fd.cpp:38
        events = <optimized out>
        this = <optimized out>
#20 0xb6d5a6cc in mir::dispatch::MultiplexingDispatchable::dispatch (this=<optimized out>,
    events=<optimized out>)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/common/dispatch/multiplexing_dispatchable.cpp:210
        source = std::shared_ptr (count 3, weak 0) 0x1d0b35c
        rearm_source = true
        event = {events = 1, data = {ptr = 0xaf2004d8, fd = -1356856104, u32 = 2938111192,
            u64 = 2938111192}}
        __PRETTY_FUNCTION__ = "virtual bool mir::dispatch::MultiplexingDispatchable::dispatch(mir::dispatch::FdEvents)"
#21 0xb6d5a6cc in mir::dispatch::MultiplexingDispatchable::dispatch (this=<optimized out>,
    events=<optimized out>)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/common/dispatch/multiplexing_dispatchable.cpp:210
        source = std::shared_ptr (count 3, weak 0) 0x1d0b09c
        rearm_source = true
        event = {events = 1, data = {ptr = 0xaf20c0a8, fd = -1356808024, u32 = 2938159272,
            u64 = 2938159272}}
        __PRETTY_FUNCTION__ = "virtual bool mir::dispatch::MultiplexingDispatchable::dispatch(mir::dispatch::FdEvents)"
#22 0xb6d5a6cc in mir::dispatch::MultiplexingDispatchable::dispatch (this=<optimized out>,
    events=<optimized out>)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/common/dispatch/multiplexing_dispatchable.cpp:210
        source = std::shared_ptr (count 10, weak 1) 0x1d08914
        rearm_source = false
        event = {events = 1, data = {ptr = 0x1d0fd90, fd = 30473616, u32 = 30473616, u64 = 30473616}}
        __PRETTY_FUNCTION__ = "virtual bool mir::dispatch::MultiplexingDispatchable::dispatch(mir::dispatch::FdEvents)"
#23 0xb6d5ce5a in (anonymous namespace)::dispatch_loop(const std::string &, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::Dispatchable>, const std::function<void()> &) (name=..., thread_register=...,
    dispatcher=std::shared_ptr (count 2, weak 0) 0x1d0fd24, exception_handler=...)
    at /build/mir-ua35pY/mir-0.19.0+15.04.20160126.1/src/common/dispatch/threaded_dispatcher.cpp:211
        waiter = {fd = 61, events = 1, revents = 1}
        running = true
        thread_registrar = {deleter = {
            __thread_register = std::shared_ptr (count 4, weak 0) 0x1d0fc70}, owner = true}
        __PRETTY_FUNCTION__ = "void {anonymous}::dispatch_loop(const string&, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::Dispatchable>, const std::function<void("...
#24 0xb6d5ddf2 in _M_invoke<0u, 1u, 2u, 3u> (this=<optimized out>)
    at /usr/include/c++/4.9/functional:1700
No locals.
#25 operator() (this=<optimized out>) at /usr/include/c++/4.9/functional:1688
No locals.
#26 std::thread::_Impl<std::_Bind_simple<void (*(std::string, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::MultiplexingDispatchable>, std::function<void ()>))(std::string const&, std::shared_ptr<mir::dispatch::ThreadedDispatcher::ThreadShutdownRequestHandler>, std::shared_ptr<mir::dispatch::Dispatchable>, std::function<void ()> const&)> >::_M_run()
    (this=<optimized out>) at /usr/include/c++/4.9/thread:115
No locals.
#27 0xb6c332a0 in ?? () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6
No symbol table info available.
#28 0xb6ccd490 in start_thread () from /lib/arm-linux-gnueabihf/libpthread.so.0
No symbol table info available.
#29 0xb6b27c4c in ?? () from /lib/arm-linux-gnueabihf/libc.so.6
No symbol table info available.
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Related branches

kevin gunn (kgunn72)
Changed in canonical-pocket-desktop:
importance: Undecided → Critical
Changed in unity-system-compositor:
importance: Undecided → Critical
Changed in unity-system-compositor (Ubuntu):
importance: Undecided → Critical
Changed in mir:
importance: Undecided → Critical
assignee: nobody → Andreas Pokorny (andreas-pokorny)
status: New → In Progress
description: updated
Changed in mir:
milestone: none → 0.20.0
kevin gunn (kgunn72)
Changed in canonical-pocket-desktop:
status: New → In Progress
no longer affects: unity-system-compositor
no longer affects: unity-system-compositor (Ubuntu)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

Fix committed into lp:mir at revision None, scheduled for release in mir, milestone 0.20.0

Changed in mir:
status: In Progress → Fix Committed
kevin gunn (kgunn72)
Changed in mir (Ubuntu):
status: New → In Progress
Changed in canonical-pocket-desktop:
assignee: nobody → kevin gunn (kgunn72)
Changed in mir:
milestone: 0.20.0 → 0.19.2
Revision history for this message
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package mir - 0.19.2+16.04.20160210-0ubuntu1

---------------
mir (0.19.2+16.04.20160210-0ubuntu1) xenial; urgency=medium

  [ Alberto Aguirre ]
  * New upstream release 0.19.2 (https://launchpad.net/mir/+milestone/0.19.2)
    - Bugs fixed:
      . Lock ordering issues causing deadlocks between input and display
        configuration (LP: #1538632, LP: #1543594, LP: #1532607)
      . Workaound for a g++ 4.9 bug where std::uncaught_exception()
        unexpectedly returns true

  [ CI Train Bot ]
  * No-change rebuild.

 -- Alberto Aguirre <email address hidden> Wed, 10 Feb 2016 00:57:06 +0000

Changed in mir (Ubuntu):
status: In Progress → Fix Released
Changed in canonical-pocket-desktop:
status: In Progress → Fix Committed
summary: - ui freezes when simultaneously moving mouse & plug/unplug hdmi
+ UI freezes when simultaneously moving mouse & plug/unplug HDMI
no longer affects: mir/0.20
Changed in canonical-devices-system-image:
importance: Undecided → Critical
milestone: none → 9.1
status: New → Fix Committed
Changed in mir:
status: Fix Committed → Fix Released
Changed in canonical-devices-system-image:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers