46 changes: 20 additions & 26 deletions mythtv/programs/mythbackend/mainserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1747,16 +1747,16 @@ void MainServer::HandleFillProgramInfo(QStringList &slist, PlaybackSock *pbs)
SendResponse(pbssock, strlist);
}

void *MainServer::SpawnDeleteThread(void *param)
void DeleteThread::run(void)
{
DeleteStruct *ds = (DeleteStruct *)param;

MainServer *ms = ds->ms;
ms->DoDeleteThread(ds);
if (!m_parent)
return;

delete ds;
MainServer *ms = m_parent->ms;
ms->DoDeleteThread(m_parent);

return NULL;
delete m_parent;
this->deleteLater();
}

void MainServer::DoDeleteThread(const DeleteStruct *ds)
Expand Down Expand Up @@ -2508,12 +2508,9 @@ void MainServer::DoHandleDeleteRecording(

recinfo.SaveDeletePendingFlag(true);

pthread_t deleteThread;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&deleteThread, &attr, SpawnDeleteThread, ds);
pthread_attr_destroy(&attr);
DeleteThread *deleteThread = new DeleteThread;
deleteThread->SetParent(ds);
deleteThread->start();
}
else
{
Expand Down Expand Up @@ -4470,16 +4467,16 @@ void MainServer::GetFilesystemInfos(vector <FileSystemInfo> &fsInfos)
}
}

void *MainServer::SpawnTruncateThread(void *param)
void TruncateThread::run(void)
{
DeleteStruct *ds = (DeleteStruct *)param;

MainServer *ms = ds->ms;
ms->DoTruncateThread(ds);
if (!m_parent)
return;

delete ds;
MainServer *ms = m_parent->ms;
ms->DoTruncateThread(m_parent);

return NULL;
delete m_parent;
this->deleteLater();
}

void MainServer::DoTruncateThread(const DeleteStruct *ds)
Expand Down Expand Up @@ -4571,12 +4568,9 @@ bool MainServer::HandleDeleteFile(QString filename, QString storagegroup,
ds->fd = fd;
ds->size = size;

pthread_t truncateThread;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&truncateThread, &attr, SpawnTruncateThread, ds);
pthread_attr_destroy(&attr);
TruncateThread *truncateThread = new TruncateThread;
truncateThread->SetParent(ds);
truncateThread->run();
}

return true;
Expand Down
50 changes: 38 additions & 12 deletions mythtv/programs/mythbackend/mainserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,47 @@ class MythServer;
class VideoScanner;
class QTimer;

typedef struct deletestruct
{
MainServer *ms;
uint chanid;
QDateTime recstartts;
QDateTime recendts;
QString filename;
int fd;
off_t size;
QString title;
bool forceMetadataDelete;
} DeleteStruct;

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

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

class MainServer : public QObject, public MythSocketCBs
{
Q_OBJECT

friend class DeleteThread;
friend class TruncateThread;
public:
MainServer(bool master, int port,
QMap<int, EncoderLink *> *tvList,
Expand Down Expand Up @@ -73,18 +111,6 @@ class MainServer : public QObject, public MythSocketCBs
void newConnection(MythSocket *);

private:
typedef struct deletestruct
{
MainServer *ms;
uint chanid;
QDateTime recstartts;
QDateTime recendts;
QString filename;
int fd;
off_t size;
QString title;
bool forceMetadataDelete;
} DeleteStruct;

void ProcessRequestWork(MythSocket *sock);
void HandleAnnounce(QStringList &slist, QStringList commands,
Expand Down
34 changes: 14 additions & 20 deletions mythtv/programs/mythbackend/scheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList,
schedulingEnabled(true),
m_tvList(tvList),
expirer(NULL),
threadrunning(false),
m_mainServer(NULL),
resetIdleTime(false),
m_isShuttingDown(false),
Expand Down Expand Up @@ -87,19 +86,16 @@ Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList,
return;
}

threadrunning = runthread;

fsInfoCacheFillTime = QDateTime::currentDateTime().addSecs(-1000);

if (runthread)
{
int err = pthread_create(&schedThread, NULL, SchedulerThread, this);
if (err != 0)
schedThread.SetParent(this);
schedThread.start(QThread::LowPriority);

if (!schedThread.isRunning())
{
VERBOSE(VB_IMPORTANT,
QString("Failed to start scheduler thread: error %1")
.arg(err));
threadrunning = false;
VERBOSE(VB_IMPORTANT, QString("Failed to start scheduler thread"));
}

WakeUpSlaves();
Expand All @@ -120,10 +116,10 @@ Scheduler::~Scheduler()
worklist.pop_back();
}

if (threadrunning)
if (schedThread.isRunning())
{
pthread_cancel(schedThread);
pthread_join(schedThread, NULL);
schedThread.terminate();
schedThread.wait();
}
}

Expand Down Expand Up @@ -2675,15 +2671,12 @@ void Scheduler::WakeUpSlaves(void)
}
}

void *Scheduler::SchedulerThread(void *param)
void ScheduleThread::run(void)
{
// Lower scheduling priority, to avoid problems with recordings.
if (setpriority(PRIO_PROCESS, 0, 9))
VERBOSE(VB_IMPORTANT, LOC + "Setting priority failed." + ENO);
Scheduler *sched = static_cast<Scheduler*>(param);
sched->RunScheduler();
if (!m_parent)
return;

return NULL;
m_parent->RunScheduler();
}

void Scheduler::UpdateManuals(int recordid)
Expand Down Expand Up @@ -3533,7 +3526,8 @@ void Scheduler::AddNewRecords(void)

RecStatusType newrecstatus = p->GetRecordingStatus();
// Check for rsOffLine
if ((threadrunning || specsched) && !cardMap.contains(p->GetCardID()))
if ((schedThread.isRunning() || specsched) &&
!cardMap.contains(p->GetCardID()))
newrecstatus = rsOffLine;

// Check for rsTooManyRecordings
Expand Down
22 changes: 16 additions & 6 deletions mythtv/programs/mythbackend/scheduler.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
#ifndef SCHEDULER_H_
#define SCHEDULER_H_

// POSIX headers
#include <pthread.h>

// C++ headers
#include <deque>
#include <vector>
Expand All @@ -15,6 +12,7 @@ using namespace std;
#include <QString>
#include <QMutex>
#include <QMap>
#include <QThread>

// MythTV headers
#include "recordinginfo.h"
Expand All @@ -33,10 +31,24 @@ typedef deque<RecordingInfo*> RecList;
typedef RecList::const_iterator RecConstIter;
typedef RecList::iterator RecIter;

class Scheduler;

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

class Scheduler : public QObject
{
Q_OBJECT

friend class ScheduleThread;
public:
Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList,
QString recordTbl = "record", Scheduler *master_sched = NULL);
Expand Down Expand Up @@ -86,7 +98,6 @@ class Scheduler : public QObject

protected:
void RunScheduler(void);
static void *SchedulerThread(void *param);

private:
QString recordTable;
Expand Down Expand Up @@ -172,8 +183,7 @@ class Scheduler : public QObject

QMap<QString, bool> recPendingList;

pthread_t schedThread;
bool threadrunning;
ScheduleThread schedThread;

MainServer *m_mainServer;

Expand Down