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
00040 #ifndef NVWA_OBJECT_LEVEL_LOCK_H
00041 #define NVWA_OBJECT_LEVEL_LOCK_H
00042
00043 #include "fast_mutex.h"
00044 #include "_nvwa.h"
00045
00046 NVWA_NAMESPACE_BEGIN
00047
00048 # ifdef _NOTHREADS
00049
00053 template <class _Host>
00054 class object_level_lock
00055 {
00056 public:
00058 class lock
00059 {
00060 # ifndef NDEBUG
00061 const object_level_lock& _M_host;
00062 # endif
00063
00064 lock(const lock&);
00065 lock& operator=(const lock&);
00066 public:
00067 explicit lock(const object_level_lock& host)
00068 # ifndef NDEBUG
00069 : _M_host(host)
00070 # endif
00071 {}
00072 # ifndef NDEBUG
00073
00074
00075
00076
00077 const object_level_lock* get_locked_object() const
00078 {
00079 return &_M_host;
00080 }
00081 # endif
00082 };
00083
00084 typedef _Host volatile_type;
00085 };
00086 # else
00087
00091 template <class _Host>
00092 class object_level_lock
00093 {
00094 mutable fast_mutex _M_mtx;
00095
00096 public:
00097
00098
00099
00100
00101 class lock;
00102 friend class lock;
00103
00105 class lock
00106 {
00107 const object_level_lock& _M_host;
00108
00109 lock(const lock&);
00110 lock& operator=(const lock&);
00111 public:
00112 explicit lock(const object_level_lock& host) : _M_host(host)
00113 {
00114 _M_host._M_mtx.lock();
00115 }
00116 ~lock()
00117 {
00118 _M_host._M_mtx.unlock();
00119 }
00120 # ifndef NDEBUG
00121
00122
00123
00124
00125 const object_level_lock* get_locked_object() const
00126 {
00127 return &_M_host;
00128 }
00129 # endif
00130 };
00131
00132 typedef volatile _Host volatile_type;
00133 };
00134 # endif // _NOTHREADS
00135
00136 NVWA_NAMESPACE_END
00137
00138 #endif // NVWA_OBJECT_LEVEL_LOCK_H