Changeset f61257601 in mythtv


Ignore:
Timestamp:
07/24/12 16:13:16 (5 years ago)
Author:
Daniel Thor Kristjansson <dkristjansson@…>
Branches:
master, beta/0.28, devel/027candidates, devel/dbus-screensaver, devel/eit-encoding-fixes, devel/ffmpeg-resync, devel/housekeeper, devel/http_ssl, devel/iptv, devel/logging, devel/lvr/rpi, devel/lvr/startup, devel/mythsocket, devel/mythsystem, devel/newvaapi, devel/opengl, devel/resync-ffmpeg28, devel/rpi, devel/scheduler, fixes/0.27, fixes/0.28, fixes/29, personal/stuartm/mheg-debug
Children:
50957d5b6
Parents:
38257011f7
git-author:
Daniel Thor Kristjansson <dkristjansson@…> (07/24/12 16:13:16)
git-committer:
Daniel Thor Kristjansson <dkristjansson@…> (07/24/12 16:13:16)
Message:

Fixes #10870. Fix Start/Stop? race condition in StreamHandler?.

Take two... The locking order documented in streamhandler.h wasn't being adhered to
in the DVBStreamHandler. The actual locking order is now documented and a new lock
has been added for AddListener/RemoveListener? as per the suggested code from Roger
James.

Location:
mythtv/libs/libmythtv/recorders
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • mythtv/libs/libmythtv/recorders/streamhandler.cpp

    r38257011f7 rf61257601  
    2727StreamHandler::~StreamHandler()
    2828{
    29     if (!_stream_data_list.empty())
    30     {
    31         LOG(VB_GENERAL, LOG_ERR, LOC + "dtor & _stream_data_list not empty");
     29    QMutexLocker locker(&_add_rm_lock);
     30
     31    {
     32        QMutexLocker locker2(&_listener_lock);
     33        if (!_stream_data_list.empty())
     34        {
     35            LOG(VB_GENERAL, LOG_ERR, LOC +
     36                "dtor & _stream_data_list not empty");
     37        }
    3238    }
    3339
     
    4248                                QString output_file)
    4349{
     50    QMutexLocker locker(&_add_rm_lock);
     51
    4452    LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- begin")
    4553                .arg((uint64_t)data,0,16));
     
    94102void StreamHandler::RemoveListener(MPEGStreamData *data)
    95103{
     104    QMutexLocker locker(&_add_rm_lock);
     105
    96106    LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- begin")
    97107                .arg((uint64_t)data,0,16));
     
    159169        _running_state_changed.wait(&_start_stop_lock, 100);
    160170
    161     if (!_running_desired)
    162     {
    163         LOG(VB_GENERAL, LOG_WARNING, LOC +
    164             "Programmer Error: Stop called before Start finished");
    165     }
    166 
    167171    if (_error)
    168172    {
     
    176180    QMutexLocker locker(&_start_stop_lock);
    177181
    178     do
    179     {
    180         SetRunningDesired(false);
    181         while (!_running_desired && _running)
    182             _running_state_changed.wait(&_start_stop_lock, 100);
    183         if (_running_desired)
    184         {
    185             LOG(VB_GENERAL, LOG_WARNING, LOC +
    186                 "Programmer Error: Start called before Stop finished");
    187         }
    188     } while (_running_desired);
     182    SetRunningDesired(false);
     183    while (_running)
     184        _running_state_changed.wait(&_start_stop_lock, 100);
    189185
    190186    wait();
  • mythtv/libs/libmythtv/recorders/streamhandler.h

    r549a54a83c rf61257601  
    4646
    4747// locking order
    48 // _pid_lock -> _listener_lock -> _start_stop_lock
     48// _pid_lock -> _listener_lock
     49// _add_rm_lock -> _listener_lock
     50//              -> _start_stop_lock
    4951
    5052class StreamHandler : protected MThread, public DeviceReaderCB
     
    102104    bool              _allow_section_reader;
    103105
     106    QMutex            _add_rm_lock;
     107
    104108    mutable QMutex    _start_stop_lock;
    105109    volatile bool     _running_desired;
Note: See TracChangeset for help on using the changeset viewer.