Skip to content

Commit

Permalink
Rework of [1140e4]. Convert NetworkControl command handling thread fr…
Browse files Browse the repository at this point in the history
…om pthread to QThread.
  • Loading branch information
daniel-kristjansson committed Apr 25, 2011
1 parent 3d76c17 commit 13649ae
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 37 deletions.
51 changes: 23 additions & 28 deletions mythtv/programs/mythfrontend/networkcontrol.cpp
@@ -1,4 +1,4 @@
# include <unistd.h>
#include <unistd.h>

#include <QCoreApplication>
#include <QRegExp>
Expand Down Expand Up @@ -48,11 +48,18 @@ static bool is_abbrev(QString const& command,
return test.toLower() == command.left(test.length()).toLower();
}

void NetworkCommandThread::run(void)
{
m_parent->RunCommandThread();
}

NetworkControl::NetworkControl() :
QTcpServer(),
prompt("# "),
gotAnswer(false), answer(""),
clientLock(QMutex::Recursive)
clientLock(QMutex::Recursive),
commandThread(new NetworkCommandThread(this)),
stopCommandThread(false)
{
// Eventually this map should be in the jumppoints table
jumpMap["channelpriorities"] = "Channel Recording Priorities";
Expand Down Expand Up @@ -215,8 +222,7 @@ NetworkControl::NetworkControl() :
keyTextMap[Qt::Key_Greater] = ">";
keyTextMap[Qt::Key_Bar] = "|";

stopCommandThread = false;
pthread_create(&command_thread, NULL, CommandThread, this);
commandThread->start();

gCoreContext->addListener(this);

Expand All @@ -241,11 +247,13 @@ NetworkControl::~NetworkControl(void)

notifyDataAvailable();

stopCommandThread = true;
ncLock.lock();
stopCommandThread = true;
ncCond.wakeOne();
ncLock.unlock();
pthread_join(command_thread, NULL);
commandThread->wait();
delete commandThread;
commandThread = NULL;
}

bool NetworkControl::listen(const QHostAddress & address, quint16 port)
Expand All @@ -259,34 +267,21 @@ bool NetworkControl::listen(const QHostAddress & address, quint16 port)
return false;
}

void *NetworkControl::CommandThread(void *param)
{
NetworkControl *networkControl = static_cast<NetworkControl *>(param);
networkControl->RunCommandThread();

return NULL;
}

void NetworkControl::RunCommandThread(void)
{
NetworkCommand *nc;

QMutexLocker locker(&ncLock);
while (!stopCommandThread)
{
ncLock.lock();
while (!networkControlCommands.size()) {
while (networkControlCommands.empty() && !stopCommandThread)
ncCond.wait(&ncLock);
if (stopCommandThread)
{
ncLock.unlock();
return;
}
if (!stopCommandThread)
{
NetworkCommand *nc = networkControlCommands.front();
networkControlCommands.pop_front();
locker.unlock();
processNetworkControlCommand(nc);
locker.relock();
}
nc = networkControlCommands.front();
networkControlCommands.pop_front();
ncLock.unlock();

processNetworkControlCommand(nc);
}
}

Expand Down
29 changes: 20 additions & 9 deletions mythtv/programs/mythfrontend/networkcontrol.h
Expand Up @@ -4,14 +4,13 @@
#include <deque>
using namespace std;

#include <pthread.h>

#include <QEvent>
#include <QWaitCondition>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMutex>
#include <QStringList>
#include <QThread>

class MainServer;
class QTextStream;
Expand Down Expand Up @@ -86,9 +85,24 @@ class NetworkControlCloseEvent : public QEvent
NetworkControlClient * m_networkControlClient;
};

class NetworkControl;

class NetworkCommandThread : public QThread
{
Q_OBJECT
public:
NetworkCommandThread(NetworkControl *parent) : m_parent(parent) {}
virtual ~NetworkCommandThread() { wait(); m_parent = NULL; }
virtual void run(void);
private:
NetworkControl *m_parent;
};

class NetworkControl : public QTcpServer
{
Q_OBJECT

friend class NetworkCommandThread;
public:
NetworkControl();
~NetworkControl();
Expand All @@ -101,9 +115,6 @@ class NetworkControl : public QTcpServer
void deleteClient(void);

protected:
static void *SocketThread(void *param);
void RunSocketThread(void);
static void *CommandThread(void *param);
void RunCommandThread(void);

private:
Expand Down Expand Up @@ -139,15 +150,15 @@ class NetworkControl : public QTcpServer
mutable QMutex clientLock;
QList<NetworkControlClient*> clients;

QList<NetworkCommand*> networkControlCommands;
QList<NetworkCommand*> networkControlCommands; // protected by ncLock
QMutex ncLock;
QWaitCondition ncCond;
QWaitCondition ncCond; // protected by ncLock

QList<NetworkCommand*> networkControlReplies;
QMutex nrLock;

pthread_t command_thread;
bool stopCommandThread;
NetworkCommandThread *commandThread;
bool stopCommandThread; // protected by ncLock
};

#endif
Expand Down

0 comments on commit 13649ae

Please sign in to comment.