Marine Library  1.0
C++ library for Linux Networking Development
lock_int.hh
1 #ifndef DOZERG_LOCK_INT_H_20070916
2 #define DOZERG_LOCK_INT_H_20070916
3 
4 /*
5  提供加锁保护的整数类型模板 CLockInt 提供加锁的整数类型 CLockIntMax 有统计最大值功能的加锁整数类型 CLockIntMinMax 有统计最小/最大值功能的加锁整数类型 History 20070925 把pthread_mutex_t改成CMutex 20080509 使用guard_type;加入CLockIntRange 20080920 使用模板参数决定锁类型 20130612 重写,去掉CLockIntRange,增加CLockIntMinMax //*/ #include "impl/lock_int_impl.hh" NS_SERVER_BEGIN template<typename T, class LockT = CSpinLock> class CLockInt : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > __MyBase; typedef CLockInt<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockInt(value_type c = value_type()):__MyBase(c){} CLockInt(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } }; template<typename T, class LockT = CSpinLock> class CLockIntMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > __MyBase; typedef CLockIntMax<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockIntMax(value_type c = value_type()):__MyBase(c){} CLockIntMax(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } value_type max() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.m_; } //重置max值,返回之前的max值 value_type resetMax() volatile{ typename __MyBase::guard_type g(__MyBase::lock_); value_type ret = __MyBase::e_.m_; __MyBase::e_.m_ = __MyBase::v_; return ret; } }; template<typename T, class LockT = CSpinLock> class CLockIntMinMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > __MyBase; typedef CLockIntMinMax<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockIntMinMax(value_type c = value_type()):__MyBase(c){} CLockIntMinMax(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } value_type min() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.mi_; } value_type max() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.ma_; } //重置min, max值 //oldMin: 返回之前的min值 //oldMax: 返回之前的max值 void resetMinMax(value_type * oldMin, value_type * oldMax) volatile{ typename __MyBase::guard_type g(__MyBase::lock_); if(oldMin) *oldMin = __MyBase::e_.mi_; if(oldMax) *oldMax = __MyBase::e_.ma_; __MyBase::e_.mi_ = __MyBase::e_.ma_ = __MyBase::v_; } }; NS_SERVER_END #endif
6  CLockInt 提供加锁的整数类型 CLockIntMax 有统计最大值功能的加锁整数类型 CLockIntMinMax 有统计最小/最大值功能的加锁整数类型 History 20070925 把pthread_mutex_t改成CMutex 20080509 使用guard_type;加入CLockIntRange 20080920 使用模板参数决定锁类型 20130612 重写,去掉CLockIntRange,增加CLockIntMinMax //*/ #include "impl/lock_int_impl.hh" NS_SERVER_BEGIN template<typename T, class LockT = CSpinLock> class CLockInt : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > __MyBase; typedef CLockInt<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockInt(value_type c = value_type()):__MyBase(c){} CLockInt(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } }; template<typename T, class LockT = CSpinLock> class CLockIntMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > __MyBase; typedef CLockIntMax<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockIntMax(value_type c = value_type()):__MyBase(c){} CLockIntMax(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } value_type max() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.m_; } //重置max值,返回之前的max值 value_type resetMax() volatile{ typename __MyBase::guard_type g(__MyBase::lock_); value_type ret = __MyBase::e_.m_; __MyBase::e_.m_ = __MyBase::v_; return ret; } }; template<typename T, class LockT = CSpinLock> class CLockIntMinMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > __MyBase; typedef CLockIntMinMax<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockIntMinMax(value_type c = value_type()):__MyBase(c){} CLockIntMinMax(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } value_type min() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.mi_; } value_type max() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.ma_; } //重置min, max值 //oldMin: 返回之前的min值 //oldMax: 返回之前的max值 void resetMinMax(value_type * oldMin, value_type * oldMax) volatile{ typename __MyBase::guard_type g(__MyBase::lock_); if(oldMin) *oldMin = __MyBase::e_.mi_; if(oldMax) *oldMax = __MyBase::e_.ma_; __MyBase::e_.mi_ = __MyBase::e_.ma_ = __MyBase::v_; } }; NS_SERVER_END #endif
7  CLockIntMax 有统计最大值功能的加锁整数类型 CLockIntMinMax 有统计最小/最大值功能的加锁整数类型 History 20070925 把pthread_mutex_t改成CMutex 20080509 使用guard_type;加入CLockIntRange 20080920 使用模板参数决定锁类型 20130612 重写,去掉CLockIntRange,增加CLockIntMinMax //*/ #include "impl/lock_int_impl.hh" NS_SERVER_BEGIN template<typename T, class LockT = CSpinLock> class CLockInt : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > __MyBase; typedef CLockInt<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockInt(value_type c = value_type()):__MyBase(c){} CLockInt(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } }; template<typename T, class LockT = CSpinLock> class CLockIntMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > __MyBase; typedef CLockIntMax<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockIntMax(value_type c = value_type()):__MyBase(c){} CLockIntMax(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } value_type max() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.m_; } //重置max值,返回之前的max值 value_type resetMax() volatile{ typename __MyBase::guard_type g(__MyBase::lock_); value_type ret = __MyBase::e_.m_; __MyBase::e_.m_ = __MyBase::v_; return ret; } }; template<typename T, class LockT = CSpinLock> class CLockIntMinMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > __MyBase; typedef CLockIntMinMax<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockIntMinMax(value_type c = value_type()):__MyBase(c){} CLockIntMinMax(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } value_type min() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.mi_; } value_type max() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.ma_; } //重置min, max值 //oldMin: 返回之前的min值 //oldMax: 返回之前的max值 void resetMinMax(value_type * oldMin, value_type * oldMax) volatile{ typename __MyBase::guard_type g(__MyBase::lock_); if(oldMin) *oldMin = __MyBase::e_.mi_; if(oldMax) *oldMax = __MyBase::e_.ma_; __MyBase::e_.mi_ = __MyBase::e_.ma_ = __MyBase::v_; } }; NS_SERVER_END #endif
8  CLockIntMinMax 有统计最小/最大值功能的加锁整数类型 History 20070925 把pthread_mutex_t改成CMutex 20080509 使用guard_type;加入CLockIntRange 20080920 使用模板参数决定锁类型 20130612 重写,去掉CLockIntRange,增加CLockIntMinMax //*/ #include "impl/lock_int_impl.hh" NS_SERVER_BEGIN template<typename T, class LockT = CSpinLock> class CLockInt : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > __MyBase; typedef CLockInt<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockInt(value_type c = value_type()):__MyBase(c){} CLockInt(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } }; template<typename T, class LockT = CSpinLock> class CLockIntMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > __MyBase; typedef CLockIntMax<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockIntMax(value_type c = value_type()):__MyBase(c){} CLockIntMax(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } value_type max() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.m_; } //重置max值,返回之前的max值 value_type resetMax() volatile{ typename __MyBase::guard_type g(__MyBase::lock_); value_type ret = __MyBase::e_.m_; __MyBase::e_.m_ = __MyBase::v_; return ret; } }; template<typename T, class LockT = CSpinLock> class CLockIntMinMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > { typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > __MyBase; typedef CLockIntMinMax<T, LockT> __Myt; public: typedef typename __MyBase::value_type value_type; explicit CLockIntMinMax(value_type c = value_type()):__MyBase(c){} CLockIntMinMax(const __Myt & c):__MyBase(c.load()){} value_type operator =(value_type c) volatile{ __MyBase::operator =(c); return *this; } value_type min() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.mi_; } value_type max() const volatile{ typename __MyBase::guard_type g(__MyBase::lock_); return __MyBase::e_.ma_; } //重置min, max值 //oldMin: 返回之前的min值 //oldMax: 返回之前的max值 void resetMinMax(value_type * oldMin, value_type * oldMax) volatile{ typename __MyBase::guard_type g(__MyBase::lock_); if(oldMin) *oldMin = __MyBase::e_.mi_; if(oldMax) *oldMax = __MyBase::e_.ma_; __MyBase::e_.mi_ = __MyBase::e_.ma_ = __MyBase::v_; } }; NS_SERVER_END #endif
9  History
10  20070925 把pthread_mutex_t改成CMutex
11  20080509 使用guard_type;加入CLockIntRange
12  20080920 使用模板参数决定锁类型
13  20130612 重写,去掉CLockIntRange,增加CLockIntMinMax
14 //*/
15 
16 #include "impl/lock_int_impl.hh"
17 
18 NS_SERVER_BEGIN
19 
20 template<typename T, class LockT = CSpinLock>
21 class CLockInt : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> >
22 {
23  typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraEmpty<T> > __MyBase;
24  typedef CLockInt<T, LockT> __Myt;
25 public:
26  typedef typename __MyBase::value_type value_type;
27  explicit CLockInt(value_type c = value_type()):__MyBase(c){}
28  CLockInt(const __Myt & c):__MyBase(c.load()){}
29  value_type operator =(value_type c) volatile{
30  __MyBase::operator =(c);
31  return *this;
32  }
33 };
34 
35 template<typename T, class LockT = CSpinLock>
36 class CLockIntMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> >
37 {
38  typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMax<T> > __MyBase;
40 public:
41  typedef typename __MyBase::value_type value_type;
42  explicit CLockIntMax(value_type c = value_type()):__MyBase(c){}
43  CLockIntMax(const __Myt & c):__MyBase(c.load()){}
44  value_type operator =(value_type c) volatile{
45  __MyBase::operator =(c);
46  return *this;
47  }
48  value_type max() const volatile{
49  typename __MyBase::guard_type g(__MyBase::lock_);
50  return __MyBase::e_.m_;
51  }
52  //重置max值,返回之前的max值
53  value_type resetMax() volatile{
54  typename __MyBase::guard_type g(__MyBase::lock_);
55  value_type ret = __MyBase::e_.m_;
56  __MyBase::e_.m_ = __MyBase::v_;
57  return ret;
58  }
59 };
60 
61 template<typename T, class LockT = CSpinLock>
62 class CLockIntMinMax : public NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> >
63 {
64  typedef NS_IMPL::CLockIntBase<T, LockT, NS_IMPL::__ExtraMinMax<T> > __MyBase;
66 public:
67  typedef typename __MyBase::value_type value_type;
68  explicit CLockIntMinMax(value_type c = value_type()):__MyBase(c){}
69  CLockIntMinMax(const __Myt & c):__MyBase(c.load()){}
70  value_type operator =(value_type c) volatile{
71  __MyBase::operator =(c);
72  return *this;
73  }
74  value_type min() const volatile{
75  typename __MyBase::guard_type g(__MyBase::lock_);
76  return __MyBase::e_.mi_;
77  }
78  value_type max() const volatile{
79  typename __MyBase::guard_type g(__MyBase::lock_);
80  return __MyBase::e_.ma_;
81  }
82  //重置min, max值
83  //oldMin: 返回之前的min值
84  //oldMax: 返回之前的max值
85  void resetMinMax(value_type * oldMin, value_type * oldMax) volatile{
86  typename __MyBase::guard_type g(__MyBase::lock_);
87  if(oldMin)
88  *oldMin = __MyBase::e_.mi_;
89  if(oldMax)
90  *oldMax = __MyBase::e_.ma_;
91  __MyBase::e_.mi_ = __MyBase::e_.ma_ = __MyBase::v_;
92  }
93 };
94 
95 NS_SERVER_END
96 
97 #endif
Definition: lock_int.hh:36
Definition: lock_int.hh:62
Definition: lock_int.hh:21