helgrind: Lock order violated (potential for deadlock) in boost::asio::io_service::run()

Bug #1243570 reported by Daniel van Vugt
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Mir
Invalid
High
Unassigned
boost1.53 (Ubuntu)
New
High
Unassigned

Bug Description

helgrind: Lock order violated (potential for deadlock) in boost::asio::io_service::run()

==21450== ----------------------------------------------------------------
==21450==
==21450== Thread #1: lock order "0x5735520 before 0xA87DD98" violated
==21450==
==21450== Observed (incorrect) order is: acquisition of lock at 0xA87DD98
==21450== at 0x4C2FC35: pthread_mutex_lock (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==21450== by 0x52E6A6F: boost::asio::detail::posix_mutex::lock() (posix_mutex.hpp:52)
==21450== by 0x52EC53F: boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>::scoped_lock(boost::asio::detail::posix_mutex&) (scoped_lock.hpp:36)
==21450== by 0x52E8B97: boost::asio::detail::epoll_reactor::descriptor_state::perform_io(unsigned int) (epoll_reactor.ipp:611)
==21450== by 0x52E8CFA: boost::asio::detail::epoll_reactor::descriptor_state::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code const&, unsigned long) (epoll_reactor.ipp:648)
==21450== by 0x52E6E6B: boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) (task_io_service_operation.hpp:37)
==21450== by 0x52E992C: boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const&) (task_io_service.ipp:412)
==21450== by 0x52E9383: boost::asio::detail::task_io_service::run(boost::system::error_code&) (task_io_service.ipp:153)
==21450== by 0x52E9C8E: boost::asio::io_service::run() (io_service.ipp:59)
==21450== by 0x52E5DDD: mir::AsioMainLoop::run() (asio_main_loop.cpp:121)
==21450== by 0x52889DC: mir::DisplayServer::run() (display_server.cpp:210)
==21450== by 0x527EFF5: mir::run_mir(mir::ServerConfiguration&, std::function<void (mir::DisplayServer&)>) (run_mir.cpp:80)
==21450==
==21450== followed by a later acquisition of lock at 0x5735520
==21450== at 0x4C2FC35: pthread_mutex_lock (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==21450== by 0x52EA51D: boost::asio::detail::posix_static_mutex::lock() (posix_static_mutex.hpp:44)
==21450== by 0x52ED2FF: boost::asio::detail::scoped_lock<boost::asio::detail::posix_static_mutex>::scoped_lock(boost::asio::detail::posix_static_mutex&) (scoped_lock.hpp:36)
==21450== by 0x52EB219: boost::asio::detail::signal_set_service::deliver_signal(int) (signal_set_service.ipp:431)
==21450== by 0x52EA5FB: boost::asio::detail::signal_set_service::pipe_read_op::do_perform(boost::asio::detail::reactor_op*) (signal_set_service.ipp:95)
==21450== by 0x52E6FD4: boost::asio::detail::reactor_op::perform() (reactor_op.hpp:40)
==21450== by 0x52E8BF3: boost::asio::detail::epoll_reactor::descriptor_state::perform_io(unsigned int) (epoll_reactor.ipp:622)
==21450== by 0x52E8CFA: boost::asio::detail::epoll_reactor::descriptor_state::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code const&, unsigned long) (epoll_reactor.ipp:648)
==21450== by 0x52E6E6B: boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) (task_io_service_operation.hpp:37)
==21450== by 0x52E992C: boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const&) (task_io_service.ipp:412)
==21450== by 0x52E9383: boost::asio::detail::task_io_service::run(boost::system::error_code&) (task_io_service.ipp:153)
==21450== by 0x52E9C8E: boost::asio::io_service::run() (io_service.ipp:59)
==21450==
==21450== Required order was established by acquisition of lock at 0x5735520
==21450== at 0x4C2FC35: pthread_mutex_lock (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==21450== by 0x52EA51D: boost::asio::detail::posix_static_mutex::lock() (posix_static_mutex.hpp:44)
==21450== by 0x52ED2FF: boost::asio::detail::scoped_lock<boost::asio::detail::posix_static_mutex>::scoped_lock(boost::asio::detail::posix_static_mutex&) (scoped_lock.hpp:36)
==21450== by 0x52EB38A: boost::asio::detail::signal_set_service::add_service(boost::asio::detail::signal_set_service*) (signal_set_service.ipp:467)
==21450== by 0x52EA731: boost::asio::detail::signal_set_service::signal_set_service(boost::asio::io_service&) (signal_set_service.ipp:128)
==21450== by 0x52EB8C4: boost::asio::signal_set_service::signal_set_service(boost::asio::io_service&) (signal_set_service.hpp:53)
==21450== by 0x52F1C5E: boost::asio::io_service::service* boost::asio::detail::service_registry::create<boost::asio::signal_set_service>(boost::asio::io_service&) (service_registry.hpp:81)
==21450== by 0x52E6D07: boost::asio::detail::service_registry::do_use_service(boost::asio::io_service::service::key const&, boost::asio::io_service::service* (*)(boost::asio::io_service&)) (service_registry.ipp:123)
==21450== by 0x52F130B: boost::asio::signal_set_service& boost::asio::detail::service_registry::use_service<boost::asio::signal_set_service>() (service_registry.hpp:48)
==21450== by 0x52F06E6: boost::asio::signal_set_service& boost::asio::use_service<boost::asio::signal_set_service>(boost::asio::io_service&) (io_service.hpp:33)
==21450== by 0x52EEBB5: boost::asio::basic_io_object<boost::asio::signal_set_service, false>::basic_io_object(boost::asio::io_service&) (basic_io_object.hpp:90)
==21450== by 0x52ED4DA: boost::asio::basic_signal_set<boost::asio::signal_set_service>::basic_signal_set(boost::asio::io_service&) (basic_signal_set.hpp:106)
==21450==
==21450== followed by a later acquisition of lock at 0xA87DD98
==21450== at 0x4C2FC35: pthread_mutex_lock (in /usr/lib/valgrind/vgpreload_helgrind-amd64-linux.so)
==21450== by 0x52E6A6F: boost::asio::detail::posix_mutex::lock() (posix_mutex.hpp:52)
==21450== by 0x52EC53F: boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>::scoped_lock(boost::asio::detail::posix_mutex&) (scoped_lock.hpp:36)
==21450== by 0x52E7C69: boost::asio::detail::epoll_reactor::register_internal_descriptor(int, int, boost::asio::detail::epoll_reactor::descriptor_state*&, boost::asio::detail::reactor_op*) (epoll_reactor.ipp:179)
==21450== by 0x52EB426: boost::asio::detail::signal_set_service::add_service(boost::asio::detail::signal_set_service*) (signal_set_service.ipp:485)
==21450== by 0x52EA731: boost::asio::detail::signal_set_service::signal_set_service(boost::asio::io_service&) (signal_set_service.ipp:128)
==21450== by 0x52EB8C4: boost::asio::signal_set_service::signal_set_service(boost::asio::io_service&) (signal_set_service.hpp:53)
==21450== by 0x52F1C5E: boost::asio::io_service::service* boost::asio::detail::service_registry::create<boost::asio::signal_set_service>(boost::asio::io_service&) (service_registry.hpp:81)
==21450== by 0x52E6D07: boost::asio::detail::service_registry::do_use_service(boost::asio::io_service::service::key const&, boost::asio::io_service::service* (*)(boost::asio::io_service&)) (service_registry.ipp:123)
==21450== by 0x52F130B: boost::asio::signal_set_service& boost::asio::detail::service_registry::use_service<boost::asio::signal_set_service>() (service_registry.hpp:48)
==21450== by 0x52F06E6: boost::asio::signal_set_service& boost::asio::use_service<boost::asio::signal_set_service>(boost::asio::io_service&) (io_service.hpp:33)
==21450== by 0x52EEBB5: boost::asio::basic_io_object<boost::asio::signal_set_service, false>::basic_io_object(boost::asio::io_service&) (basic_io_object.hpp:90)
==21450==
==21450== ----------------------------------------------------------------

Tags: helgrind
Changed in mir:
importance: Undecided → High
tags: added: helgrind
Revision history for this message
kevin gunn (kgunn72) wrote :

so is this really a bug on mir or aiso ?

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Whichever module is creating the threads is likely to blame. Because that's the module which should be managing locking.

Changed in mir:
importance: High → Critical
Changed in boost1.53 (Ubuntu):
importance: High → Critical
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

How do I reproduce this report?

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Just run Mir under helgrind:
    valgrind --tool=helgrind ...

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Drop severity. Doesn't qualify for Critical if no one is knowingly affected yet.

Changed in mir:
importance: Critical → High
Changed in boost1.53 (Ubuntu):
importance: Critical → High
Revision history for this message
Cemil Azizoglu (cemil-azizoglu) wrote :

Cannot be reproduced any more.

Changed in mir:
status: New → Incomplete
Revision history for this message
Chris Halse Rogers (raof) wrote :

Thank god, we no longer use AsioMainLoop

Changed in mir:
status: Incomplete → Invalid
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.