00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00012
00013 #ifndef __TASKQUEUE_H__
00014 #define __TASKQUEUE_H__
00015
00016
00017 #include <sys/types.h>
00018 #ifndef USING_MINGW
00019 #include <sys/socket.h>
00020 #include <netinet/in.h>
00021 #include <arpa/inet.h>
00022 #endif // USING_MINGW
00023
00024
00025 #include <map>
00026
00027
00028 #include "refcounted.h"
00029 #include "upnputil.h"
00030 #include "mthread.h"
00031 #include "upnpexp.h"
00032
00033 class Task;
00034 class TaskQueue;
00035
00037
00039
00040 typedef std::multimap< TaskTime, Task *> TaskMap;
00041
00044
00045
00046
00049
00050 class Task : public RefCounted
00051 {
00052 protected:
00053 static long m_nTaskCount;
00054
00055 long m_nTaskId;
00056
00057 protected:
00058
00059
00060
00061 virtual ~Task();
00062
00063 public:
00064
00065 Task();
00066
00067 long Id() const { return( m_nTaskId ); }
00068
00069 virtual void Execute( TaskQueue *pQueue ) = 0;
00070 virtual QString Name () = 0;
00071
00072 };
00073
00074
00076
00078
00079 class UPNP_PUBLIC TaskQueue : public MThread
00080 {
00081 private:
00082
00083
00084 static TaskQueue* g_pTaskQueue;
00085
00086 protected:
00087
00088 TaskMap m_mapTasks;
00089 QMutex m_mutex;
00090 bool m_bTermRequested;
00091
00092 protected:
00093
00094 bool IsTermRequested();
00095
00096 virtual void run ();
00097
00098 private:
00099
00100
00101
00102
00103
00104 TaskQueue();
00105
00106 public:
00107
00108 static TaskQueue* Instance();
00109 static void Shutdown();
00110
00111 virtual ~TaskQueue();
00112
00113 void RequestTerminate ( );
00114
00115 void Clear ( );
00116 void AddTask ( long msec , Task *pTask );
00117 void AddTask ( TaskTime tt, Task *pTask );
00118 void AddTask ( Task *pTask );
00119
00120 Task *GetNextExpiredTask ( TaskTime tt, long nWithinMilliSecs = 50 );
00121
00122 };
00123
00124 #endif