Deadlock in JamiAccount during daemon shutdown
In the first backtrace below (thread 1), JamiAccount::doUnregister
acquired configurationMutex_
and JamiAccount::shutdownConnections
is waiting for connManagerMtx_
to be available.
In the second backtrace (thread 138), the lambda function called in frame 12 acquired connManagerMtx_
and JamiAccount::convModule
is waiting for configurationMutex_
to be available.
(gdb) bt
#0 futex_wait (private=0, expected=2, futex_word=0x74f914001ef0) at ../sysdeps/nptl/futex-internal.h:146
#1 __GI___lll_lock_wait (futex=futex@entry=0x74f914001ef0, private=0) at ./nptl/lowlevellock.c:49
#2 0x000074f9b0498002 in lll_mutex_lock_optimized (mutex=0x74f914001ef0) at ./nptl/pthread_mutex_lock.c:48
#3 ___pthread_mutex_lock (mutex=0x74f914001ef0) at ./nptl/pthread_mutex_lock.c:93
#4 0x000074f9b114c2e9 in __gthread_mutex_lock(__gthread_mutex_t*) (__mutex=0x74f914001ef0) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749
#5 0x000074f9b1165c6c in std::mutex::lock() (this=0x74f914001ef0) at /usr/include/c++/11/bits/std_mutex.h:100
#6 0x000074f9b116ae66 in std::lock_guard<std::mutex>::lock_guard(std::mutex&) (this=0x7ffd6d0e2258, __m=...) at /usr/include/c++/11/bits/std_mutex.h:229
#7 0x000074f9b12f77ae in jami::JamiAccount::shutdownConnections() (this=0x74f914000db0) at jamidht/jamiaccount.cpp:292
#8 0x000074f9b13098f5 in jami::JamiAccount::doUnregister(bool) (this=0x74f914000db0, forceShutdownConnections=true) at jamidht/jamiaccount.cpp:2384
#9 0x000074f9b11b5bd5 in jami::Manager::unregisterAccounts() (this=0x74f9b2e08460 <jami::Manager::instance()::instance>) at manager.cpp:1073
#10 0x000074f9b11b48eb in jami::Manager::finish() (this=0x74f9b2e08460 <jami::Manager::instance()::instance>) at manager.cpp:904
#11 0x000074f9b12433fb in libjami::fini() () at ring_api.cpp:101
#12 0x0000613b8e799399 in InstanceManagerInterface::Unregister(int) (pid=<optimized out>, this=<optimized out>) at /home/fsimon/jami-client-qt/src/libclient/dbus/../qtwrapper/instancemanager_wrap.h:54
#13 lrc::api::Lrc::~Lrc() (this=0x613b9ee21710, __in_chrg=<optimized out>) at /home/fsimon/jami-client-qt/src/libclient/lrc.cpp:82
#14 0x0000613b8e53f5e6 in std::default_delete<lrc::api::Lrc>::operator()(lrc::api::Lrc*) const (__ptr=0x613b9ee21710, this=<optimized out>) at /usr/include/c++/11/bits/unique_ptr.h:79
#15 std::unique_ptr<lrc::api::Lrc, std::default_delete<lrc::api::Lrc> >::~unique_ptr() (this=0x613b9e8a2220, __in_chrg=<optimized out>) at /usr/include/c++/11/bits/unique_ptr.h:361
#16 LRCInstance::~LRCInstance() (this=0x613b9e8a21f0, __in_chrg=<optimized out>) at /home/fsimon/jami-client-qt/build/jami_autogen/ISMKEKEPX5/../../../src/app/lrcinstance.h:63
#17 LRCInstance::~LRCInstance() (this=0x613b9e8a21f0, __in_chrg=<optimized out>) at /home/fsimon/jami-client-qt/build/jami_autogen/ISMKEKEPX5/../../../src/app/lrcinstance.h:63
#18 0x0000613b8e568a16 in QScopedPointerDeleter<LRCInstance>::cleanup(LRCInstance*) (pointer=<optimized out>) at /usr/lib/libqt-jami/include/QtCore/qscopedpointer.h:16
#19 QScopedPointer<LRCInstance, QScopedPointerDeleter<LRCInstance> >::reset(LRCInstance*) (other=0x0, this=0x7ffd6d0e2640) at /usr/lib/libqt-jami/include/QtCore/qscopedpointer.h:125
#20 MainApplication::~MainApplication() (this=this@entry=0x7ffd6d0e25f0, __in_chrg=<optimized out>) at /home/fsimon/jami-client-qt/src/app/mainapplication.cpp:180
#21 0x0000613b8e54144a in main(int, char**) (argc=<optimized out>, argv=0x7ffd6d0e27f8) at /home/fsimon/jami-client-qt/src/app/main.cpp:143
(gdb) p *(pthread_mutex_t*)0x74f914001ef0
$1 = {__data = {__lock = 2, __count = 0, __owner = 1339652, __nusers = 1, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, __size = "\002\000\000\000\000\000\000\000\004q\024\000\001", '\000' <repeats 26 times>, __align = 2}
(gdb) thread find 1339652
Thread 138 has target id 'Thread 0x74f735600640 (LWP 1339652)'
(gdb) thread 138
[Switching to thread 138 (Thread 0x74f735600640 (LWP 1339652))]
#0 futex_wait (private=0, expected=2, futex_word=0x74f914001840) at ../sysdeps/nptl/futex-internal.h:146
146 in ../sysdeps/nptl/futex-internal.h
(gdb) bt
#0 futex_wait (private=0, expected=2, futex_word=0x74f914001840) at ../sysdeps/nptl/futex-internal.h:146
#1 __GI___lll_lock_wait (futex=futex@entry=0x74f914001840, private=0) at ./nptl/lowlevellock.c:49
#2 0x000074f9b049805d in lll_mutex_lock_optimized (mutex=0x74f914001840) at ./nptl/pthread_mutex_lock.c:48
#3 ___pthread_mutex_lock (mutex=0x74f914001840) at ./nptl/pthread_mutex_lock.c:128
#4 0x000074f9b114c2e9 in __gthread_mutex_lock(__gthread_mutex_t*) (__mutex=0x74f914001840) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749
#5 0x000074f9b1164f91 in __gthread_recursive_mutex_lock(__gthread_recursive_mutex_t*) (__mutex=0x74f914001840) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:811
#6 0x000074f9b1165cbe in std::recursive_mutex::lock() (this=0x74f914001840) at /usr/include/c++/11/mutex:108
#7 0x000074f9b1209503 in std::unique_lock<std::recursive_mutex>::lock() (this=0x74f7355fbc50) at /usr/include/c++/11/bits/unique_lock.h:139
#8 0x000074f9b1207a0b in std::unique_lock<std::recursive_mutex>::unique_lock(std::recursive_mutex&) (this=0x74f7355fbc50, __m=...) at /usr/include/c++/11/bits/unique_lock.h:69
#9 0x000074f9b130905d in jami::JamiAccount::convModule(bool) (this=0x74f914000db0, noCreation=false) at jamidht/jamiaccount.cpp:2172
#10 0x000074f9b131958a in jami::JamiAccount::dataTransfer(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (this=0x74f914000db0, id="1bd85df9e8e86556be69f6eff7530c723756c909") at jamidht/jamiaccount.cpp:4110
#11 0x000074f9b159d1b6 in jami::TransferChannelHandler::onReady(std::shared_ptr<dht::crypto::Certificate> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<dhtnet::ChannelSocket>)
(this=0x74f8d0000ee0, name="data-transfer://1bd85df9e8e86556be69f6eff7530c723756c909/0256f6eda39be034e13af4b13b635d8cb1547b7a020c30cf751771ab35ce4931/b75eb5e4d3b22fbb7b83910307f54e7ed85a446d_1514944887470878.png?start=119604&end"..., channel=warning: RTTI symbol not found for class 'std::_Sp_counted_ptr_inplace<dhtnet::ChannelSocket, std::allocator<dhtnet::ChannelSocket>, (__gnu_cxx::_Lock_policy)2>'
warning: RTTI symbol not found for class 'std::_Sp_counted_ptr_inplace<dhtnet::ChannelSocket, std::allocator<dhtnet::ChannelSocket>, (__gnu_cxx::_Lock_policy)2>'
std::shared_ptr<dhtnet::ChannelSocket> (use count 3, weak count 0) = {...}) at jamidht/transfer_channel_handler.cpp:177
#12 0x000074f9b13078c0 in operator()(jami::DeviceId const&, std::string const&, std::shared_ptr<dhtnet::ChannelSocket>) const
(__closure=0x74f8d001ee40, deviceId=..., name="data-transfer://1bd85df9e8e86556be69f6eff7530c723756c909/0256f6eda39be034e13af4b13b635d8cb1547b7a020c30cf751771ab35ce4931/b75eb5e4d3b22fbb7b83910307f54e7ed85a446d_1514944887470878.png?start=119604&end"..., channel=std::shared_ptr<dhtnet::ChannelSocket> (empty) = {...}) at jamidht/jamiaccount.cpp:2128
#13 0x000074f9b13459a7 in std::__invoke_impl<void, jami::JamiAccount::doRegister_()::<lambda(const DeviceId&, const string&, std::shared_ptr<dhtnet::ChannelSocket>)>&, const dht::Hash<32>&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::shared_ptr<dhtnet::ChannelSocket> >(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/11/bits/invoke.h:61
#14 0x000074f9b133c8c1 in std::__invoke_r<void, jami::JamiAccount::doRegister_()::<lambda(const DeviceId&, const string&, std::shared_ptr<dhtnet::ChannelSocket>)>&, const dht::Hash<32>&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::shared_ptr<dhtnet::ChannelSocket> >(struct {...} &) (__fn=...) at /usr/include/c++/11/bits/invoke.h:111
#15 0x000074f9b13333a2 in std::_Function_handler<void(const dht::Hash<32>&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::shared_ptr<dhtnet::ChannelSocket>), jami::JamiAccount::doRegister_()::<lambda(const DeviceId&, const string&, std::shared_ptr<dhtnet::ChannelSocket>)> >::_M_invoke(const std::_Any_data &, const dht::Hash<32> &, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &, std::shared_ptr<dhtnet::ChannelSocket> &&)
(__functor=..., __args#0=..., __args#1="data-transfer://1bd85df9e8e86556be69f6eff7530c723756c909/0256f6eda39be034e13af4b13b635d8cb1547b7a020c30cf751771ab35ce4931/b75eb5e4d3b22fbb7b83910307f54e7ed85a446d_1514944887470878.png?start=119604&end"..., __args#2=...)
at /usr/include/c++/11/bits/std_function.h:290
#16 0x000074f9b17dcb0b in std::_Function_handler<void (dht::Hash<32ul> const&, std::shared_ptr<dhtnet::ChannelSocket> const&), dhtnet::ConnectionManager::Impl::addNewMultiplexedSocket(std::weak_ptr<dhtnet::DeviceInfo> const&, dht::Hash<32ul> const&, unsigned long const&, std::shared_ptr<dhtnet::ConnectionInfo> const&)::{lambda(dht::Hash<32ul> const&, std::shared_ptr<dhtnet::ChannelSocket> const&)#1}>::_M_invoke(std::_Any_data const&, dht::Hash<32ul> const&, std::shared_ptr<dhtnet::ChannelSocket> const&) ()
at /home/fsimon/jami-client-qt/daemon/src/.libs/libjami.so.0
#17 0x000074f9b181c60b in dhtnet::MultiplexedSocket::Impl::onRequest(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned short) () at /home/fsimon/jami-client-qt/daemon/src/.libs/libjami.so.0
#18 0x000074f9b181cc88 in std::_Function_handler<void (), dhtnet::MultiplexedSocket::Impl::handleControlPacket(std::vector<unsigned char, std::allocator<unsigned char> >&&)::{lambda()#1}>::_M_invoke(std::_Any_data const&) ()
at /home/fsimon/jami-client-qt/daemon/src/.libs/libjami.so.0
#19 0x000074f9b195b0bc in std::thread::_State_impl<std::thread::_Invoker<std::tuple<dht::ThreadPool::run(std::function<void ()>&&)::{lambda()#1}> > >::_M_run() () at /home/fsimon/jami-client-qt/daemon/src/.libs/libjami.so.0
#20 0x000074f9b08dc253 in std::execute_native_thread_routine(void*) (__p=0x74f468013b00) at ../../../../../src/libstdc++-v3/src/c++11/thread.cc:82
#21 0x000074f9b0494ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#22 0x000074f9b0526850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
(gdb) p *(pthread_mutex_t*)0x74f914001840
$2 = {__data = {__lock = 2, __count = 1, __owner = 1339220, __nusers = 1, __kind = 1, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, __size = "\002\000\000\000\001\000\000\000To\024\000\001\000\000\000\001", '\000' <repeats 22 times>,
__align = 4294967298}
(gdb) thread find 1339220
Thread 1 has target id 'Thread 0x74f9abcdcf40 (LWP 1339220)'