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
00037 #ifndef NVWA_CLASS_LEVEL_LOCK_H
00038 #define NVWA_CLASS_LEVEL_LOCK_H
00039
00040 #include "fast_mutex.h"
00041 #include "_nvwa.h"
00042
00043 #ifndef HAVE_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
00044 #define HAVE_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION 1
00045 #endif
00046
00047 NVWA_NAMESPACE_BEGIN
00048
00049 # ifdef _NOTHREADS
00050
00054 template <class _Host, bool _RealLock = false>
00055 class class_level_lock
00056 {
00057 public:
00059 class lock
00060 {
00061 public:
00062 lock() {}
00063 };
00064
00065 typedef _Host volatile_type;
00066 };
00067 # else
00068
00075 template <class _Host, bool _RealLock = true>
00076 class class_level_lock
00077 {
00078 static fast_mutex _S_mtx;
00079
00080 public:
00081
00082
00083
00084
00085 class lock;
00086 friend class lock;
00087
00089 class lock
00090 {
00091 lock(const lock&);
00092 lock& operator=(const lock&);
00093 public:
00094 lock()
00095 {
00096 if (_RealLock)
00097 _S_mtx.lock();
00098 }
00099 ~lock()
00100 {
00101 if (_RealLock)
00102 _S_mtx.unlock();
00103 }
00104 };
00105
00106 typedef volatile _Host volatile_type;
00107 };
00108
00109 # if HAVE_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
00110
00111 template <class _Host>
00112 class class_level_lock<_Host, false>
00113 {
00114 public:
00116 class lock
00117 {
00118 public:
00119 lock() {}
00120 };
00121
00122 typedef _Host volatile_type;
00123 };
00124 # endif // HAVE_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
00125
00126 template <class _Host, bool _RealLock>
00127 fast_mutex class_level_lock<_Host, _RealLock>::_S_mtx;
00128 # endif // _NOTHREADS
00129
00130 NVWA_NAMESPACE_END
00131
00132 #endif // NVWA_CLASS_LEVEL_LOCK_H