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 #ifndef __SYNC_PTR_H__
00028 #define __SYNC_PTR_H__
00029
00030 namespace cbits
00031 {
00032
00078 template< typename Lockable >
00079 class sync_ptr
00080 {
00081 public:
00082
00090 sync_ptr<Lockable>
00091 (
00092 Lockable* t,
00093 const bool autofree=false
00094 )
00095 : _t(t),_owned(true),_autofree(autofree)
00096 {
00097 _t->lock();
00098 }
00099
00100
00107 sync_ptr<Lockable>( const sync_ptr<Lockable>& r )
00108 {
00109 if( ! r._owned )
00110 {
00111 throw std::exception();
00112 }
00113
00114 _t = r._t;
00115 _owned = true;
00116 _autofree = r._autofree;
00117 r.release();
00118 }
00119
00120
00127 sync_ptr<Lockable>& operator=( const sync_ptr<Lockable>& r )
00128 {
00129 if( ! r._owned )
00130 {
00131 throw std::exception();
00132 }
00133
00134 if( _owned )
00135 {
00136 _t->unlock();
00137 if( _autofree )
00138 {
00139 delete _t;
00140 }
00141 _t = 0;
00142 }
00143
00144 _t = r._t;
00145 _owned = true;
00146 _autofree = r._autofree;
00147 r.release();
00148 return *this;
00149 }
00150
00151
00155 bool operator==( const sync_ptr<Lockable>& r )
00156 {
00157 return _t == r._t;
00158 }
00159
00160
00164 Lockable* operator->()
00165 {
00166 return _t;
00167 }
00168
00169
00173 Lockable& operator*()
00174 {
00175 return *_t;
00176 }
00177
00181 const bool isOwner() const
00182 {
00183 return _owned;
00184 }
00185
00196 ~sync_ptr<Lockable>()
00197 {
00198 if( _owned )
00199 {
00200 _t->unlock();
00201
00202 if( _autofree )
00203 {
00204 delete _t;
00205 _t = 0;
00206 }
00207 }
00208 }
00209
00210
00211 private:
00212
00218 void release() const
00219 {
00220 _owned = false;
00221 _autofree = false;
00222 }
00223
00224 Lockable* _t;
00225 mutable bool _owned;
00226 mutable bool _autofree;
00228 };
00229
00230 };
00231
00232 #endif
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248