00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef ARCHON_UTILITIES_JOB_H
00021 #define ARCHON_UTILITIES_JOB_H
00022
00023 #include <string>
00024 #include <queue>
00025 #include <list>
00026 #include <deque>
00027
00028 #include <archon/util/thread.H>
00029
00030 namespace Archon
00031 {
00032 namespace Utilities
00033 {
00034 using namespace std;
00035
00039 struct Job: virtual RefObjectBase
00040 {
00041 Job(): thread(0) {}
00042
00043 virtual ~Job() {}
00044
00045 virtual void main() = 0;
00046
00050 struct Queue
00051 {
00052 Queue(int maxThreads = 8, Time maxIdleTime = Time(10.0));
00053
00057 ~Queue();
00058
00059 void add(Ref<Job>);
00060
00065 void cancel(Ref<Job>);
00066
00070 void wait();
00071
00072 private:
00073 const int maxThreads;
00074 const Time maxIdleTime;
00075
00076 Mutex mutex;
00077 Condition newJob;
00078 Condition threadQuit;
00079 Condition allDone;
00080
00081 unsigned long nextThreadId;
00082 list<Ref<Job> > pendingJobs;
00083 list<unsigned long> idleThreads;
00084 int activeThreads;
00085 bool shutdown;
00086
00087 void worker();
00088 static void workerEntry(Queue *);
00089 };
00090
00091 private:
00092 Thread *thread;
00093 };
00094 }
00095 }
00096
00097 #endif // ARCHON_UTILITIES_JOB_H