00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __THREAD_H
00025 #define __THREAD_H
00026
00027 #if !defined(_REENTRANT)
00028 # define _REENTRANT
00029 #endif
00030 #include <pthread.h>
00031
00032 #include <stlib/Object.h>
00033 #include <stlib/Array.h>
00034 #include <stlib/Set.h>
00035 #include <stlib/String.h>
00036
00037 #include <stlib/Callback0.h>
00038 #include <stlib/Callback1.h>
00039
00043 namespace OS {
00044
00048 class Thread : public Core::Object
00049 {
00050 protected:
00051 Callback<void> *_receiver;
00052 Array *_arguments;
00053
00054 pthread_t hThread;
00055 pthread_cond_t runCond;
00056 pthread_mutex_t mutVar;
00057 bool runningThread;
00058
00059 static Set threads;
00060
00061 public:
00062 Thread(Callback<void> *receiver);
00063 virtual ~Thread(void);
00064
00065 private:
00070 static void *threadProc(void *);
00071
00072 public:
00073
00074 virtual String *className(void) const;
00075
00076
00078 static Thread *fork(Callback<void> *receiver);
00083 static Thread *fork(Callback<void> *receiver, Array *arguments);
00084
00099 template <class TReceiver>
00100 static Thread *fork(TReceiver *receiver, void (TReceiver::*execFunc)(void))
00101 {
00102 Callback0<TReceiver,void> *callback;
00103 callback = new Callback0<TReceiver,void>(receiver, execFunc);
00104 return fork(callback);
00105 }
00106
00122 template <class TReceiver>
00123 static Thread *fork(TReceiver *receiver, void (TReceiver::*execFunc)(Array *),
00124 Array *args)
00125 {
00126 Callback1<TReceiver,void,Array*> *callback;
00127 callback = new Callback1<TReceiver,void,Array*>(receiver, execFunc);
00128 return fork(callback, args);
00129 }
00130
00131
00132 static void finalizeThreads(void);
00133
00134
00135 virtual void arguments(Array *);
00136
00137 virtual void resume(void);
00138 virtual void run(void);
00139 virtual void finalize(void);
00140 virtual void suspend(void);
00141 virtual void terminate(void);
00142 virtual void yield(void);
00143
00144
00145 virtual bool isRunning(void);
00146 };
00147
00148 };
00149
00150 #endif