Deadlock when starting Jami
Reading symbols from jami-client-qt/build/jami...
Starting program: /home/fsimon/jami-client-qt/build/jami
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
client [1720816766602][INF][7fffe25a3f40]: file:///home/fsimon/jami-client-qt/src/app/mainapplication.cpp:179 Using Qt runtime version: 6.6.1
client [1720816766611][INF][7fffe25a3f40]: file:///home/fsimon/jami-client-qt/src/app/systemtray.cpp:110 "notify server name: gnome-shell, vendor: GNOME, version: 42.9, spec: 1.2"
client [1720816766654][INF][7fffe25a3f40]: file:///home/fsimon/jami-client-qt/src/app/appsettingsmanager.cpp:106 "Using locale: en_CA"
16:39:26.794 os_core_unix.c !pjlib 2.13.1 for POSIX initialized
[AVHWDeviceContext @ 0x7fff74025800] Cannot load libcuda.so.1
[AVHWDeviceContext @ 0x7fff74025800] Could not dynamically load CUDA
[AVHWDeviceContext @ 0x7fff740253c0] Cannot load libcuda.so.1
[AVHWDeviceContext @ 0x7fff740253c0] Could not dynamically load CUDA
[AVHWDeviceContext @ 0x7fff740253c0] Cannot load libcuda.so.1
[AVHWDeviceContext @ 0x7fff740253c0] Could not dynamically load CUDA
[hevc_vaapi @ 0x7fff74026700] Driver does not support some wanted packed headers (wanted 0xd, found 0x1).
Daemon is running
^C
Thread 1 "jami" received signal SIGINT, Interrupt.
futex_wait (private=0, expected=2, futex_word=0x7fff60001840) at ../sysdeps/nptl/futex-internal.h:146
146 ../sysdeps/nptl/futex-internal.h: No such file or directory.
(gdb) bt
#0 futex_wait (private=0, expected=2, futex_word=0x7fff60001840) at ../sysdeps/nptl/futex-internal.h:146
#1 __GI___lll_lock_wait (futex=futex@entry=0x7fff60001840, private=0) at ./nptl/lowlevellock.c:49
#2 0x00007fffe6c9805d in lll_mutex_lock_optimized (mutex=0x7fff60001840) at ./nptl/pthread_mutex_lock.c:48
#3 ___pthread_mutex_lock (mutex=0x7fff60001840) at ./nptl/pthread_mutex_lock.c:128
#4 0x00007fffe7937849 in __gthread_mutex_lock(__gthread_mutex_t*) (__mutex=0x7fff60001840) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749
#5 0x00007fffe7950387 in __gthread_recursive_mutex_lock(__gthread_recursive_mutex_t*) (__mutex=0x7fff60001840) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:811
#6 0x00007fffe79510f6 in std::recursive_mutex::lock() (this=0x7fff60001840) at /usr/include/c++/11/mutex:108
#7 0x00007fffe79576f6 in std::lock_guard<std::recursive_mutex>::lock_guard(std::recursive_mutex&) (this=0x7fffffffcd80, __m=...) at /usr/include/c++/11/bits/std_mutex.h:229
#8 0x00007fffe79bed2e in jami::Account::getAccountDetails[abi:cxx11]() const (this=0x7fff60000db0) at /home/fsimon/jami-client-qt/daemon/src/account.h:141
#9 0x00007fffe79ab67d in jami::Manager::getAccountDetails(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const (this=0x7fffe95821e0 <jami::Manager::instance()::instance>, accountID="f55a309b1db83073")
at manager.cpp:2728
#10 0x00007fffe7a87b68 in libjami::getAccountDetails(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (accountId="f55a309b1db83073") at client/configurationmanager.cpp:86
#11 0x00005555558c73ef in ConfigurationManagerInterface::getAccountDetails(QString const&) (this=<optimized out>, accountId=...) at /home/fsimon/jami-client-qt/src/libclient/dbus/../qtwrapper/configurationmanager_wrap.h:482
#12 lrc::AccountModelPimpl::updateAccountDetails(lrc::api::account::Info&) (this=<optimized out>, accountInfo=...) at /home/fsimon/jami-client-qt/src/libclient/accountmodel.cpp:480
#13 0x00005555558c8508 in lrc::AccountModelPimpl::addToAccounts(QString const&) (this=0x7fff6400d1c0, accountId=...) at /home/fsimon/jami-client-qt/src/libclient/accountmodel.cpp:748
#14 0x00005555558c8c6f in lrc::AccountModelPimpl::AccountModelPimpl(lrc::api::AccountModel&, lrc::api::Lrc&, lrc::CallbacksHandler const&, lrc::api::BehaviorController const&)
(this=0x7fff6400d1c0, linked=<optimized out>, lrc=<optimized out>, callbacksHandler=..., behaviorController=<optimized out>) at /home/fsimon/jami-client-qt/src/libclient/accountmodel.cpp:381
#15 0x00005555558c932a in std::make_unique<lrc::AccountModelPimpl, lrc::api::AccountModel&, lrc::api::Lrc&, lrc::CallbacksHandler const&, lrc::api::BehaviorController const&>(lrc::api::AccountModel&, lrc::api::Lrc&, lrc::CallbacksHandler const&, lrc::api::BehaviorController const&) () at /usr/include/c++/11/bits/unique_ptr.h:961
#16 lrc::api::AccountModel::AccountModel(lrc::api::Lrc&, lrc::CallbacksHandler const&, lrc::api::BehaviorController const&) (this=this@entry=0x55555750c110, lrc=..., callbacksHandler=..., behaviorController=...)
at /home/fsimon/jami-client-qt/src/libclient/accountmodel.cpp:197
#17 0x00005555558ba99c in std::make_unique<lrc::api::AccountModel, lrc::api::Lrc&, lrc::CallbacksHandler&, lrc::api::BehaviorController&>(lrc::api::Lrc&, lrc::CallbacksHandler&, lrc::api::BehaviorController&) () at /usr/include/c++/11/bits/unique_ptr.h:961
#18 lrc::LrcPimpl::LrcPimpl(lrc::api::Lrc&) (this=0x555557511c40, linked=...) at /home/fsimon/jami-client-qt/src/libclient/lrc.cpp:248
#19 0x00005555558baaab in std::make_unique<lrc::LrcPimpl, lrc::api::Lrc&>(lrc::api::Lrc&) () at /usr/include/c++/11/bits/unique_ptr.h:961
#20 lrc::api::Lrc::Lrc(bool) (this=0x555557276470, muteDaemon=<optimized out>) at /home/fsimon/jami-client-qt/src/libclient/lrc.cpp:78
#21 0x000055555573297c in std::make_unique<lrc::api::Lrc, bool>(bool&&) () at /usr/include/c++/11/bits/unique_ptr.h:962
#22 LRCInstance::LRCInstance(QString const&, ConnectivityMonitor*, bool, bool) (this=this@entry=0x5555571b8e40, updateUrl=..., connectivityMonitor=connectivityMonitor@entry=0x5555571f2ef0, debugMode=debugMode@entry=false, muteDaemon=muteDaemon@entry=false)
at /home/fsimon/jami-client-qt/src/app/lrcinstance.cpp:37
#23 0x00005555556846fa in MainApplication::initLrc(QString const&, ConnectivityMonitor*, bool, bool) (this=this@entry=0x7fffffffdee0, downloadUrl=..., cm=cm@entry=0x5555571f2ef0, debugMode=debugMode@entry=false, muteDaemon=muteDaemon@entry=false)
at /home/fsimon/jami-client-qt/src/app/mainapplication.cpp:304
#24 0x000055555568c32c in MainApplication::init() (this=this@entry=0x7fffffffdee0) at /home/fsimon/jami-client-qt/src/app/mainapplication.cpp:223
#25 0x000055555566161f in main(int, char**) (argc=<optimized out>, argv=0x7fffffffe0e8) at /home/fsimon/jami-client-qt/src/app/main.cpp:141
(gdb) thread 25
[Switching to thread 25 (Thread 0x7fff8b7fe640 (LWP 280920))]
#0 futex_wait (private=0, expected=2, futex_word=0x7ffed4000b80) 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=0x7ffed4000b80) at ../sysdeps/nptl/futex-internal.h:146
#1 __GI___lll_lock_wait (futex=futex@entry=0x7ffed4000b80, private=0) at ./nptl/lowlevellock.c:49
#2 0x00007fffe6c98002 in lll_mutex_lock_optimized (mutex=0x7ffed4000b80) at ./nptl/pthread_mutex_lock.c:48
#3 ___pthread_mutex_lock (mutex=0x7ffed4000b80) at ./nptl/pthread_mutex_lock.c:93
#4 0x00007fffe7937849 in __gthread_mutex_lock(__gthread_mutex_t*) (__mutex=0x7ffed4000b80) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749
#5 0x00007fffe79510a4 in std::mutex::lock() (this=0x7ffed4000b80) at /usr/include/c++/11/bits/std_mutex.h:100
#6 0x00007fffe7956110 in std::lock_guard<std::mutex>::lock_guard(std::mutex&) (this=0x7fff8b7f9678, __m=...) at /usr/include/c++/11/bits/std_mutex.h:229
#7 0x00007fffe7c83ae5 in jami::ConversationModule::clearPendingFetch() (this=0x5555573be9d0) at jamidht/conversation_module.cpp:1813
#8 0x00007fffe7aeffcd in jami::JamiAccount::doRegister_() (this=0x7fff60000db0) at jamidht/jamiaccount.cpp:1817
#9 0x00007fffe7aeb339 in operator()() const (__closure=0x555557447fd0) at jamidht/jamiaccount.cpp:1511
#10 0x00007fffe7b06a72 in operator()() (__closure=0x555557447fd0) at ./manager.h:922
#11 0x00007fffe7b2c806 in std::__invoke_impl<void, jami::runOnMainThread<jami::JamiAccount::registerAsyncOps()::<lambda()>::<lambda()> >(jami::JamiAccount::registerAsyncOps()::<lambda()>::<lambda()>&&, char const*, uint32_t)::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/11/bits/invoke.h:61
#12 0x00007fffe7b25a54 in std::__invoke_r<void, jami::runOnMainThread<jami::JamiAccount::registerAsyncOps()::<lambda()>::<lambda()> >(jami::JamiAccount::registerAsyncOps()::<lambda()>::<lambda()>&&, char const*, uint32_t)::<lambda()>&>(struct {...} &)
(__fn=...) at /usr/include/c++/11/bits/invoke.h:111
#13 0x00007fffe7b1c916 in std::_Function_handler<void(), jami::runOnMainThread<jami::JamiAccount::registerAsyncOps()::<lambda()>::<lambda()> >(jami::JamiAccount::registerAsyncOps()::<lambda()>::<lambda()>&&, char const*, uint32_t)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/11/bits/std_function.h:290
#14 0x00007fffe79c303e in std::function<void ()>::operator()() const (this=0x55555744a2d0) at /usr/include/c++/11/bits/std_function.h:590
#15 0x00007fffe7a502b4 in jami::ScheduledExecutor::loop() (this=0x555556c6e030) at scheduled_executor.cpp:145
#16 0x00007fffe7a4f59b in operator()() const (__closure=0x555557279108) at scheduled_executor.cpp:35
#17 0x00007fffe7a51cec in std::__invoke_impl<void, jami::ScheduledExecutor::ScheduledExecutor(const string&)::<lambda()> >(std::__invoke_other, struct {...} &&) (__f=...) at /usr/include/c++/11/bits/invoke.h:61
#18 0x00007fffe7a51caf in std::__invoke<jami::ScheduledExecutor::ScheduledExecutor(const string&)::<lambda()> >(struct {...} &&) (__fn=...) at /usr/include/c++/11/bits/invoke.h:96
#19 0x00007fffe7a51c5c in std::thread::_Invoker<std::tuple<jami::ScheduledExecutor::ScheduledExecutor(const string&)::<lambda()> > >::_M_invoke<0>(std::_Index_tuple<0>) (this=0x555557279108) at /usr/include/c++/11/bits/std_thread.h:259
#20 0x00007fffe7a51c30 in std::thread::_Invoker<std::tuple<jami::ScheduledExecutor::ScheduledExecutor(const string&)::<lambda()> > >::operator()(void) (this=0x555557279108) at /usr/include/c++/11/bits/std_thread.h:266
#21 0x00007fffe7a51c14 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<jami::ScheduledExecutor::ScheduledExecutor(const string&)::<lambda()> > > >::_M_run(void) (this=0x555557279100) at /usr/include/c++/11/bits/std_thread.h:211
#22 0x00007fffe70dc253 in std::execute_native_thread_routine(void*) (__p=0x555557279100) at ../../../../../src/libstdc++-v3/src/c++11/thread.cc:82
#23 0x00007fffe6c94ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#24 0x00007fffe6d26850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
(gdb) p *(pthread_mutex_t*)0x7ffed4000b80
$1 = {__data = {__lock = 2, __count = 0, __owner = 280982, __nusers = 1, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, __size = "\002\000\000\000\000\000\000\000\226I\004\000\001", '\000' <repeats 26 times>, __align = 2}
(gdb) thread find 280982
Thread 83 has target id 'Thread 0x7fff08ff1640 (LWP 280982)'
(gdb) thread 83
[Switching to thread 83 (Thread 0x7fff08ff1640 (LWP 280982))]
#0 futex_wait (private=0, expected=2, futex_word=0x7fff60001840) 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=0x7fff60001840) at ../sysdeps/nptl/futex-internal.h:146
#1 __GI___lll_lock_wait (futex=futex@entry=0x7fff60001840, private=0) at ./nptl/lowlevellock.c:49
#2 0x00007fffe6c9805d in lll_mutex_lock_optimized (mutex=0x7fff60001840) at ./nptl/pthread_mutex_lock.c:48
#3 ___pthread_mutex_lock (mutex=0x7fff60001840) at ./nptl/pthread_mutex_lock.c:128
#4 0x00007fffe7937849 in __gthread_mutex_lock(__gthread_mutex_t*) (__mutex=0x7fff60001840) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749
#5 0x00007fffe7950387 in __gthread_recursive_mutex_lock(__gthread_recursive_mutex_t*) (__mutex=0x7fff60001840) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:811
#6 0x00007fffe79510f6 in std::recursive_mutex::lock() (this=0x7fff60001840) at /usr/include/c++/11/mutex:108
#7 0x00007fffe79f4ddf in std::unique_lock<std::recursive_mutex>::lock() (this=0x7fff08fecf30) at /usr/include/c++/11/bits/unique_lock.h:139
#8 0x00007fffe79f3293 in std::unique_lock<std::recursive_mutex>::unique_lock(std::recursive_mutex&) (this=0x7fff08fecf30, __m=...) at /usr/include/c++/11/bits/unique_lock.h:69
#9 0x00007fffe7af1066 in jami::JamiAccount::convModule(bool) (this=0x7fff60000db0, noCreation=false) at jamidht/jamiaccount.cpp:2149
#10 0x00007fffe7af587b in jami::JamiAccount::updateConvForContact(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (this=0x7fff60000db0, uri="b018328f4f993a30d0d1a9ff3d35ba5b69ae5083", oldConv="bd4f81a04e46223dd7999abf07a499b97ce5dad0", newConv="") at jamidht/jamiaccount.cpp:2810
#11 0x00007fffe7b0bb1e in operator()<std::__cxx11::basic_string<char> const&, std::__cxx11::basic_string<char> const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) const (__closure=0x555556ba69d0, convId="bd4f81a04e46223dd7999abf07a499b97ce5dad0", contactUri="b018328f4f993a30d0d1a9ff3d35ba5b69ae5083", accept=false) at jamidht/jamiaccount.cpp:2264
#12 0x00007fffe7b2e535 in std::__invoke_impl<void, jami::JamiAccount::convModule(bool)::<lambda(auto:48&&, auto:49&&, bool)>&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, bool>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/11/bits/invoke.h:61
#13 0x00007fffe7b29039 in std::__invoke_r<void, jami::JamiAccount::convModule(bool)::<lambda(auto:48&&, auto:49&&, bool)>&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, bool>(struct {...} &) (__fn=...) at /usr/include/c++/11/bits/invoke.h:111
#14 0x00007fffe7b1fc3c in std::_Function_handler<void(const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, bool), jami::JamiAccount::convModule(bool)::<lambda(auto:48&&, auto:49&&, bool)> >::_M_invoke(const std::_Any_data &, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &, bool &&) (__functor=..., __args#0="bd4f81a04e46223dd7999abf07a499b97ce5dad0", __args#1="b018328f4f993a30d0d1a9ff3d35ba5b69ae5083", __args#2=@0x7fff08fed174: false) at /usr/include/c++/11/bits/std_function.h:290
#15 0x00007fffe7b4d0c9 in std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)>::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) const
(this=0x555556ba69d0, __args#0="bd4f81a04e46223dd7999abf07a499b97ce5dad0", __args#1="b018328f4f993a30d0d1a9ff3d35ba5b69ae5083", __args#2=false) at /usr/include/c++/11/bits/std_function.h:590
#16 0x00007fffe7c7b0df in jami::ConversationModule::Impl::removeConversationImpl(jami::SyncedConversation&) (this=0x555556ba6930, conv=...) at jamidht/conversation_module.cpp:1035
#17 0x00007fffe7c7a98a in operator()<jami::SyncedConversation>(jami::SyncedConversation&) const (__closure=0x7fff08fed340, conv=...) at jamidht/conversation_module.cpp:987
#18 0x00007fffe7c7aa45 in jami::ConversationModule::Impl::withConv<std::__cxx11::basic_string<char>, jami::ConversationModule::Impl::removeConversation(const string&)::<lambda(auto:9&)> >(const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &, struct {...} &&) const (this=0x555556ba6930, convId="bd4f81a04e46223dd7999abf07a499b97ce5dad0", cb=...) at jamidht/conversation_module.cpp:138
#19 0x00007fffe7c7ab3e in jami::ConversationModule::Impl::removeConversation(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (this=0x555556ba6930, conversationId="bd4f81a04e46223dd7999abf07a499b97ce5dad0")
at jamidht/conversation_module.cpp:987
#20 0x00007fffe7c7e1c5 in jami::ConversationModule::Impl::fixStructures(std::shared_ptr<jami::JamiAccount>, std::vector<std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&, std::set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)
(this=0x555556ba6930, acc=std::shared_ptr<jami::JamiAccount> (use count 5, weak count 87) = {...}, updateContactConv=std::vector of length 0, capacity 0, toRm=std::set with 1 element = {...}) at jamidht/conversation_module.cpp:1303
#21 0x00007fffe7c82228 in operator()() const (__closure=0x555557426ab0) at jamidht/conversation_module.cpp:1726
#22 0x00007fffe7ca4058 in std::__invoke_impl<void, jami::ConversationModule::loadConversations()::<lambda()>&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/11/bits/invoke.h:61
#23 0x00007fffe7ca0da9 in std::__invoke_r<void, jami::ConversationModule::loadConversations()::<lambda()>&>(struct {...} &) (__fn=...) at /usr/include/c++/11/bits/invoke.h:111
#24 0x00007fffe7c9d144 in std::_Function_handler<void(), jami::ConversationModule::loadConversations()::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/11/bits/std_function.h:290
#25 0x00007fffe810351c 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
#26 0x00007fffe70dc253 in std::execute_native_thread_routine(void*) (__p=0x55555742c5e0) at ../../../../../src/libstdc++-v3/src/c++11/thread.cc:82
#27 0x00007fffe6c94ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#28 0x00007fffe6d26850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
The problem is that two threads are attempting to lock the same two mutexes in opposite orders. In the logs above, thread 25 locks Account::configurationMutex_
before calling doRegister_
and then attempts to lock a conversation's mutex in clearPendingFetch
. That mutex was locked in withConv
by thread 83, which later attempts to lock configurationMutex_
in JamiAccount::convModule
.