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)
Can't reproduce this race with latest Mir.