C/C++ Reference
ThreadLib.h
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