00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00053 #ifndef _UCOMMON_THREAD_H_
00054 #define _UCOMMON_THREAD_H_
00055
00056 #ifndef _UCOMMON_CONFIG_H_
00057 #include <ucommon/platform.h>
00058 #endif
00059
00060 #ifndef _UCOMMON_ACCESS_H_
00061 #include <ucommon/access.h>
00062 #endif
00063
00064 #ifndef _UCOMMON_TIMERS_H_
00065 #include <ucommon/timers.h>
00066 #endif
00067
00068 #ifndef _UCOMMON_MEMORY_H_
00069 #include <ucommon/memory.h>
00070 #endif
00071
00072 NAMESPACE_UCOMMON
00073
00074 class SharedPointer;
00075
00086 class __EXPORT Conditional
00087 {
00088 private:
00089 friend class ConditionalAccess;
00090
00091 #ifdef _MSWINDOWS_
00092 enum {SIGNAL = 0, BROADCAST = 1};
00093 HANDLE events[2];
00094 unsigned waiting;
00095 CRITICAL_SECTION mlock;
00096 CRITICAL_SECTION mutex;
00097 #else
00098 #ifndef __PTH__
00099 class __LOCAL attribute
00100 {
00101 public:
00102 pthread_condattr_t attr;
00103 attribute();
00104 };
00105
00106 __LOCAL static attribute attr;
00107 #endif
00108
00109 pthread_cond_t cond;
00110 pthread_mutex_t mutex;
00111 #endif
00112
00113 protected:
00114 friend class TimedEvent;
00115
00121 bool wait(timeout_t timeout);
00122
00128 bool wait(struct timespec *timeout);
00129
00130 #ifdef _MSWINDOWS_
00131 inline void lock(void)
00132 {EnterCriticalSection(&mutex);};
00133
00134 inline void unlock(void)
00135 {LeaveCriticalSection(&mutex);};
00136
00137 void wait(void);
00138 void signal(void);
00139 void broadcast(void);
00140
00141 #else
00142
00145 inline void lock(void)
00146 {pthread_mutex_lock(&mutex);};
00147
00151 inline void unlock(void)
00152 {pthread_mutex_unlock(&mutex);};
00153
00157 inline void wait(void)
00158 {pthread_cond_wait(&cond, &mutex);};
00159
00163 inline void signal(void)
00164 {pthread_cond_signal(&cond);};
00165
00169 inline void broadcast(void)
00170 {pthread_cond_broadcast(&cond);};
00171 #endif
00172
00176 Conditional();
00177
00181 ~Conditional();
00182
00183 public:
00184 #if !defined(_MSWINDOWS_) && !defined(__PTH__)
00185
00190 static inline pthread_condattr_t *initializer(void)
00191 {return &attr.attr;};
00192 #endif
00193
00200 static void gettimeout(timeout_t timeout, struct timespec *hires);
00201 };
00202
00210 class __EXPORT ConditionalAccess : private Conditional
00211 {
00212 private:
00213 #ifndef _MSWINDOWS_
00214 pthread_cond_t bcast;
00215 #endif
00216
00217 protected:
00218 unsigned pending, waiting, sharing;
00219
00225 bool waitSignal(timeout_t timeout);
00226
00232 bool waitBroadcast(timeout_t timeout);
00233
00234
00240 bool waitSignal(struct timespec *timeout);
00241
00247 bool waitBroadcast(struct timespec *timeout);
00248
00255 inline static void gettimeout(timeout_t timeout, struct timespec *hires)
00256 {Conditional::gettimeout(timeout, hires);};
00257
00258
00259 #ifdef _MSWINDOWS_
00260 inline void lock(void)
00261 {EnterCriticalSection(&mutex);};
00262
00263 inline void unlock(void)
00264 {LeaveCriticalSection(&mutex);};
00265
00266 void waitSignal(void);
00267 void waitBroadcast(void);
00268
00269 inline void signal(void)
00270 {Conditional::signal();};
00271
00272 inline void broadcast(void)
00273 {Conditional::broadcast();};
00274
00275 #else
00276
00279 inline void lock(void)
00280 {pthread_mutex_lock(&mutex);};
00281
00285 inline void unlock(void)
00286 {pthread_mutex_unlock(&mutex);};
00287
00291 inline void waitSignal(void)
00292 {pthread_cond_wait(&cond, &mutex);};
00293
00297 inline void waitBroadcast(void)
00298 {pthread_cond_wait(&bcast, &mutex);};
00299
00300
00304 inline void signal(void)
00305 {pthread_cond_signal(&cond);};
00306
00310 inline void broadcast(void)
00311 {pthread_cond_broadcast(&bcast);};
00312 #endif
00313 public:
00317 ConditionalAccess();
00318
00322 ~ConditionalAccess();
00323
00327 void access(void);
00328
00332 void modify(void);
00333
00337 void release(void);
00338
00342 void commit(void);
00343
00350 void limit_sharing(unsigned max);
00351 };
00352
00361 class __EXPORT TimedEvent : public Timer
00362 {
00363 private:
00364 #ifdef _MSWINDOWS_
00365 HANDLE event;
00366 #else
00367 pthread_cond_t cond;
00368 bool signalled;
00369 #endif
00370 pthread_mutex_t mutex;
00371
00372 protected:
00377 void lock(void);
00378
00383 void release(void);
00384
00392 bool sync(void);
00393
00394 public:
00398 TimedEvent(void);
00399
00404 TimedEvent(timeout_t timeout);
00405
00410 TimedEvent(time_t timeout);
00411
00415 ~TimedEvent();
00416
00422 void signal(void);
00423
00430 bool wait(timeout_t timeout);
00431
00435 void reset(void);
00436
00441 inline static void signal(TimedEvent& timed)
00442 {timed.signal();};
00443
00448 inline static void reset(TimedEvent& timed)
00449 {timed.reset();};
00450
00457 inline static bool wait(TimedEvent& timed, timeout_t timeout)
00458 {return timed.wait(timeout);};
00459 };
00460
00468 class __EXPORT rexlock : private Conditional, public Exclusive
00469 {
00470 private:
00471 unsigned waiting;
00472 unsigned lockers;
00473 pthread_t locker;
00474
00475 __LOCAL void Exlock(void);
00476 __LOCAL void Unlock(void);
00477
00478 public:
00482 rexlock();
00483
00487 void lock(void);
00488
00492 void release(void);
00493
00498 unsigned getLocking(void);
00499
00504 unsigned getWaiting(void);
00505
00510 inline static void lock(rexlock& rex)
00511 {rex.lock();};
00512
00517 inline static void release(rexlock& rex)
00518 {rex.release();};
00519 };
00520
00533 class __EXPORT rwlock : private ConditionalAccess, public Exclusive, public Shared
00534 {
00535 private:
00536 unsigned writers;
00537 pthread_t writeid;
00538
00539 __LOCAL void Exlock(void);
00540 __LOCAL void Shlock(void);
00541 __LOCAL void Unlock(void);
00542
00543 public:
00551 class __EXPORT gaurd_reader
00552 {
00553 private:
00554 void *object;
00555
00556 public:
00561 gaurd_reader();
00562
00567 gaurd_reader(void *object);
00568
00572 ~gaurd_reader();
00573
00579 void set(void *object);
00580
00584 void release(void);
00585
00591 inline void operator=(void *pointer)
00592 {set(pointer);};
00593 };
00594
00602 class __EXPORT gaurd_writer
00603 {
00604 private:
00605 void *object;
00606
00607 public:
00612 gaurd_writer();
00613
00618 gaurd_writer(void *object);
00619
00623 ~gaurd_writer();
00624
00630 void set(void *object);
00631
00635 void release(void);
00636
00642 inline void operator=(void *pointer)
00643 {set(pointer);};
00644 };
00645
00649 rwlock();
00650
00656 bool modify(timeout_t timeout = Timer::inf);
00657
00663 bool access(timeout_t timeout = Timer::inf);
00664
00671 static void indexing(unsigned size);
00672
00680 static bool writer(void *object, timeout_t timeout = Timer::inf);
00681
00689 static bool reader(void *object, timeout_t timeout = Timer::inf);
00690
00695 static void release(void *object);
00696
00700 void release(void);
00701
00706 unsigned getAccess(void);
00707
00712 unsigned getModify(void);
00713
00718 unsigned getWaiting(void);
00719
00726 inline static bool modify(rwlock& lock, timeout_t timeout = Timer::inf)
00727 {return lock.modify(timeout);};
00728
00735 inline static bool access(rwlock& lock, timeout_t timeout = Timer::inf)
00736 {return lock.access(timeout);};
00737
00742 inline static void release(rwlock& lock)
00743 {lock.release();};
00744 };
00745
00756 class __EXPORT ReusableAllocator : protected Conditional
00757 {
00758 protected:
00759 ReusableObject *freelist;
00760 unsigned waiting;
00761
00765 ReusableAllocator();
00766
00772 inline ReusableObject *next(ReusableObject *object)
00773 {return object->getNext();};
00774
00779 void release(ReusableObject *object);
00780 };
00781
00792 class __EXPORT ConditionalLock : protected ConditionalAccess, public Shared
00793 {
00794 private:
00795 class Context : public LinkedObject
00796 {
00797 public:
00798 inline Context(LinkedObject **root) : LinkedObject(root) {};
00799
00800 pthread_t thread;
00801 unsigned count;
00802 };
00803
00804 LinkedObject *contexts;
00805
00806 __LOCAL void Shlock(void);
00807 __LOCAL void Unlock(void);
00808 __LOCAL void Exclusive(void);
00809 __LOCAL void Share(void);
00810 __LOCAL Context *getContext(void);
00811
00812 public:
00816 ConditionalLock();
00817
00821 ~ConditionalLock();
00822
00826 void modify(void);
00827
00831 void commit(void);
00832
00836 void access(void);
00837
00841 void release(void);
00842
00847 void exclusive(void);
00848
00852 void share(void);
00853
00857 unsigned getReaders(void);
00858
00862 unsigned getWaiters(void);
00863
00868 inline static void modify(ConditionalLock& lock)
00869 {lock.modify();};
00870
00875 inline static void commit(ConditionalLock& lock)
00876 {lock.commit();};
00877
00882 inline static void release(ConditionalLock& lock)
00883 {lock.release();};
00884
00889 inline static void access(ConditionalLock& lock)
00890 {lock.access();};
00891
00896 inline static void exclusive(ConditionalLock& lock)
00897 {lock.exclusive();};
00898
00903 inline static void share(ConditionalLock& lock)
00904 {lock.share();};
00905 };
00906
00919 class __EXPORT barrier : private Conditional
00920 {
00921 private:
00922 unsigned count;
00923 unsigned waits;
00924
00925 public:
00930 barrier(unsigned count);
00931
00935 ~barrier();
00936
00942 void set(unsigned count);
00943
00947 void wait(void);
00948
00955 bool wait(timeout_t timeout);
00956
00961 inline static void wait(barrier& sync)
00962 {sync.wait();};
00963
00970 inline static bool wait(barrier& sync, timeout_t timeout)
00971 {return sync.wait(timeout);};
00972
00973
00979 inline static void set(barrier& sync, unsigned count)
00980 {sync.set(count);};
00981 };
00982
00991 class __EXPORT semaphore : public Shared, private Conditional
00992 {
00993 private:
00994 unsigned count, waits, used;
00995
00996 __LOCAL void Shlock(void);
00997 __LOCAL void Unlock(void);
00998
00999 public:
01003 semaphore(unsigned count = 0);
01004
01009 void wait(void);
01010
01018 bool wait(timeout_t timeout);
01019
01024 unsigned getCount(void);
01025
01030 unsigned getUsed(void);
01031
01036 void set(unsigned count);
01037
01041 void release(void);
01042
01046 inline void operator++(void)
01047 {wait();};
01048
01052 inline void operator--(void)
01053 {release();};
01054
01059 inline static void wait(semaphore& sync)
01060 {sync.wait();};
01061
01068 inline static bool wait(semaphore& sync, timeout_t timeout)
01069 {return sync.wait(timeout);};
01070
01075 inline static void release(semaphore& sync)
01076 {sync.release();};
01077 };
01078
01092 class __EXPORT mutex : public Exclusive
01093 {
01094 private:
01095 pthread_mutex_t mlock;
01096
01097 __LOCAL void Exlock(void);
01098 __LOCAL void Unlock(void);
01099
01100 public:
01108 class __EXPORT gaurd
01109 {
01110 private:
01111 void *object;
01112
01113 public:
01118 gaurd();
01119
01124 gaurd(void *object);
01125
01129 ~gaurd();
01130
01136 void set(void *object);
01137
01141 void release(void);
01142
01148 inline void operator=(void *pointer)
01149 {set(pointer);};
01150 };
01151
01152
01156 mutex();
01157
01161 ~mutex();
01162
01166 inline void acquire(void)
01167 {pthread_mutex_lock(&mlock);};
01168
01172 inline void lock(void)
01173 {pthread_mutex_lock(&mlock);};
01174
01178 inline void unlock(void)
01179 {pthread_mutex_unlock(&mlock);};
01180
01184 inline void release(void)
01185 {pthread_mutex_unlock(&mlock);};
01186
01191 inline static void acquire(mutex& lock)
01192 {pthread_mutex_lock(&lock.mlock);};
01193
01198 inline static void lock(mutex& lock)
01199 {pthread_mutex_lock(&lock.mlock);};
01200
01205 inline static void unlock(mutex& lock)
01206 {pthread_mutex_unlock(&lock.mlock);};
01207
01212 inline static void release(mutex& lock)
01213 {pthread_mutex_unlock(&lock.mlock);};
01214
01219 inline static void acquire(pthread_mutex_t *lock)
01220 {pthread_mutex_lock(lock);};
01221
01226 inline static void lock(pthread_mutex_t *lock)
01227 {pthread_mutex_lock(lock);};
01228
01233 inline static void unlock(pthread_mutex_t *lock)
01234 {pthread_mutex_unlock(lock);};
01235
01240 inline static void release(pthread_mutex_t *lock)
01241 {pthread_mutex_unlock(lock);};
01242
01249 static void indexing(unsigned size);
01250
01256 static void protect(void *pointer);
01257
01262 static void release(void *pointer);
01263 };
01264
01273 class __EXPORT auto_protect
01274 {
01275 private:
01276
01277 inline auto_protect(const auto_pointer &pointer) {};
01278
01279 protected:
01280 void *object;
01281
01282 auto_protect();
01283
01284 public:
01289 auto_protect(void *object);
01290
01295 ~auto_protect();
01296
01300 void release(void);
01301
01306 inline bool operator!() const
01307 {return object == NULL;};
01308
01313 inline operator bool() const
01314 {return object != NULL;};
01315
01322 void operator=(void *object);
01323 };
01324
01336 class __EXPORT LockedPointer
01337 {
01338 private:
01339 friend class locked_release;
01340 pthread_mutex_t mutex;
01341 Object *pointer;
01342
01343 protected:
01347 LockedPointer();
01348
01353 void replace(Object *object);
01354
01359 Object *dup(void);
01360
01365 inline void operator=(Object *object)
01366 {replace(object);};
01367 };
01368
01377 class __EXPORT SharedObject
01378 {
01379 protected:
01380 friend class SharedPointer;
01381
01390 virtual void commit(SharedPointer *pointer);
01391
01392 public:
01396 virtual ~SharedObject();
01397 };
01398
01409 class __EXPORT SharedPointer : protected ConditionalAccess
01410 {
01411 private:
01412 friend class shared_release;
01413 SharedObject *pointer;
01414
01415 protected:
01419 SharedPointer();
01420
01424 ~SharedPointer();
01425
01432 void replace(SharedObject *object);
01433
01440 SharedObject *share(void);
01441 };
01442
01453 class __EXPORT Thread
01454 {
01455 protected:
01456 pthread_t tid;
01457 size_t stack;
01458 int priority;
01459
01465 Thread(size_t stack = 0);
01466
01467 public:
01474 void setPriority(void);
01475
01480 static void yield(void);
01481
01486 static void sleep(timeout_t timeout);
01487
01491 virtual void run(void) = 0;
01492
01496 virtual ~Thread();
01497
01506 virtual void exit(void);
01507
01511 static void init(void);
01512
01518 static void policy(int polid);
01519
01524 static void concurrency(int level);
01525
01532 static bool equal(pthread_t thread1, pthread_t thread2);
01533
01538 #ifdef __PTH__
01539 inline static pthread_t self(void)
01540 {return pth_self();};
01541 #else
01542 inline static pthread_t self(void)
01543 {return pthread_self();};
01544 #endif
01545 };
01546
01557 class __EXPORT JoinableThread : protected Thread
01558 {
01559 private:
01560 #ifdef _MSWINDOWS_
01561 HANDLE joining;
01562 #else
01563 volatile bool running;
01564 #endif
01565
01566 protected:
01571 JoinableThread(size_t size = 0);
01572
01577 virtual ~JoinableThread();
01578
01584 void join(void);
01585
01586 public:
01587 #ifdef _MSWINDOWS_
01588 inline bool isRunning(void)
01589 {return (joining != INVALID_HANDLE_VALUE);};
01590 #else
01591
01595 inline bool isRunning(void)
01596 {return running;};
01597 #endif
01598
01607 void start(int priority = 0);
01608
01613 inline void background(void)
01614 {start(-1);};
01615 };
01616
01624 class __EXPORT DetachedThread : protected Thread
01625 {
01626 protected:
01631 DetachedThread(size_t size = 0);
01632
01638 ~DetachedThread();
01639
01648 void exit(void);
01649
01650 public:
01657 void start(int priority = 0);
01658 };
01659
01670 class __EXPORT queue : protected OrderedIndex, protected Conditional
01671 {
01672 private:
01673 mempager *pager;
01674 LinkedObject *freelist;
01675 size_t used;
01676
01677 class __LOCAL member : public OrderedObject
01678 {
01679 public:
01680 member(queue *q, Object *obj);
01681 Object *object;
01682 };
01683
01684 friend class member;
01685
01686 protected:
01687 size_t limit;
01688
01689 public:
01697 queue(mempager *pager = NULL, size_t number = 0);
01698
01702 ~queue();
01703
01711 bool remove(Object *object);
01712
01721 bool post(Object *object, timeout_t timeout = 0);
01722
01730 Object *fifo(timeout_t timeout = 0);
01731
01739 Object *lifo(timeout_t timeout = 0);
01740
01745 size_t getCount(void);
01746
01753 static bool remove(queue& queue, Object *object)
01754 {return queue.remove(object);};
01755
01763 static bool post(queue& queue, Object *object, timeout_t timeout = 0)
01764 {return queue.post(object, timeout);};
01765
01772 static Object *fifo(queue& queue, timeout_t timeout = 0)
01773 {return queue.fifo(timeout);};
01774
01781 static Object *lifo(queue& queue, timeout_t timeout = 0)
01782 {return queue.lifo(timeout);};
01783
01789 static size_t count(queue& queue)
01790 {return queue.getCount();};
01791 };
01792
01801 class __EXPORT stack : protected Conditional
01802 {
01803 private:
01804 LinkedObject *freelist, *usedlist;
01805 mempager *pager;
01806 size_t used;
01807
01808 class __LOCAL member : public LinkedObject
01809 {
01810 public:
01811 member(stack *s, Object *obj);
01812 Object *object;
01813 };
01814
01815 friend class member;
01816
01817 protected:
01818 size_t limit;
01819
01820 public:
01827 stack(mempager *pager = NULL, size_t number = 0);
01828
01832 ~stack();
01833
01841 bool remove(Object *object);
01842
01851 bool push(Object *object, timeout_t timeout = 0);
01852
01860 Object *pull(timeout_t timeout = 0);
01861
01866 size_t getCount(void);
01867
01874 static inline bool remove(stack& stack, Object *object)
01875 {return stack.remove(object);};
01876
01884 static inline bool push(stack& stack, Object *object, timeout_t timeout = 0)
01885 {return stack.push(object, timeout);};
01886
01893 static inline Object *pull(stack& stack, timeout_t timeout = 0)
01894 {return stack.pull(timeout);};
01895
01901 static inline size_t count(stack& stack)
01902 {return stack.getCount();};
01903 };
01904
01914 class __EXPORT Buffer : protected Conditional
01915 {
01916 private:
01917 size_t size, objsize;
01918 caddr_t buf, head, tail;
01919 unsigned count, limit;
01920
01921 public:
01927 Buffer(size_t size, size_t count);
01928
01932 virtual ~Buffer();
01933
01938 unsigned getSize(void);
01939
01944 unsigned getCount(void);
01945
01951 void *get(timeout_t timeout);
01952
01958 void *get(void);
01959
01965 void put(void *data);
01966
01973 bool put(void *data, timeout_t timeout);
01974
01981 void release(void);
01982
01988 void copy(void *data);
01989
01996 bool copy(void *data, timeout_t timeout);
01997
02002 operator bool();
02003
02008 bool operator!();
02009 };
02010
02019 class __EXPORT locked_release
02020 {
02021 protected:
02022 Object *object;
02027 locked_release();
02028
02034 locked_release(const locked_release &object);
02035
02036 public:
02042 locked_release(LockedPointer &pointer);
02043
02048 ~locked_release();
02049
02053 void release(void);
02054
02060 locked_release &operator=(LockedPointer &pointer);
02061 };
02062
02072 class __EXPORT shared_release
02073 {
02074 protected:
02075 SharedPointer *ptr;
02080 shared_release();
02081
02087 shared_release(const shared_release &object);
02088
02089 public:
02094 shared_release(SharedPointer &pointer);
02095
02101 ~shared_release();
02102
02106 void release(void);
02107
02112 SharedObject *get(void);
02113
02119 shared_release &operator=(SharedPointer &pointer);
02120 };
02121
02129 template<class T>
02130 class queueof : public queue
02131 {
02132 public:
02138 inline queueof(mempager *memory, size_t size = 0) : queue(memory, size) {};
02139
02147 inline bool remove(T *object)
02148 {return queue::remove(object);};
02149
02158 inline bool post(T *object, timeout_t timeout = 0)
02159 {return queue::post(object);};
02160
02168 inline T *fifo(timeout_t timeout = 0)
02169 {return static_cast<T *>(queue::fifo(timeout));};
02170
02178 inline T *lifo(timeout_t timeout = 0)
02179 {return static_cast<T *>(queue::lifo(timeout));};
02180 };
02181
02189 template<class T>
02190 class stackof : public stack
02191 {
02192 public:
02198 inline stackof(mempager *memory, size_t size = 0) : stack(memory, size) {};
02199
02207 inline bool remove(T *object)
02208 {return stack::remove(object);};
02209
02218 inline bool push(T *object, timeout_t timeout = 0)
02219 {return stack::push(object);};
02220
02228 inline T *pull(timeout_t timeout = 0)
02229 {return static_cast<T *>(stack::pull(timeout));};
02230 };
02231
02243 template<class T>
02244 class bufferof : public Buffer
02245 {
02246 public:
02251 inline bufferof(unsigned count) :
02252 Buffer(sizeof(T), count) {};
02253
02259 inline T *get(void)
02260 {return static_cast<T*>(get());};
02261
02267 inline T *get(timeout_t timeout)
02268 {return static_cast<T*>(get(timeout));};
02269
02275 inline void put(T *object)
02276 {put(object);};
02277
02284 inline bool put(T *object, timeout_t timeout)
02285 {return put(object, timeout);};
02286
02292 inline void copy(T *object)
02293 {copy(object);};
02294
02301 inline bool get(T *object, timeout_t timeout)
02302 {return copy(object, timeout);};
02303 };
02304
02312 template<class T>
02313 class shared_pointer : public SharedPointer
02314 {
02315 public:
02319 inline shared_pointer() : SharedPointer() {};
02320
02328 inline const T *dup(void)
02329 {return static_cast<const T*>(SharedPointer::share());};
02330
02337 inline void replace(T *object)
02338 {SharedPointer::replace(object);};
02339
02344 inline void operator=(T *object)
02345 {replace(object);};
02346
02351 inline T *operator*()
02352 {return dup();};
02353 };
02354
02362 template<class T>
02363 class locked_pointer : public LockedPointer
02364 {
02365 public:
02369 inline locked_pointer() : LockedPointer() {};
02370
02376 inline T* dup(void)
02377 {return static_cast<T *>(LockedPointer::dup());};
02378
02383 inline void replace(T *object)
02384 {LockedPointer::replace(object);};
02385
02390 inline void operator=(T *object)
02391 {replace(object);};
02392
02398 inline T *operator*()
02399 {return dup();};
02400 };
02401
02407 template<class T>
02408 class locked_instance : public locked_release
02409 {
02410 public:
02414 inline locked_instance() : locked_release() {};
02415
02420 inline locked_instance(locked_pointer<T> &pointer) : locked_release(pointer) {};
02421
02426 inline T& operator*() const
02427 {return *(static_cast<T *>(object));};
02428
02433 inline T* operator->() const
02434 {return static_cast<T*>(object);};
02435
02440 inline T* get(void) const
02441 {return static_cast<T*>(object);};
02442 };
02443
02449 template<class T>
02450 class shared_instance : public shared_release
02451 {
02452 public:
02456 inline shared_instance() : shared_release() {};
02457
02463 inline shared_instance(shared_pointer<T> &pointer) : shared_release(pointer) {};
02464
02468 inline const T& operator*() const
02469 {return *(static_cast<const T *>(ptr->pointer));};
02470
02475 inline const T* operator->() const
02476 {return static_cast<const T*>(ptr->pointer);};
02477
02482 inline const T* get(void) const
02483 {return static_cast<const T*>(ptr->pointer);};
02484 };
02485
02492 template <class T>
02493 class mutex_pointer : public auto_protect
02494 {
02495 public:
02499 inline mutex_pointer() : auto_protect() {};
02500
02505 inline mutex_pointer(T* object) : auto_protect(object) {};
02506
02511 inline T& operator*() const
02512 {return *(static_cast<T*>(auto_protect::object));};
02513
02518 inline T* operator->() const
02519 {return static_cast<T*>(auto_protect::object);};
02520
02525 inline T* get(void) const
02526 {return static_cast<T*>(auto_protect::object);};
02527 };
02528
02534 inline void start(JoinableThread *thread, int priority = 0)
02535 {thread->start(priority);}
02536
02542 inline void start(DetachedThread *thread, int priority = 0)
02543 {thread->start(priority);}
02544
02548 typedef ConditionalLock condlock_t;
02549
02553 typedef ConditionalAccess accesslock_t;
02554
02558 typedef TimedEvent timedevent_t;
02559
02563 typedef mutex mutex_t;
02564
02569 typedef mutex Mutex;
02570
02574 typedef rwlock rwlock_t;
02575
02579 typedef rexlock rexlock_t;
02580
02584 typedef semaphore semaphore_t;
02585
02589 typedef barrier barrier_t;
02590
02594 typedef stack stack_t;
02595
02599 typedef queue fifo_t;
02600
02605 inline void wait(barrier_t &barrier)
02606 {barrier.wait();}
02607
02613 inline void wait(semaphore_t &semaphore, timeout_t timeout = Timer::inf)
02614 {semaphore.wait(timeout);}
02615
02620 inline void release(semaphore_t &semaphore)
02621 {semaphore.release();}
02622
02627 inline void acquire(mutex_t &mutex)
02628 {mutex.lock();}
02629
02634 inline void release(mutex_t &mutex)
02635 {mutex.release();}
02636
02641 inline void modify(accesslock_t &lock)
02642 {lock.modify();}
02643
02648 inline void access(accesslock_t &lock)
02649 {lock.access();}
02650
02655 inline void release(accesslock_t &lock)
02656 {lock.release();}
02657
02663 inline void commit(accesslock_t &lock)
02664 {lock.commit();}
02665
02670 inline void exclusive(condlock_t &lock)
02671 {lock.exclusive();}
02672
02677 inline void share(condlock_t &lock)
02678 {lock.share();}
02679
02684 inline void modify(condlock_t &lock)
02685 {lock.modify();}
02686
02692 inline void commit(condlock_t &lock)
02693 {lock.commit();}
02694
02699 inline void access(condlock_t &lock)
02700 {lock.access();}
02701
02706 inline void release(condlock_t &lock)
02707 {lock.release();}
02708
02714 inline bool exclusive(rwlock_t &lock, timeout_t timeout = Timer::inf)
02715 {return lock.modify(timeout);}
02716
02722 inline bool share(rwlock_t &lock, timeout_t timeout = Timer::inf)
02723 {return lock.access(timeout);}
02724
02729 inline void release(rwlock_t &lock)
02730 {lock.release();}
02731
02736 inline void lock(rexlock_t &lock)
02737 {lock.lock();}
02738
02743 inline void release(rexlock_t &lock)
02744 {lock.release();}
02745
02751 inline void push(stack_t &stack, Object *object)
02752 {stack.push(object);}
02753
02760 inline Object *pull(stack_t &stack, timeout_t timeout = Timer::inf)
02761 {return stack.pull(timeout);}
02762
02768 inline void remove(stack_t &stack, Object *object)
02769 {stack.remove(object);}
02770
02776 inline void push(fifo_t &fifo, Object *object)
02777 {fifo.post(object);}
02778
02785 inline Object *pull(fifo_t &fifo, timeout_t timeout = Timer::inf)
02786 {return fifo.fifo(timeout);}
02787
02793 inline void remove(fifo_t &fifo, Object *object)
02794 {fifo.remove(object);}
02795
02796 END_NAMESPACE
02797
02798 #define ENTER_EXCLUSIVE \
02799 do { static pthread_mutex_t __sync__ = PTHREAD_MUTEX_INITIALIZER; \
02800 pthread_mutex_lock(&__sync__);
02801
02802 #define LEAVE_EXCLUSIVE \
02803 pthread_mutex_unlock(&__sync__);} while(0);
02804
02805 #endif