[mythtv-commits] Ticket #9714: mythwelcome hanging (MythSystemUnix::Fork child QString use leads to possible deadlock)
MythTV
noreply at mythtv.org
Fri Apr 8 01:51:11 UTC 2011
#9714: mythwelcome hanging (MythSystemUnix::Fork child QString use leads to
possible deadlock)
-------------------------------------+------------------------
Reporter: naf@… | Owner: beirdo
Type: Patch - Bug Fix | Status: new
Priority: minor | Milestone: unknown
Component: MythTV - MythSystem | Version: Trunk Head
Severity: medium | Keywords:
Ticket locked: 0 |
-------------------------------------+------------------------
I noticed mythwelcome sporadically hanging when calling mythstatus. Logs
ended like:
{{{
2011-04-07 20:08:19.377 Locking input devices
2011-04-07 20:08:19.386 Launching: /usr/local/bin/mythshutdown --status 0
2011-04-07 20:08:19.388 Managed child (PID: 27773) has started! *
command=/usr/local/bin/mythshutdown --status 0, timeout=0
}}}
Backtrace of the hung process looked like:
{{{
#0 0x00007fe8f25d81ac in __lll_lock_wait () from /lib64/libpthread.so.0
#1 0x00007fe8f25d34bf in _L_lock_1058 () from /lib64/libpthread.so.0
#2 0x00007fe8f25d331b in pthread_mutex_lock () from
/lib64/libpthread.so.0
#3 0x0000003c2d2978a9 in ?? () from /usr/lib64/libGL.so.1
#4 0x0000003c2d29a8b9 in ?? () from /usr/lib64/libGL.so.1
#5 0x0000003c2d29ace8 in ?? () from /usr/lib64/libGL.so.1
#6 0x0000003c2da0098d in ?? () from /usr/lib64/tls/libnvidia-
tls.so.260.19.29
#7 0x00000031338b6623 in QString::fromLatin1_helper(char const*, int) ()
from /usr/lib64/libQtCore.so.4
#8 0x00000031338b92bd in QString::fromAscii_helper(char const*, int) ()
from /usr/lib64/libQtCore.so.4
#9 0x00007fe8f445902d in QString (this=0x1ffb5b0, timeout=0) at
/usr/include/QtCore/qstring.h:426
#10 GetSetting (this=0x1ffb5b0, timeout=0) at mythsystem.h:86
#11 GetSetting (this=0x1ffb5b0, timeout=0) at mythsystem.h:147
#12 MythSystemUnix::Fork (this=0x1ffb5b0, timeout=0) at system-
unix.cpp:766
#13 0x00007fe8f43d1732 in MythSystem::Run (this=0x201e6b0, timeout=0) at
mythsystem.cpp:152
#14 0x00007fe8f43d58c6 in myth_system (command=..., flags=<value optimized
out>, timeout=0) at mythsystem.cpp:368
#15 0x0000000000404ba1 in isRunning (program=0x40f770 "mythtranscode") at
main.cpp:196
#16 0x00000000004052a6 in getStatus (bWantRecStatus=false) at main.cpp:231
#17 0x000000000040e8f1 in main (argc=3, argv=0x7fffeb559068) at
main.cpp:932
}}}
So the deadlock was happening in MythSystemUnix::Fork() doing QString
stuff during a call to GetSetting() between fork() and execl().
It appears that bac42c09 fixed possible child deadlocks by removing all
QString use between fork() and execl() [and added comments referencing
their danger!], but another QString was reintroduced in 7bad51a1.
Attached patch moves the GetSetting() call (and thus the use of QString)
to before the fork(), which solved my intermittent mythwelcome freezes.
--
Ticket URL: <http://code.mythtv.org/trac/ticket/9714>
MythTV <http://code.mythtv.org/trac>
MythTV Media Center
More information about the mythtv-commits
mailing list