overte-org / overte

Overte open source virtual worlds platform.
https://overte.org/
Other
132 stars 47 forks source link

Deadlock between MyAvatar::getAvatarEntityData() on default scripts thread and _avatarEntitiesLock.withReadLock on main thread #849

Open ksuprynowicz opened 4 months ago

ksuprynowicz commented 4 months ago

It happens because script engine that is a member of MyAvatar is assigned to main thread. In my opinion it would be best to instead assign that script engine to its own thread.

Backtrace on script thread:

syscall 0x00007ffff031f059
QtLinuxFutex::_q_futex qfutex_p.h:116
QtLinuxFutex::futexWait<…> qfutex_p.h:135
futexSemaphoreTryAcquire_loop<false> 0x00007ffff60dcf2b
futexSemaphoreTryAcquire<false> 0x00007ffff60dcf2b
QSemaphore::acquire 0x00007ffff60dcf2b
QMetaMethod::invoke 0x00007ffff62d7f2f
QMetaObject::invokeMethod 0x00007ffff62dd116
hifi::qt::blockingInvokeMethod QtHelpers.cpp:88
ScriptEngineV8::evaluate ScriptEngineV8.cpp:780
u8vec3ColorToScriptValue ScriptValueUtils.cpp:327
u8vec3Color_convertScriptValue EntityItemPropertiesMacros.h:115
EntityItemProperties::copyToScriptValue EntityItemProperties.cpp:1739
EntityItemPropertiesToScriptValue EntityItemProperties.cpp:2517
EntityItemProperties::propertiesToBlob EntityItemProperties.cpp:4925
MyAvatar::getAvatarEntityData MyAvatar.cpp:1952
AvatarData::qt_static_metacall moc_AvatarData.cpp:550
QMetaMethod::invoke 0x00007ffff62d802e
ScriptMethodV8Proxy::call ScriptObjectV8Proxy.cpp:1117
ScriptMethodV8Proxy::callback ScriptObjectV8Proxy.cpp:969
v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) 0x00007fffdfeb4b92
v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) 0x00007fffdfeb5174
v8::internal::Builtin_HandleApiCall(int, unsigned long*, v8::internal::Isolate*) 0x00007fffdfeb5a37
Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit 0x00007fffdfa1ef39
Builtins_InterpreterEntryTrampoline 0x00007fffdf9a2e90
<unknown> 0x000011328c6415b9
<unknown> 0x00000f4f10ad7619
<unknown> 0x0000000500000000
<unknown> 0x000011328c641689
<unknown> 0x000015d55ab0c6a1
<unknown> 0x000011328c6415b9
<unknown> 0x000011328c6415b9
<unknown> 0x000011328c6415b9
<unknown> 0x000011328c6415b9
<unknown> 0x000011328c6415b9
<unknown> 0x000015d55ab0c6a1
<unknown> 0x00000f4f10ad7619
<unknown> 0x000011328c6415b9
<unknown> 0x000011328c6415b9
<unknown> 0x000011328c6415b9
<unknown> 0x0000004000000000
<unknown> 0x00000016eb08f819
<unknown> 0x0000000000000001
<unknown> 0x000025219ba19251
<unknown> 0x00000c9f455c1151
<unknown> 0x00007ffdb17f6920
Builtins_InterpreterEntryTrampoline 0x00007fffdf9a2e90
<unknown> 0x00000c9f455c1131
<unknown> 0x000011328c6415b9
<unknown> 0x000011328c6415b9
<unknown> 0x000015d55ab0be91
<unknown> 0x000025219ba19251
<unknown> 0x0000004a00000000
<unknown> 0x00000016eb08f709
<unknown> 0x0000000000000001
<unknown> 0x000025219ba09181
<unknown> 0x000025219ba09099
<unknown> 0x00007ffdb17f6948
Builtins_JSEntryTrampoline 0x00007fffdf9a149c
<unknown> 0x000025219ba09181
<unknown> 0x000025219ba09181
<unknown> 0x0000000000000026
<unknown> 0x00007ffdb17f69b0
Builtins_JSEntry 0x00007fffdf9a11c3

Backtrace on main thread:

futex_wait 0x00007ffff02a33db
__GI___lll_lock_wait 0x00007ffff02a33db
lll_mutex_lock_optimized 0x00007ffff02a96f2
___pthread_mutex_lock 0x00007ffff02a96f2
__gthread_mutex_lock gthr-default.h:749
std::mutex::lock std_mutex.h:113
std::lock_guard::lock_guard std_mutex.h:249
operator() MyAvatar.cpp:1742
ReadWriteLockable::withReadLock<…>(struct {...} &&) const ReadWriteLockable.h:109
MyAvatar::handleChangedAvatarEntityData MyAvatar.cpp:1736
MyAvatar::simulate MyAvatar.cpp:1050
MyAvatar::update MyAvatar.cpp:826
AvatarManager::updateMyAvatar AvatarManager.cpp:170
Application::update Application.cpp:6752
Application::idle Application.cpp:5393
Application::event Application.cpp:4328
QApplicationPrivate::notify_helper 0x00007fffeeb62f32
Application::notify Application.cpp:4292
QCoreApplication::notifyInternal2 0x00007ffff62cc748
QCoreApplication::sendEvent 0x00007ffff62cc922
QCoreApplicationPrivate::sendPostedEvents 0x00007ffff62cfe51
QCoreApplication::sendPostedEvents 0x00007ffff62d03ac
postEventSourceDispatch 0x00007ffff6328697
g_main_dispatch 0x00007fffefb111f4
g_main_context_dispatch_unlocked 0x00007fffefb14317
g_main_context_iterate_unlocked 0x00007fffefb14317
g_main_context_iteration 0x00007fffefb14930
QEventDispatcherGlib::processEvents 0x00007ffff6327d4a
QEventLoop::exec qflags.h:69
QCoreApplication::exec qflags.h:121
main main.cpp:776
__libc_start_call_main 0x00007ffff02456ca
__libc_start_main_impl 0x00007ffff0245785
_start 0x000055555577f441