00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00039 #ifndef _CLASS_LEVEL_LOCK_H
00040 #define _CLASS_LEVEL_LOCK_H
00041
00042 #include "fast_mutex.h"
00043
00044 # ifdef _NOTHREADS
00045
00049 template <class _Host, bool _RealLock = false>
00050 class class_level_lock
00051 {
00052 public:
00054 class lock
00055 {
00056 public:
00057 lock() {}
00058 };
00059
00060 typedef _Host volatile_type;
00061 };
00062 # else
00063
00070 template <class _Host, bool _RealLock = true>
00071 class class_level_lock
00072 {
00073 static fast_mutex _S_mtx;
00074
00075 public:
00076 class lock;
00077 friend class lock;
00078
00080 class lock
00081 {
00082 lock(const lock&);
00083 lock& operator=(const lock&);
00084 public:
00085 lock()
00086 {
00087 if (_RealLock)
00088 _S_mtx.lock();
00089 }
00090 ~lock()
00091 {
00092 if (_RealLock)
00093 _S_mtx.unlock();
00094 }
00095 };
00096
00097 typedef volatile _Host volatile_type;
00098 };
00099
00100 # if HAVE_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
00101
00102 template <class _Host>
00103 class class_level_lock<_Host, false>
00104 {
00105 public:
00107 class lock
00108 {
00109 public:
00110 lock() {}
00111 };
00112
00113 typedef _Host volatile_type;
00114 };
00115 # endif // HAVE_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
00116
00117 template <class _Host, bool _RealLock>
00118 fast_mutex class_level_lock<_Host, _RealLock>::_S_mtx;
00119 # endif // _NOTHREADS
00120
00121 #endif // _CLASS_LEVEL_LOCK_H