Skip to content

Commit

Permalink
Merge branch 'master' of github.com:MythTV/mythtv
Browse files Browse the repository at this point in the history
  • Loading branch information
jyavenard committed Feb 27, 2011
2 parents 61c95dc + 75d9359 commit 8b8b128
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 26 deletions.
26 changes: 12 additions & 14 deletions mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp
Expand Up @@ -28,7 +28,6 @@
*/

// C includes
#include <pthread.h>
#include <unistd.h>

// C++ includes
Expand Down Expand Up @@ -164,8 +163,7 @@ ChannelScanSM::ChannelScanSM(
// Misc
channelsFound(999),
currentInfo(NULL),
analogSignalHandler(new AnalogSignalHandler(this)),
scanner_thread_running(false)
analogSignalHandler(new AnalogSignalHandler(this))
{
inputname.detach();

Expand Down Expand Up @@ -1401,23 +1399,25 @@ V4LChannel *ChannelScanSM::GetV4LChannel(void)
#endif
}

/** \fn ChannelScanSM::SpawnScanner(void*)
* \brief Thunk that allows scanner_thread pthread to
/** \fn ScannerThread::run(void)
* \brief Thunk that allows scannerThread thread to
* call ChannelScanSM::RunScanner().
*/
void *ChannelScanSM::SpawnScanner(void *param)
void ScannerThread::run(void)
{
ChannelScanSM *scanner = (ChannelScanSM *)param;
scanner->RunScanner();
return NULL;
if (!m_parent)
return;

m_parent->RunScanner();
}

/** \fn ChannelScanSM::StartScanner(void)
* \brief Starts the ChannelScanSM event loop.
*/
void ChannelScanSM::StartScanner(void)
{
pthread_create(&scanner_thread, NULL, SpawnScanner, this);
scannerThread.SetParent(this);
scannerThread.start();
}

/** \fn ChannelScanSM::RunScanner(void)
Expand All @@ -1427,7 +1427,6 @@ void ChannelScanSM::RunScanner(void)
{
VERBOSE(VB_CHANSCAN, LOC + "ChannelScanSM::RunScanner -- begin");

scanner_thread_running = true;
threadExit = false;

while (!threadExit)
Expand All @@ -1437,7 +1436,6 @@ void ChannelScanSM::RunScanner(void)

usleep(250);
}
scanner_thread_running = false;

VERBOSE(VB_CHANSCAN, LOC + "ChannelScanSM::RunScanner -- end");
}
Expand Down Expand Up @@ -1669,8 +1667,8 @@ void ChannelScanSM::StopScanner(void)

threadExit = true;

if (scanner_thread_running)
pthread_join(scanner_thread, NULL);
if (scannerThread.isRunning())
scannerThread.wait();

if (signalMonitor)
signalMonitor->Stop();
Expand Down
25 changes: 17 additions & 8 deletions mythtv/libs/libmythtv/channelscan/channelscan_sm.h
Expand Up @@ -30,14 +30,14 @@
#ifndef SISCAN_H
#define SISCAN_H

#include <pthread.h>

// Qt includes
#include <QString>
#include <QList>
#include <QPair>
#include <QMap>
#include <QSet>
#include <QObject>
#include <QThread>

// MythTV includes
#include "frequencytables.h"
Expand Down Expand Up @@ -65,8 +65,9 @@ typedef QPair<transport_scan_items_it_t, ScannedChannelInfo*> ChannelListItem;
typedef QList<ChannelListItem> ChannelList;

class ChannelScanSM;
class AnalogSignalHandler : public SignalMonitorListener
class AnalogSignalHandler : public QObject, public SignalMonitorListener
{
Q_OBJECT
public:
AnalogSignalHandler(ChannelScanSM *_siscan) : siscan(_siscan) { }

Expand All @@ -80,12 +81,24 @@ class AnalogSignalHandler : public SignalMonitorListener
ChannelScanSM *siscan;
};

class ScannerThread : public QThread
{
Q_OBJECT
public:
ScannerThread() : m_parent(NULL) {}
void SetParent(ChannelScanSM *parent) { m_parent = parent; }
void run(void);
private:
ChannelScanSM *m_parent;
};

class ChannelScanSM : public MPEGStreamListener,
public ATSCMainStreamListener,
public DVBMainStreamListener,
public DVBOtherStreamListener
{
friend class AnalogSignalHandler;
friend class ScannerThread;

public:
ChannelScanSM(
Expand Down Expand Up @@ -162,8 +175,6 @@ class ChannelScanSM : public MPEGStreamListener,

/// \brief Called by SpawnScanner to run scanning thread
void RunScanner(void);
/// \brief Thunk to call RunScanner from pthread
static void *SpawnScanner(void *param);

bool HasTimedOut(void);
void HandleActiveScan(void);
Expand Down Expand Up @@ -244,9 +255,7 @@ class ChannelScanSM : public MPEGStreamListener,
// Analog Info
AnalogSignalHandler *analogSignalHandler;

/// Scanner thread, runs ChannelScanSM::StartScanner()
pthread_t scanner_thread;
bool scanner_thread_running;
ScannerThread scannerThread;
};

inline void ChannelScanSM::UpdateScanPercentCompleted(void)
Expand Down
11 changes: 7 additions & 4 deletions mythtv/libs/libmythtv/dvbstreamhandler.cpp
Expand Up @@ -102,7 +102,8 @@ DVBStreamHandler::DVBStreamHandler(const QString &dvb_device) :

_pid_lock(QMutex::Recursive),
_open_pid_filters(0),
_listener_lock(QMutex::Recursive)
_listener_lock(QMutex::Recursive),
_run(false)
{
}

Expand Down Expand Up @@ -210,7 +211,7 @@ void DVBStreamHandler::Start(void)
_reader_thread.SetParent(this);
_reader_thread.start();

if (_reader_thread.isRunning())
if (!_reader_thread.isRunning())
{
VERBOSE(VB_IMPORTANT, LOC_ERR + "Start: Failed to create thread.");
return;
Expand All @@ -226,13 +227,15 @@ void DVBStreamHandler::Stop(void)
{
if (_device_read_buffer)
_device_read_buffer->Stop();
_run = false;
_reader_thread.wait();
}
}

void DVBStreamHandler::Run(void)
{
_using_section_reader = !SupportsTSMonitoring() && _allow_section_reader;
_run = true;

if (_using_section_reader)
RunSR();
Expand Down Expand Up @@ -304,7 +307,7 @@ void DVBStreamHandler::RunTS(void)
fd_set fd_select_set;
FD_ZERO( &fd_select_set);
FD_SET (dvr_fd, &fd_select_set);
while (IsRunning() && !_error)
while (_run && !_error)
{
RetuneMonitor();
UpdateFiltersFromStreamData();
Expand Down Expand Up @@ -411,7 +414,7 @@ void DVBStreamHandler::RunSR(void)

VERBOSE(VB_RECORD, LOC + "RunSR(): begin");

while (IsRunning())
while (_run)
{
RetuneMonitor();
UpdateFiltersFromStreamData();
Expand Down
2 changes: 2 additions & 0 deletions mythtv/libs/libmythtv/dvbstreamhandler.h
Expand Up @@ -134,6 +134,8 @@ class DVBStreamHandler : public ReaderPausedCB
static QMutex _handlers_lock;
static QMap<QString,DVBStreamHandler*> _handlers;
static QMap<QString,uint> _handlers_refcnt;

bool _run;
};

#endif // _DVBSTREAMHANDLER_H_

0 comments on commit 8b8b128

Please sign in to comment.