00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSUTIL_THREADING_WIN32_THREAD_H__
00020 #define __CS_CSUTIL_THREADING_WIN32_THREAD_H__
00021
00022 #include "csutil/sysfunc.h"
00023
00024 #include "csutil/threading/barrier.h"
00025
00026 #if !defined(CS_PLATFORM_WIN32)
00027 #error "This file is only for Windows and requires you to include csysdefs.h before"
00028 #else
00029
00030 namespace CS
00031 {
00032 namespace Threading
00033 {
00034
00035 enum ThreadPriority;
00036 class Runnable;
00037
00038 namespace Implementation
00039 {
00040 class ThreadLocalBase;
00041
00042
00043 class CS_CRYSTALSPACE_EXPORT ThreadBase : public CS::Utility::AtomicRefCount
00044 {
00045 public:
00046 ThreadBase (Runnable* runnable);
00047
00048 ~ThreadBase ();
00049
00050 void Start ();
00051
00052 void Stop ();
00053
00054 bool IsRunning () const;
00055
00056 bool SetPriority (ThreadPriority prio);
00057
00058 void Wait () const;
00059
00060 static void Yield ()
00061 {
00062 csSleep (0);
00063 }
00064
00065 static CS::Threading::ThreadID GetThreadID ();
00066
00067 ThreadPriority GetPriority () const
00068 {
00069 return priority;
00070 }
00071
00072 protected:
00073 friend class ThreadLocalBase;
00074
00075
00076 static void RegisterTlsInstance (ThreadLocalBase* tls);
00077 static void UnregisterTlsInstance (ThreadLocalBase* tls);
00078 static void CleanupAllTlsInstances ();
00079 private:
00080 csRef<Runnable> runnable;
00081
00082 mutable void* threadHandle;
00083 uint threadId;
00084
00085 int32 isRunning;
00086 ThreadPriority priority;
00087 Barrier startupBarrier;
00088
00089 static unsigned int __stdcall proxyFunc (void* param);
00090 };
00091
00092
00093 }
00094 }
00095 }
00096
00097 #endif // !defined(CS_PLATFORM_WIN32)
00098
00099 #endif // __CS_CSUTIL_THREADING_WIN32_THREAD_H__