|
C/C++ Reference
|
00001 /* 00002 * ____ _________ __ _ 00003 * / __ \___ ____ _/ /_ __(_)___ ___ ___ / / ____ ____ _(_)____ 00004 * / /_/ / _ \/ __ `/ / / / / / __ `__ \/ _ \/ / / __ \/ __ `/ / ___/ 00005 * / _, _/ __/ /_/ / / / / / / / / / / / __/ /___/ /_/ / /_/ / / /__ 00006 * /_/ |_|\___/\__,_/_/ /_/ /_/_/ /_/ /_/\___/_____/\____/\__, /_/\___/ 00007 * /____/ 00008 * 00009 * Barracuda Embedded Web-Server 00010 * 00011 **************************************************************************** 00012 * HEADER 00013 * 00014 * $Id: ThreadLib.h 1282 2008-10-09 03:01:44Z wini $ 00015 * 00016 * COPYRIGHT: Real Time Logic LLC, 2004 - 2008 00017 * http://www.realtimelogic.com 00018 */ 00019 00020 #ifndef ThreadLib_hpp 00021 00022 #include <HttpCfg.h> 00023 00040 typedef enum { 00041 ThreadPrioLowest, 00042 ThreadPrioLow, 00043 ThreadPrioNormal, 00044 ThreadPrioHigh, 00045 ThreadPrioHighest 00046 } ThreadPriority; 00047 00048 00049 #ifndef __DOXYGEN__ 00050 struct HttpRequest; 00051 struct ThreadMutex; 00052 struct Thread; 00053 #endif 00054 00057 typedef void (*Thread_Run)(struct Thread* th); 00058 00059 #ifdef __cplusplus 00060 extern "C" { 00061 #else 00062 struct ThreadReleaseLock; 00063 #endif 00064 00065 BA_API void ThreadReleaseLock_internalConstructor( 00066 struct ThreadReleaseLock* o, struct HttpRequest* req); 00067 00068 #ifdef __cplusplus 00069 } 00070 #endif 00071 00072 00073 00074 00075 #if defined(__cplusplus) 00076 00077 #ifndef __DOXYGEN__ 00078 struct ThreadReleaseLock; 00079 #endif 00080 00097 struct ThreadLock 00098 { 00100 ThreadLock(ThreadMutex& m); 00101 00103 ThreadLock(ThreadMutex* m); 00104 00106 ~ThreadLock(); 00107 private: 00108 friend struct ThreadReleaseLock; 00109 struct ThreadMutex* mutex; 00110 }; 00111 00112 00133 struct ThreadReleaseLock 00134 { 00136 ThreadReleaseLock(struct HttpRequest* req); 00138 ThreadReleaseLock(ThreadMutex& m); 00140 ThreadReleaseLock(ThreadMutex* m); 00142 ThreadReleaseLock(ThreadLock& tl); 00144 ThreadReleaseLock(ThreadLock* tl); 00146 ~ThreadReleaseLock(); 00147 private: 00148 struct ThreadMutex* mutex; 00149 }; 00150 00151 00152 #else 00153 #define ThreadMutexBase ThreadMutex 00154 #define ThreadSemaphoreBase ThreadSemaphore 00155 #define ThreadBase Thread 00156 #endif 00157 00158 00159 #include "ThreadLibArch.h" 00160 00161 #if defined(__cplusplus) 00162 00167 struct ThreadMutex : public ThreadMutexBase 00168 { 00169 void *operator new(size_t s) { return ::baMalloc(s); } 00170 void operator delete(void* d) { if(d) ::baFree(d); } 00171 void *operator new(size_t, void *place) { return place; } 00172 void operator delete(void*, void *) { } 00173 00175 ThreadMutex() { ThreadMutex_constructor(this); } 00177 ~ThreadMutex() { ThreadMutex_destructor(this); } 00179 void set() { ThreadMutex_set(this); } 00181 void release() { ThreadMutex_release(this); } 00185 bool isOwner() { return ThreadMutex_isOwner(this)?true:false; } 00186 }; 00187 00194 struct ThreadSemaphore : public ThreadSemaphoreBase 00195 { 00196 void *operator new(size_t s) { return ::baMalloc(s); } 00197 void operator delete(void* d) { if(d) ::baFree(d); } 00198 void *operator new(size_t, void *place) { return place; } 00199 void operator delete(void*, void *) { } 00200 00203 ThreadSemaphore(){ ThreadSemaphore_constructor(this); } 00206 ~ThreadSemaphore(void) { ThreadSemaphore_destructor(this); } 00207 00210 void wait() { ThreadSemaphore_wait(this); } 00211 00214 void signal() { ThreadSemaphore_signal(this); } 00215 }; 00216 00217 00222 struct Thread : public ThreadBase 00223 { 00224 Thread() {} 00225 void *operator new(size_t s) { return ::baMalloc(s); } 00226 void operator delete(void* d) { if(d) ::baFree(d); } 00227 void *operator new(size_t, void *place) { return place; } 00228 void operator delete(void*, void *) { } 00229 00235 Thread(Thread_Run r, ThreadPriority priority, int stackSize) { 00236 Thread_constructor(this, r, priority, stackSize); } 00237 ~Thread() { Thread_destructor(this); } 00240 void start() { Thread_start(this); } 00241 00244 static void sleep(unsigned int milliseconds) { 00245 Thread_sleep(milliseconds); } 00246 }; 00247 00248 inline ThreadLock::ThreadLock(ThreadMutex& m) : mutex(&m) { mutex->set(); } 00249 inline ThreadLock::ThreadLock(ThreadMutex* m) : mutex(m) { mutex->set(); } 00250 inline ThreadLock::~ThreadLock() { mutex->release(); } 00251 00252 inline ThreadReleaseLock::ThreadReleaseLock(struct HttpRequest* req) { 00253 ThreadReleaseLock_internalConstructor(this, req); 00254 } 00255 inline ThreadReleaseLock::ThreadReleaseLock(ThreadMutex& m) : 00256 mutex(&m) { mutex->release(); } 00257 inline ThreadReleaseLock::ThreadReleaseLock(ThreadMutex* m) : 00258 mutex(m) { mutex->release(); } 00259 inline ThreadReleaseLock::ThreadReleaseLock(ThreadLock& tl) : 00260 mutex(tl.mutex) { mutex->release(); } 00261 inline ThreadReleaseLock::ThreadReleaseLock(ThreadLock* tl) : 00262 mutex(tl->mutex) { mutex->release(); } 00263 inline ThreadReleaseLock::~ThreadReleaseLock() { mutex->set(); } 00264 00265 #endif 00266 /* end of ThreadLib group */ 00268 00269 #endif