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