Mir

Conflicting load (data race) in ClientBufferTracker

Bug #1388501 reported by Daniel van Vugt
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Mir
Expired
High
Unassigned

Bug Description

Conflicting load (data race) in ClientBufferTracker:

1. valgrind --tool=drd bin/mir_demo_server_shell
2. Start a client

==11594== Conflicting load by thread 3 at 0x12bb3c00 size 8
==11594== at 0x4FCDC87: mir::frontend::ClientBufferTracker::buffer_from(mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int> const&) const (client_buffer_tracker.cpp:68)
==11594== by 0x5002296: mir::frontend::SurfaceTracker::buffer_from(mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>) const (surface_tracker.cpp:79)
==11594== by 0x4FD0FBD: mir::frontend::SessionMediator::exchange_buffer(google::protobuf::RpcController*, mir::protobuf::BufferRequest const*, mir::protobuf::Buffer*, google::protobuf::Closure*) (session_mediator.cpp:286)
==11594== by 0x4FDCFC6: void mir::frontend::detail::invoke<mir::protobuf::BufferRequest>(mir::frontend::detail::ProtobufMessageProcessor*, mir::frontend::detail::DisplayServer*, void (mir::protobuf::DisplayServer::*)(google::protobuf::RpcController*, mir::protobuf::BufferRequest const*, mir::protobuf::Buffer*, google::protobuf::Closure*), unsigned int, mir::protobuf::BufferRequest*) (protobuf_message_processor.cpp:102)
==11594== by 0x4FDA007: mir::frontend::detail::ProtobufMessageProcessor::dispatch(mir::frontend::detail::Invocation const&, std::vector<mir::Fd, std::allocator<mir::Fd> > const&) (protobuf_message_processor.cpp:189)
==11594== by 0x4FF4F7B: mir::frontend::detail::SocketConnection::on_new_message(boost::system::error_code const&) (socket_connection.cpp:117)
==11594== by 0x4FF4BAF: mir::frontend::detail::SocketConnection::on_read_size(boost::system::error_code const&) (socket_connection.cpp:80)
==11594== by 0x4FF6B17: void std::_Mem_fn<void (mir::frontend::detail::SocketConnection::*)(boost::system::error_code const&)>::operator()<boost::system::error_code const&, void>(mir::frontend::detail::SocketConnection*, boost::system::error_code const&) const (in /home/dan/bzr/mir/slow/build/lib/libmirserver.so.27)
==11594== by 0x4FF677D: void std::_Bind<std::_Mem_fn<void (mir::frontend::detail::SocketConnection::*)(boost::system::error_code const&)> (mir::frontend::detail::SocketConnection*, std::_Placeholder<1>)>::__call<void, boost::system::error_code const&, unsigned long&&, 0ul, 1ul>(std::tuple<boost::system::error_code const&, unsigned long&&>&&, std::_Index_tuple<0ul, 1ul>) (functional:1264)
==11594== by 0x4FF6362: void std::_Bind<std::_Mem_fn<void (mir::frontend::detail::SocketConnection::*)(boost::system::error_code const&)> (mir::frontend::detail::SocketConnection*, std::_Placeholder<1>)>::operator()<boost::system::error_code const&, unsigned long, void>(boost::system::error_code const&, unsigned long&&) (functional:1323)
==11594== by 0x4FF5EB4: std::_Function_handler<void (boost::system::error_code const&, unsigned long), std::_Bind<std::_Mem_fn<void (mir::frontend::detail::SocketConnection::*)(boost::system::error_code const&)> (mir::frontend::detail::SocketConnection*, std::_Placeholder<1>)> >::_M_invoke(std::_Any_data const&, boost::system::error_code const&, unsigned long) (functional:2039)
==11594== by 0x4FFDC96: std::function<void (boost::system::error_code const&, unsigned long)>::operator()(boost::system::error_code const&, unsigned long) const (functional:2439)
==11594== Address 0x12bb3c00 is at offset 16 from 0x12bb3bf0. Allocation context:
==11594== at 0x4C2E530: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
==11594== by 0x4FCEBA9: __gnu_cxx::new_allocator<std::_List_node<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> > >::allocate(unsigned long, void const*) (new_allocator.h:104)
==11594== by 0x4FCEAA7: std::_List_base<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*>, std::allocator<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> > >::_M_get_node() (stl_list.h:343)
==11594== by 0x4FCE7D0: std::_List_node<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> >* std::list<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*>, std::allocator<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> > >::_M_create_node<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> const&>(std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> const&) (stl_list.h:511)
==11594== by 0x4FCE553: void std::list<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*>, std::allocator<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> > >::_M_insert<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> const&>(std::_List_iterator<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> >, std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> const&) (stl_list.h:1688)
==11594== by 0x4FCE1FB: std::list<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*>, std::allocator<std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> > >::push_front(std::tuple<mir::IntWrapper<mir::graphics::BufferIdTag, unsigned int>, mir::graphics::Buffer*> const&) (stl_list.h:988)
==11594== by 0x4FCDB36: mir::frontend::ClientBufferTracker::add(mir::graphics::Buffer*) (client_buffer_tracker.cpp:44)
==11594== by 0x5002018: mir::frontend::SurfaceTracker::track_buffer(mir::IntWrapper<mir::frontend::detail::SessionsSurfaceIdTag, int>, mir::graphics::Buffer*) (surface_tracker.cpp:47)
==11594== by 0x4FD0BC9: mir::frontend::SessionMediator::exchange_buffer(google::protobuf::RpcController*, mir::protobuf::BufferRequest const*, mir::protobuf::Buffer*, google::protobuf::Closure*)::{lambda(mir::graphics::Buffer*)#1}::operator()(mir::graphics::Buffer*) const (session_mediator.cpp:280)
==11594== by 0x4FD41CD: std::_Function_handler<void (mir::graphics::Buffer*), mir::frontend::SessionMediator::exchange_buffer(google::protobuf::RpcController*, mir::protobuf::BufferRequest const*, mir::protobuf::Buffer*, google::protobuf::Closure*)::{lambda(mir::graphics::Buffer*)#1}>::_M_invoke(std::_Any_data const&, mir::graphics::Buffer*) (functional:2039)
==11594== by 0x4FB441A: std::function<void (mir::graphics::Buffer*)>::operator()(mir::graphics::Buffer*) const (functional:2439)
==11594== by 0x4FB2C7C: mir::compositor::BufferQueue::give_buffer_to_client(mir::graphics::Buffer*, std::unique_lock<std::mutex>) (buffer_queue.cpp:446)
==11594== Other segment start (thread 5)
==11594== at 0x4C34FD1: pthread_mutex_unlock (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
==11594== by 0x4E93253: __gthread_mutex_unlock(pthread_mutex_t*) (gthr-default.h:778)
==11594== by 0x4E94041: std::mutex::unlock() (mutex:153)
==11594== by 0x4E94308: std::lock_guard<std::mutex>::~lock_guard() (mutex:383)
==11594== by 0x4EB333D: (anonymous namespace)::AlarmImpl::cancel() (asio_main_loop.cpp:443)
==11594== by 0x4FB0492: (anonymous namespace)::TimeoutFrameDroppingPolicy::swap_unblocked() (timeout_frame_dropping_policy_factory.cpp:74)
==11594== by 0x4FB2DC9: mir::compositor::BufferQueue::release(mir::graphics::Buffer*, std::unique_lock<std::mutex>) (buffer_queue.cpp:468)
==11594== by 0x4FB30BD: mir::compositor::BufferQueue::drop_old_buffers() (buffer_queue.cpp:506)
==11594== by 0x4F95156: mir::compositor::BufferStreamSurfaces::drop_old_buffers() (buffer_stream_surfaces.cpp:95)
==11594== by 0x4F3D5AC: mir::scene::BasicSurface::set_visibility(MirSurfaceVisibility) (basic_surface.cpp:590)
==11594== by 0x4F3CF9A: mir::scene::BasicSurface::configure(MirSurfaceAttrib, int) (basic_surface.cpp:501)
==11594== by 0x4F8E386: mir::scene::RenderingTracker::configure_visibility(MirSurfaceVisibility) (rendering_tracker.cpp:79)
==11594== Other segment end (thread 5)
==11594== at 0x4C34310: pthread_mutex_lock (in /usr/lib/valgrind/vgpreload_drd-amd64-linux.so)
==11594== by 0x4E93224: __gthread_mutex_lock(pthread_mutex_t*) (gthr-default.h:748)
==11594== by 0x4E94013: std::mutex::lock() (mutex:135)
==11594== by 0x4E942EB: std::lock_guard<std::mutex>::lock_guard(std::mutex&) (mutex:377)
==11594== by 0x4FF7276: mir::frontend::ResourceCache::free_resource(google::protobuf::Message*) (resource_cache.cpp:41)
==11594== by 0x4FE1ACA: mir::frontend::detail::ProtobufResponder::send_response(unsigned int, google::protobuf::Message*, std::initializer_list<std::vector<mir::Fd, std::allocator<mir::Fd> > > const&) (protobuf_responder.cpp:53)
==11594== by 0x4FDAB6D: mir::frontend::detail::ProtobufMessageProcessor::send_response(unsigned int, mir::protobuf::Buffer*) (protobuf_message_processor.cpp:282)
==11594== by 0x4FDAC10: mir::frontend::detail::ProtobufMessageProcessor::send_response(unsigned int, std::shared_ptr<mir::protobuf::Buffer>) (protobuf_message_processor.cpp:287)
==11594== by 0x4FE13B0: google::protobuf::internal::MethodClosure2<mir::frontend::detail::ProtobufMessageProcessor, unsigned int, std::shared_ptr<mir::protobuf::Buffer> >::Run() (common.h:987)
==11594== by 0x4FD0C2E: mir::frontend::SessionMediator::exchange_buffer(google::protobuf::RpcController*, mir::protobuf::BufferRequest const*, mir::protobuf::Buffer*, google::protobuf::Closure*)::{lambda(mir::graphics::Buffer*)#1}::operator()(mir::graphics::Buffer*) const (session_mediator.cpp:285)
==11594== by 0x4FD41CD: std::_Function_handler<void (mir::graphics::Buffer*), mir::frontend::SessionMediator::exchange_buffer(google::protobuf::RpcController*, mir::protobuf::BufferRequest const*, mir::protobuf::Buffer*, google::protobuf::Closure*)::{lambda(mir::graphics::Buffer*)#1}>::_M_invoke(std::_Any_data const&, mir::graphics::Buffer*) (functional:2039)
==11594== by 0x4FB441A: std::function<void (mir::graphics::Buffer*)>::operator()(mir::graphics::Buffer*) const (functional:2439)

Changed in mir:
milestone: 0.9.0 → 0.10.0
Changed in mir:
milestone: 0.10.0 → none
Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

Can't reproduce this race with latest Mir.

Changed in mir:
status: New → Incomplete
Revision history for this message
Launchpad Janitor (janitor) wrote :

[Expired for Mir because there has been no activity for 60 days.]

Changed in mir:
status: Incomplete → Expired
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.