[Boost-bugs] [Boost C++ Libraries] #11275: Deadlock when destroying continuation future

Subject: [Boost-bugs] [Boost C++ Libraries] #11275: Deadlock when destroying continuation future
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2015-05-07 13:00:25


#11275: Deadlock when destroying continuation future
----------------------------------------------+----------------------
 Reporter: Konrad Zemek <konrad.zemek@…> | Owner: anthonyw
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: thread
  Version: Boost 1.58.0 | Severity: Problem
 Keywords: continuation deadlock destructor |
----------------------------------------------+----------------------
 I've stumbled upon a deadlock somewhere in continuation logic. I think the
 trace below will show it clearly. Basically, the future's destructor waits
 on lock that was already locked earlier in the callstack:

 In the continuation sequence:
 {{{
 #22 0x0000000000505283 in
 boost::detail::shared_state_base::do_continuation (this=0x18979d0,
 lock=...)
     at /usr/include/boost/thread/future.hpp:239
 239 }
 (gdb) print lock
 $2 = (boost::unique_lock<boost::mutex> &) @0x7f6e62783520: {m = 0x1897a10,
 is_locked = true}
 }}}

 Later during destruction:
 {{{
 #7 0x0000000000505083 in boost::detail::shared_state_base::dec
 (this=0x18979d0) at /usr/include/boost/thread/future.hpp:197
 197 void dec() { boost::unique_lock<boost::mutex>
 lk(this->mutex); dec(lk); }
 (gdb) print lk
 $4 = {m = 0x1897a10, is_locked = false}
 }}}

 Following is the trace from GDB. I attach my version of future.hpp for
 line number reference. It's the version from 71d9a0a merged with
 boost-1.58 tag.

 {{{
 Thread 2 (Thread 0x7f6e62786700 (LWP 12760)):
 #0 __lll_lock_wait () at
 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
 #1 0x00007f6e64b8156a in _L_lock_913 () from /lib/x86_64-linux-
 gnu/libpthread.so.0
 #2 0x00007f6e64b81390 in __GI___pthread_mutex_lock (mutex=0x1897a10) at
 ../nptl/pthread_mutex_lock.c:79
 #3 0x000000000050236a in pthread_mutex_lock (m=0x1897a10) at
 /usr/include/boost/thread/pthread/mutex.hpp:62
 #4 boost::mutex::lock (this=0x1897a10) at
 /usr/include/boost/thread/pthread/mutex.hpp:116
 #5 0x000000000050f881 in boost::unique_lock<boost::mutex>::lock
 (this=0x7f6e627831f0)
     at /usr/include/boost/thread/lock_types.hpp:346
 #6 0x000000000050f9e9 in boost::unique_lock<boost::mutex>::unique_lock
 (this=0x7f6e627831f0, m_=...)
     at /usr/include/boost/thread/lock_types.hpp:124
 #7 0x0000000000505083 in boost::detail::shared_state_base::dec
 (this=0x18979d0) at /usr/include/boost/thread/future.hpp:197
 #8 0x000000000052850e in
 boost::detail::basic_future<boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > > >::~basic_future
 (this=0x1897c58, __in_chrg=<optimized out>)
     at /usr/include/boost/thread/future.hpp:1212
 #9 0x000000000051f46e in
 boost::future<boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > > >::~future
 (this=0x1897c58, __in_chrg=<optimized out>) at
 /usr/include/boost/thread/future.hpp:1822
 #10 0x0000000000534fbc in
 boost::detail::future_unwrap_shared_state<boost::future<boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > > >,
 std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> >
>::~future_unwrap_shared_state (this=0x1897b40, __in_chrg=<optimized out>)
     at /usr/include/boost/thread/future.hpp:5043
 #11 0x0000000000534ff8 in
 boost::detail::future_unwrap_shared_state<boost::future<boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > > >,
 std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> >
>::~future_unwrap_shared_state (this=0x1897b40, __in_chrg=<optimized out>)
     at /usr/include/boost/thread/future.hpp:5043
 #12 0x0000000000535030 in
 boost::checked_delete<boost::detail::future_unwrap_shared_state<boost::future<boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > > >,
 std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > > > (x=0x1897b40)
     at /usr/include/boost/core/checked_delete.hpp:34
 #13 0x00000000005382ee in
 boost::detail::sp_counted_impl_p<boost::detail::future_unwrap_shared_state<boost::future<boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > > >,
 std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > > >::dispose
 (this=0x1897880)
     at /usr/include/boost/smart_ptr/detail/sp_counted_impl.hpp:78
 #14 0x00000000005017e2 in boost::detail::sp_counted_base::release
 (this=0x1897880)
     at /usr/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:146
 #15 0x00000000005018a5 in boost::detail::shared_count::~shared_count
 (this=0x7f6e5c0008c8, __in_chrg=<optimized out>)
     at /usr/include/boost/smart_ptr/detail/shared_count.hpp:443
 #16 0x0000000000505114 in
 boost::shared_ptr<boost::detail::shared_state_base>::~shared_ptr
 (this=0x7f6e5c0008c0,
     __in_chrg=<optimized out>) at
 /usr/include/boost/smart_ptr/shared_ptr.hpp:323
 #17 0x000000000052f13e in
 std::_Destroy<boost::shared_ptr<boost::detail::shared_state_base> >
 (__pointer=0x7f6e5c0008c0)
     at /usr/include/c++/4.9/bits/stl_construct.h:93
 #18 0x0000000000529d5d in
 std::_Destroy_aux<false>::__destroy<boost::shared_ptr<boost::detail::shared_state_base>*>
 (
     __first=0x7f6e5c0008c0, __last=0x7f6e5c0008d0) at
 /usr/include/c++/4.9/bits/stl_construct.h:103
 #19 0x00000000005228f3 in
 std::_Destroy<boost::shared_ptr<boost::detail::shared_state_base>*>
 (__first=0x7f6e5c0008c0,
     __last=0x7f6e5c0008d0) at
 /usr/include/c++/4.9/bits/stl_construct.h:126
 #20 0x0000000000516107 in
 std::_Destroy<boost::shared_ptr<boost::detail::shared_state_base>*,
 boost::shared_ptr<boost::detail::shared_state_base> >
 (__first=0x7f6e5c0008c0, __last=0x7f6e5c0008d0) at
 /usr/include/c++/4.9/bits/stl_construct.h:151
 #21 0x000000000050d24f in
 std::vector<boost::shared_ptr<boost::detail::shared_state_base>,
 std::allocator<boost::shared_ptr<boost::detail::shared_state_base> >
>::~vector (this=0x7f6e62783450, __in_chrg=<optimized out>)
     at /usr/include/c++/4.9/bits/stl_vector.h:424
 #22 0x0000000000505283 in
 boost::detail::shared_state_base::do_continuation (this=0x18979d0,
 lock=...)
     at /usr/include/boost/thread/future.hpp:239
 #23 0x0000000000505412 in
 boost::detail::shared_state_base::mark_finished_internal (this=0x18979d0,
 lock=...)
     at /usr/include/boost/thread/future.hpp:265
 #24 0x0000000000544a2d in
 boost::detail::shared_state<boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > >
>::mark_finished_with_result_internal(boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > >&&,
 boost::unique_lock<boost::mutex>&) (this=0x18979d0,
     result_=<unknown type in
 /home/kzemek/plgrid/helpers/debug/test/unit/inbox_test, CU 0xa555, DIE
 0x4091f>, lock=...)
     at /usr/include/boost/thread/future.hpp:526
 #25 0x000000000054499f in
 boost::detail::shared_state<boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > >
>::mark_finished_with_result(boost::future<std::unique_ptr<one::clproto::ServerMessage,
 std::default_delete<one::clproto::ServerMessage> > >&&) (this=0x18979d0,
 ---Type <return> to continue, or q <return> to quit---
     result_=<unknown type in
 /home/kzemek/plgrid/helpers/debug/test/unit/inbox_test, CU 0xa555, DIE
 0x4091f>)
     at /usr/include/boost/thread/future.hpp:554
 #26 0x00000000005448be in
 _ZN5boost6detail41future_executor_continuation_shared_stateINS_9executors17basic_thread_poolENS_6futureIvEENS4_ISt10unique_ptrIN3one7clproto13ServerMessageESt14default_deleteIS9_EEEEZNS7_13communication6layers5InboxI10LowerLayerE11communicateES6_INS8_13ClientMessageESA_ISJ_EEiEUlT_E_E3runENS_10shared_ptrINS0_17shared_state_baseEEE
 (that_=...)
     at /usr/include/boost/thread/future.hpp:4303
 #27 0x0000000000544738 in
 _ZN5boost6detail6run_itINS0_41future_executor_continuation_shared_stateINS_9executors17basic_thread_poolENS_6futureIvEENS5_ISt10unique_ptrIN3one7clproto13ServerMessageESt14default_deleteISA_EEEEZNS8_13communication6layers5InboxI10LowerLayerE11communicateES7_INS9_13ClientMessageESB_ISK_EEiEUlT_E_EEEclEv
 (this=0x18978a8)
     at /usr/include/boost/thread/future.hpp:4274
 #28 0x00000000005445ba in
 _ZN5boost6detail16nullary_functionIFvvEE9impl_typeINS0_6run_itINS0_41future_executor_continuation_shared_stateINS_9executors17basic_thread_poolENS_6futureIvEENS9_ISt10unique_ptrIN3one7clproto13ServerMessageESt14default_deleteISE_EEEEZNSC_13communication6layers5InboxI10LowerLayerE11communicateESB_INSD_13ClientMessageESF_ISO_EEiEUlT_E_EEEEE4callEv
 (
     this=0x18978a0) at
 /usr/include/boost/thread/detail/nullary_function.hpp:52
 #29 0x0000000000507245 in boost::detail::nullary_function<void
 ()>::operator()() (this=0x7f6e62783690)
     at /usr/include/boost/thread/detail/nullary_function.hpp:125
 #30 0x00000000005072a3 in
 boost::executors::basic_thread_pool::worker_thread (this=0x1894ba0)
     at /usr/include/boost/thread/executors/basic_thread_pool.hpp:91
 #31 0x000000000053f129 in boost::detail::invoke<void
 (boost::executors::basic_thread_pool::*)(),
 boost::executors::basic_thread_pool<>*>(void
 (boost::executors::basic_thread_pool::*&&)(),
 boost::executors::basic_thread_pool<>*&&,
 (boost::executors::basic_thread_pool<>*&&)...) (
     f=<unknown type in
 /home/kzemek/plgrid/helpers/debug/test/unit/inbox_test, CU 0xa555, DIE
 0xa1b40>,
     a0=<unknown type in
 /home/kzemek/plgrid/helpers/debug/test/unit/inbox_test, CU 0xa555, DIE
 0xa1b45>)
     at /usr/include/boost/thread/detail/invoke.hpp:77
 #32 0x000000000053c705 in boost::detail::thread_data<void
 (boost::executors::basic_thread_pool::*)(),
 boost::executors::basic_thread_pool*>::run2<1ul> (this=0x1894f20) at
 /usr/include/boost/thread/detail/thread.hpp:75
 #33 0x0000000000538e5a in boost::detail::thread_data<void
 (boost::executors::basic_thread_pool::*)(),
 boost::executors::basic_thread_pool*>::run (this=0x1894f20) at
 /usr/include/boost/thread/detail/thread.hpp:81
 #34 0x00007f6e64da5d8a in ?? () from /usr/lib/x86_64-linux-
 gnu/libboost_thread.so.1.58.0
 #35 0x00007f6e64b7f0a5 in start_thread (arg=0x7f6e62786700) at
 pthread_create.c:309
 #36 0x00007f6e63e1ecfd in clone () at
 ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
 }}}

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/11275>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:18 UTC