MythTV  master
taskqueue.h
Go to the documentation of this file.
1 // Program Name: taskqueue.h
3 // Created : Oct. 24, 2005
4 //
5 // Purpose : Used to process delayed tasks
6 //
7 // Copyright (c) 2005 David Blain <dblain@mythtv.org>
8 //
9 // Licensed under the GPL v2 or later, see LICENSE for details
10 //
12 
13 #ifndef TASKQUEUE_H
14 #define TASKQUEUE_H
15 
16 // POSIX headers
17 #include <sys/types.h>
18 #ifndef _WIN32
19 #include <sys/socket.h>
20 #include <netinet/in.h>
21 #include <arpa/inet.h>
22 #endif // _WIN32
23 
24 // C++ headers
25 #include <map>
26 
27 // Qt headers
28 #include <QMutex>
29 
30 // MythTV headers
31 #include "libmythbase/mthread.h"
33 
34 #include "upnpexp.h"
35 #include "upnputil.h"
36 
37 class Task;
38 class TaskQueue;
39 
41 // Typedefs
43 
44 using TaskMap = std::multimap< TaskTime, Task *>;
45 
48 //
49 // Task Class Definition
50 //
53 
54 class Task : public ReferenceCounter
55 {
56  protected:
57  static long m_nTaskCount;
58 
59  long m_nTaskId;
60 
61  protected:
62 
63  // Destructor protected to force use of Release Method
64  ~Task() override = default;
65 
66  public:
67 
68  explicit Task(const QString &debugName);
69 
70  long Id() const { return( m_nTaskId ); }
71 
72  virtual void Execute( TaskQueue *pQueue ) = 0;
73  virtual QString Name () = 0;
74 
75 };
76 
77 
79 // TaskQueue Singleton
81 
83 {
84  private:
85 
86  // Singleton instance used by all.
88 
89  protected:
90 
92  QMutex m_mutex;
93  bool m_bTermRequested {false};
94 
95  protected:
96 
97  bool IsTermRequested();
98 
99  void run() override; // MThread
100 
101  private:
102 
103  // ------------------------------------------------------------------
104  // Private so the singleton pattern can be inforced.
105  // ------------------------------------------------------------------
106 
107  TaskQueue();
108 
109  public:
110 
111  static TaskQueue* Instance();
112  static void Shutdown();
113 
114  ~TaskQueue() override;
115 
116  void RequestTerminate ( );
117 
118  void Clear ( );
119  void AddTask ( std::chrono::milliseconds msec , Task *pTask );
120  void AddTask ( Task *pTask );
121 
122  Task *GetNextExpiredTask ( TaskTime tt, std::chrono::milliseconds nWithinMilliSecs = 50ms );
123 
124  private:
125  void AddTaskAbsolute ( TaskTime tt, Task *pTask );
126 };
127 
128 #endif // TASKQUEUE_H
TaskTime
std::chrono::microseconds TaskTime
Definition: upnputil.h:31
TaskQueue::m_mapTasks
TaskMap m_mapTasks
Definition: taskqueue.h:91
Task::Execute
virtual void Execute(TaskQueue *pQueue)=0
TaskQueue
Definition: taskqueue.h:82
TaskMap
std::multimap< TaskTime, Task * > TaskMap
Definition: taskqueue.h:44
TaskQueue::m_mutex
QMutex m_mutex
Definition: taskqueue.h:92
Task::Name
virtual QString Name()=0
Task
Definition: taskqueue.h:54
Task::Id
long Id() const
Definition: taskqueue.h:70
TaskQueue::g_pTaskQueue
static TaskQueue * g_pTaskQueue
Definition: taskqueue.h:87
MThread::run
virtual void run(void)
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
Definition: mthread.cpp:315
referencecounter.h
Task::m_nTaskCount
static long m_nTaskCount
Definition: taskqueue.h:57
Task::m_nTaskId
long m_nTaskId
Definition: taskqueue.h:59
Task::Task
Task(const QString &debugName)
Definition: taskqueue.cpp:42
Clear
#define Clear(a)
Definition: audiooutputopensles.cpp:54
Task::~Task
~Task() override=default
MThread
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:48
mthread.h
UPNP_PUBLIC
#define UPNP_PUBLIC
Definition: upnpexp.h:9
upnputil.h
ReferenceCounter
General purpose reference counter.
Definition: referencecounter.h:26
upnpexp.h