[mythtv-commits] Ticket #11795: Random crash in MythSystemLegacy

MythTV noreply at mythtv.org
Thu Aug 29 05:43:46 UTC 2013


#11795: Random crash in MythSystemLegacy
------------------------------------+-------------------------
     Reporter:  kevin@…             |      Owner:
         Type:  Bug Report - Crash  |     Status:  new
     Priority:  minor               |  Milestone:  unknown
    Component:  MythTV - General    |    Version:  Master Head
     Severity:  medium              |   Keywords:
Ticket locked:  0                   |
------------------------------------+-------------------------
 I'm getting a crash in mythbackend about once or twice a day, usually
 after the backend runs my external channel change script.  The backtrace
 is:

 {{{
 #0  0xb39a0ede in QSemaphore::release(int) ()
    from /usr/lib/i386-linux-gnu/libQtCore.so.4
 #1  0xb5d78534 in MythSystemLegacy::Unlock (this=0x0) at
 mythsystemlegacy.h:160
 #2  0xb5d786aa in MythSystemLegacyPrivate::Unlock (this=0x9cdd17b8)
     at mythsystemprivate.h:72
 #3  0xb5d74e5a in MythSystemLegacySignalManager::run (this=0xac122930)
     at mythsystemunix.cpp:559
 #4  0xb5c784fc in MThreadInternal::run (this=0xac13bd30) at mthread.cpp:79
 #5  0xb39a4f00 in ?? () from /usr/lib/i386-linux-gnu/libQtCore.so.4
 #6  0xb4bb3c39 in start_thread ()
    from /lib/i386-linux-gnu/i686/cmov/libpthread.so.0
 #7  0xb377a78e in clone () from /lib/i386-linux-gnu/i686/cmov/libc.so.6
 }}}

 As you can see on line !#1, "this" is null.  Here's the section of code in
 question (actually it's from line !#2 above):

 {{{
     void Unlock(void)                { m_parent->Unlock(); }
 }}}

 Here "m_parent" is null.  If we go up one call frame, we have:

 {{{
             if (ms->m_parent)
             {
                 if (ms->GetStatus() == GENERIC_EXIT_OK)
                     emit ms->finished();
                 else
                     emit ms->error(ms->GetStatus());

                 ms->disconnect();
                 ms->Unlock();
             }
 }}}

 So sometime between the check for m_parent being null, and calling
 "ms->Unlock", m_parent does become null.  Since m_parent is a QPointer, if
 code on another thread somewhere deletes what m_parent is pointing to,
 then m_parent will become a null pointer, rather than pointing into
 deleted memory.

 Since this is running in a separate thread, I'm thinking another thread is
 deleting the parent !MythSystemLegacy object before the signal manager
 thread is done with it.

 I haven't had time to further track this down, but I wanted to file this
 in case the resident expert (whoever that may be) of !MythSystem might
 know exactly where the problem is.

 Thanks!
 -- Kevin

--
Ticket URL: <http://code.mythtv.org/trac/ticket/11795>
MythTV <http://www.mythtv.org>
MythTV Media Center


More information about the mythtv-commits mailing list