Changed the directory structure.
[progcomp2012.git] / home / progcomp / judge / manager / thread_util.h
diff --git a/home/progcomp/judge/manager/thread_util.h b/home/progcomp/judge/manager/thread_util.h
new file mode 100644 (file)
index 0000000..95a16e0
--- /dev/null
@@ -0,0 +1,115 @@
+#ifndef THREAD_UTIL_H
+#define THREAD_UTIL_H
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <sstream>
+#include <string>
+#include <pthread.h> //Needed for threading
+#include <signal.h> //Needed for killing the threads (why not in pthread.h?)
+
+#include <assert.h>
+
+
+class Thread
+{
+       public:
+               Thread() : finished(false), thread(0),  started(false)
+               {
+                       
+               }
+
+               virtual void Start() = 0;
+       protected:
+               void Start(void* (ThreadFunction)(void*))
+               {
+                       assert(!started);
+                       started = true;
+                       pthread_create(&(thread), NULL, ThreadFunction, (void*)(this));
+                       pthread_setcancelstate(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+               }
+
+       public:
+               void Stop()
+               {
+                       assert(started);
+                       if (!finished)
+                               pthread_cancel(thread);
+                       
+                       pthread_join(thread, NULL);
+                       started = false;
+               }
+
+               virtual ~Thread()
+               {
+                       if (started)
+                               Stop();
+               }
+
+               bool Finished() const {return finished;}
+       protected:
+               
+               bool finished;
+
+       private:
+               pthread_t thread;
+       protected:
+               bool started;
+};
+
+class GetterThread : public Thread
+{
+       public:
+               GetterThread(FILE * newStream, std::string & newBuffer) : Thread(), stream(newStream), buffer(newBuffer)
+               {
+                       
+               }
+
+               virtual ~GetterThread()
+               {
+
+               }
+
+               virtual void Start() {assert(&buffer != NULL); Thread::Start(GetMessage);}
+
+       private:
+               FILE * stream;
+       public:
+               std::string & buffer;
+
+               pthread_t thread;
+               static pthread_mutex_t mutex;
+               static void * GetMessage(void * p);
+
+};
+
+
+class TimerThread : public Thread
+{
+       public:
+               TimerThread(int newCount) : Thread(), count(newCount)
+               {
+                       
+               }
+
+               virtual ~TimerThread()
+               {
+
+               }
+
+               virtual void Start() {Thread::Start(Timeout);}
+
+       private:
+               int count;
+
+               static void * Timeout(void * p);
+
+};
+
+#endif //THREAD_UTIL_H
+
+//EOF
+
+
+

UCC git Repository :: git.ucc.asn.au