1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> 3 <title>oscl_refcounter.h Source File</title> 4 <link href="doxygen.css" rel="stylesheet" type="text/css"> 5 </head><body> 6 <!-- Generated by Doxygen 1.2.18 --> 7 <center> 8 <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> </center> 9 <hr><h1>oscl_refcounter.h</h1><a href="oscl__refcounter_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">// -*- c++ -*-</span> 10 00002 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span> 11 00003 12 00004 <span class="comment">// O S C L _ R E F C O U N T E R</span> 13 00005 14 00006 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span> 15 00007 16 00021 <span class="preprocessor">#ifndef OSCL_REFCOUNTER_H_INCLUDED</span> 17 00022 <span class="preprocessor"></span><span class="preprocessor">#define OSCL_REFCOUNTER_H_INCLUDED</span> 18 00023 <span class="preprocessor"></span> 19 00024 <span class="preprocessor">#ifndef OSCL_ASSERT_H_INCLUDED</span> 20 00025 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__assert_8h.html">oscl_assert.h</a>"</span> 21 00026 <span class="preprocessor">#endif</span> 22 00027 <span class="preprocessor"></span> 23 00028 <span class="preprocessor">#ifndef OSCL_DEFALLOC_H_INCLUDED</span> 24 00029 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__defalloc_8h.html">oscl_defalloc.h</a>"</span> 25 00030 <span class="preprocessor">#endif</span> 26 00031 <span class="preprocessor"></span> 27 <a name="l00035"></a><a class="code" href="classOsclRefCounter.html">00035</a> <span class="keyword">class </span><a class="code" href="classOsclRefCounter.html">OsclRefCounter</a> 28 00036 { 29 00037 <span class="keyword">public</span>: 30 00041 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounter.html#a0">addRef</a>() = 0; 31 00042 32 00046 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounter.html#a1">removeRef</a>() = 0; 33 00047 34 00051 <span class="keyword">virtual</span> uint32 <a class="code" href="classOsclRefCounter.html#a2">getCount</a>() = 0; 35 00052 36 <a name="l00053"></a><a class="code" href="classOsclRefCounter.html#a3">00053</a> <span class="keyword">virtual</span> <a class="code" href="classOsclRefCounter.html#a3">~OsclRefCounter</a>() {} 37 00054 }; 38 00055 39 00056 40 <a name="l00061"></a><a class="code" href="classOsclRefCounterDA.html">00061</a> <span class="keyword">class </span><a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a> : <span class="keyword">public</span> <a class="code" href="classOsclRefCounter.html">OsclRefCounter</a> 41 00062 { 42 00063 <span class="keyword">public</span>: 43 00064 44 <a name="l00085"></a><a class="code" href="classOsclRefCounterDA.html#a0">00085</a> <a class="code" href="classOsclRefCounterDA.html#a0">OsclRefCounterDA</a>(<a class="code" href="group__osclbase.html#a25">OsclAny</a> *p, <a class="code" href="classOsclDestructDealloc.html">OsclDestructDealloc</a> *dealloc): 45 00086 ptr(p), deallocator(dealloc), refcnt(1) 46 00087 { 47 00088 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(ptr != <a class="code" href="group__osclbase.html#a81">NULL</a> && deallocator != <a class="code" href="group__osclbase.html#a81">NULL</a>); 48 00089 } 49 00090 50 <a name="l00095"></a><a class="code" href="classOsclRefCounterDA.html#a1">00095</a> <span class="keyword">virtual</span> <a class="code" href="classOsclRefCounterDA.html#a1">~OsclRefCounterDA</a>() {} 51 00096 52 <a name="l00100"></a><a class="code" href="classOsclRefCounterDA.html#a2">00100</a> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounterDA.html#a2">addRef</a>() 53 00101 { 54 00102 ++refcnt; 55 00103 } 56 00104 57 <a name="l00108"></a><a class="code" href="classOsclRefCounterDA.html#a3">00108</a> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounterDA.html#a3">removeRef</a>() 58 00109 { 59 00110 <span class="keywordflow">if</span> (--refcnt == 0) 60 00111 { 61 00112 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) 62 00113 { 63 00114 <span class="comment">// buffer is part of the refcounter</span> 64 00115 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(<span class="keyword">this</span>); 65 00116 } 66 00117 <span class="keywordflow">else</span> 67 00118 { 68 00119 <span class="comment">// delete the buffer and the refcounter object</span> 69 00120 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(ptr); 70 00121 <span class="keyword">delete</span>(this); 71 00122 } 72 00123 } 73 00124 } 74 00125 75 <a name="l00129"></a><a class="code" href="classOsclRefCounterDA.html#a4">00129</a> uint32 <a class="code" href="classOsclRefCounterDA.html#a4">getCount</a>() 76 00130 { 77 00131 <span class="keywordflow">return</span> refcnt; 78 00132 } 79 00133 80 00134 <span class="keyword">private</span>: 81 00135 <a class="code" href="classOsclRefCounterDA.html#a0">OsclRefCounterDA</a>(); 82 00136 <a class="code" href="classOsclRefCounterDA.html#a0">OsclRefCounterDA</a>(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& x); 83 00137 <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& x); 84 00138 85 00139 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; 86 00140 <a class="code" href="classOsclDestructDealloc.html">OsclDestructDealloc</a> *deallocator; 87 00141 uint32 refcnt; 88 00142 }; 89 00143 90 00144 91 00149 <span class="keyword">template</span><<span class="keyword">class</span> DeallocType> 92 <a name="l00150"></a><a class="code" href="classOsclRefCounterSA.html">00150</a> <span class="keyword">class </span><a class="code" href="classOsclRefCounterSA.html">OsclRefCounterSA</a> : <span class="keyword">public</span> <a class="code" href="classOsclRefCounter.html">OsclRefCounter</a> 93 00151 { 94 00152 <span class="keyword">public</span>: 95 <a name="l00169"></a><a class="code" href="classOsclRefCounterSA.html#a0">00169</a> <a class="code" href="classOsclRefCounterSA.html#a0">OsclRefCounterSA</a>(<a class="code" href="group__osclbase.html#a25">OsclAny</a> *p) : 96 00170 ptr(p), refcnt(1) 97 00171 { 98 00172 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(ptr != <a class="code" href="group__osclbase.html#a81">NULL</a>); 99 00173 } 100 00174 101 <a name="l00179"></a><a class="code" href="classOsclRefCounterSA.html#a1">00179</a> <span class="keyword">virtual</span> <a class="code" href="classOsclRefCounterSA.html#a1">~OsclRefCounterSA</a>() {} 102 00180 103 <a name="l00184"></a><a class="code" href="classOsclRefCounterSA.html#a2">00184</a> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounterSA.html#a2">addRef</a>() 104 00185 { 105 00186 ++refcnt; 106 00187 } 107 00188 108 <a name="l00192"></a><a class="code" href="classOsclRefCounterSA.html#a3">00192</a> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounterSA.html#a3">removeRef</a>() 109 00193 { 110 00194 <span class="keywordflow">if</span> (--refcnt == 0) 111 00195 { 112 00196 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) 113 00197 { 114 00198 115 00199 <span class="comment">// buffer is part of the refcounter</span> 116 00200 DeallocType deallocator; 117 00201 deallocator.destruct_and_dealloc(<span class="keyword">this</span>); 118 00202 } 119 00203 <span class="keywordflow">else</span> 120 00204 { 121 00205 122 00206 <span class="comment">// delete the buffer and the recounter object</span> 123 00207 DeallocType deallocator; 124 00208 deallocator.destruct_and_dealloc(ptr); 125 00209 <span class="keyword">delete</span>(this); 126 00210 } 127 00211 } 128 00212 } 129 00213 130 <a name="l00217"></a><a class="code" href="classOsclRefCounterSA.html#a4">00217</a> uint32 <a class="code" href="classOsclRefCounterSA.html#a4">getCount</a>() 131 00218 { 132 00219 <span class="keywordflow">return</span> refcnt; 133 00220 } 134 00221 135 00222 <span class="keyword">private</span>: 136 00223 <a class="code" href="classOsclRefCounterSA.html#a0">OsclRefCounterSA</a>(); 137 00224 <a class="code" href="classOsclRefCounterSA.html#a0">OsclRefCounterSA</a>(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterSA.html">OsclRefCounterSA<DeallocType></a>& x); 138 00225 <a class="code" href="classOsclRefCounterSA.html">OsclRefCounterSA<DeallocType></a>& operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterSA.html">OsclRefCounterSA<DeallocType></a>& x); 139 00226 140 00227 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; 141 00228 uint32 refcnt; 142 00229 }; 143 00230 144 00235 <span class="keyword">template</span><<span class="keyword">class</span> LockType> 145 <a name="l00236"></a><a class="code" href="classOsclRefCounterMTDA.html">00236</a> <span class="keyword">class </span><a class="code" href="classOsclRefCounterMTDA.html">OsclRefCounterMTDA</a> : <span class="keyword">public</span> <a class="code" href="classOsclRefCounter.html">OsclRefCounter</a> 146 00237 { 147 00238 <span class="keyword">public</span>: 148 00239 149 <a name="l00260"></a><a class="code" href="classOsclRefCounterMTDA.html#a0">00260</a> <a class="code" href="classOsclRefCounterMTDA.html#a0">OsclRefCounterMTDA</a>(<a class="code" href="group__osclbase.html#a25">OsclAny</a> *p, <a class="code" href="classOsclDestructDealloc.html">OsclDestructDealloc</a> *dealloc) : 150 00261 ptr(p), deallocator(dealloc), refcnt(1) 151 00262 { 152 00263 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(ptr != <a class="code" href="group__osclbase.html#a81">NULL</a> && deallocator != <a class="code" href="group__osclbase.html#a81">NULL</a>); 153 00264 } 154 00265 155 <a name="l00270"></a><a class="code" href="classOsclRefCounterMTDA.html#a1">00270</a> <span class="keyword">virtual</span> <a class="code" href="classOsclRefCounterMTDA.html#a1">~OsclRefCounterMTDA</a>() {} 156 00271 157 <a name="l00275"></a><a class="code" href="classOsclRefCounterMTDA.html#a2">00275</a> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounterMTDA.html#a2">addRef</a>() 158 00276 { 159 00277 lock.Lock(); 160 00278 ++refcnt; 161 00279 lock.Unlock(); 162 00280 } 163 00281 164 <a name="l00285"></a><a class="code" href="classOsclRefCounterMTDA.html#a3">00285</a> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounterMTDA.html#a3">removeRef</a>() 165 00286 { 166 00287 lock.Lock(); 167 00288 <span class="keywordflow">if</span> (--refcnt == 0) 168 00289 { 169 00290 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) 170 00291 { 171 00292 172 00293 <span class="comment">// buffer is part of the refcounter</span> 173 00294 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(<span class="keyword">this</span>); 174 00295 } 175 00296 <span class="keywordflow">else</span> 176 00297 { 177 00298 <span class="comment">// delete the buffer and the refcounter object</span> 178 00299 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(ptr); 179 00300 <span class="keyword">delete</span>(this); 180 00301 } 181 00302 } 182 00303 <span class="keywordflow">else</span> 183 00304 { 184 00305 lock.Unlock(); 185 00306 } 186 00307 } 187 00308 188 <a name="l00312"></a><a class="code" href="classOsclRefCounterMTDA.html#a4">00312</a> uint32 <a class="code" href="classOsclRefCounterMTDA.html#a4">getCount</a>() 189 00313 { 190 00314 <span class="keywordflow">return</span> refcnt; 191 00315 } 192 00316 193 00317 <span class="keyword">private</span>: 194 00318 <a class="code" href="classOsclRefCounterMTDA.html#a0">OsclRefCounterMTDA</a>(); 195 00319 <a class="code" href="classOsclRefCounterMTDA.html#a0">OsclRefCounterMTDA</a>(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterMTDA.html">OsclRefCounterMTDA<LockType></a>& x); 196 00320 <a class="code" href="classOsclRefCounterMTDA.html">OsclRefCounterMTDA<LockType></a>& operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterMTDA.html">OsclRefCounterMTDA<LockType></a>& x); 197 00321 198 00322 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; 199 00323 <a class="code" href="classOsclDestructDealloc.html">OsclDestructDealloc</a> *deallocator; 200 00324 LockType lock; 201 00325 uint32 refcnt; 202 00326 }; 203 00327 204 00328 205 00333 <span class="keyword">template</span><<span class="keyword">class</span> DeallocType, <span class="keyword">class</span> LockType> 206 <a name="l00334"></a><a class="code" href="classOsclRefCounterMTSA.html">00334</a> <span class="keyword">class </span><a class="code" href="classOsclRefCounterMTSA.html">OsclRefCounterMTSA</a> : <span class="keyword">public</span> <a class="code" href="classOsclRefCounter.html">OsclRefCounter</a> 207 00335 { 208 00336 <span class="keyword">public</span>: 209 <a name="l00353"></a><a class="code" href="classOsclRefCounterMTSA.html#a0">00353</a> <a class="code" href="classOsclRefCounterMTSA.html#a0">OsclRefCounterMTSA</a>(<a class="code" href="group__osclbase.html#a25">OsclAny</a> *p) : 210 00354 ptr(p), refcnt(1) 211 00355 { 212 00356 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(ptr != <a class="code" href="group__osclbase.html#a81">NULL</a>); 213 00357 } 214 00358 215 <a name="l00363"></a><a class="code" href="classOsclRefCounterMTSA.html#a1">00363</a> <span class="keyword">virtual</span> <a class="code" href="classOsclRefCounterMTSA.html#a1">~OsclRefCounterMTSA</a>() {} 216 00364 217 <a name="l00368"></a><a class="code" href="classOsclRefCounterMTSA.html#a2">00368</a> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounterMTSA.html#a2">addRef</a>() 218 00369 { 219 00370 lock.Lock(); 220 00371 ++refcnt; 221 00372 lock.Unlock(); 222 00373 } 223 00374 224 <a name="l00378"></a><a class="code" href="classOsclRefCounterMTSA.html#a3">00378</a> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounterMTSA.html#a3">removeRef</a>() 225 00379 { 226 00380 lock.Lock(); 227 00381 <span class="keywordflow">if</span> (--refcnt == 0) 228 00382 { 229 00383 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) 230 00384 { 231 00385 <span class="comment">// buffer is part of the refcounter</span> 232 00386 DeallocType deallocator; 233 00387 deallocator.destruct_and_dealloc(<span class="keyword">this</span>); 234 00388 } 235 00389 <span class="keywordflow">else</span> 236 00390 { 237 00391 238 00392 <span class="comment">// delete the buffer and the recounter object</span> 239 00393 DeallocType deallocator; 240 00394 deallocator.destruct_and_dealloc(ptr); 241 00395 <span class="keyword">delete</span>(this); 242 00396 } 243 00397 } 244 00398 <span class="keywordflow">else</span> 245 00399 { 246 00400 lock.Unlock(); 247 00401 } 248 00402 } 249 00403 250 <a name="l00407"></a><a class="code" href="classOsclRefCounterMTSA.html#a4">00407</a> uint32 <a class="code" href="classOsclRefCounterMTSA.html#a4">getCount</a>() 251 00408 { 252 00409 <span class="keywordflow">return</span> refcnt; 253 00410 } 254 00411 255 00412 <span class="keyword">private</span>: 256 00413 <a class="code" href="classOsclRefCounterMTSA.html#a0">OsclRefCounterMTSA</a>(); 257 00414 <a class="code" href="classOsclRefCounterMTSA.html#a0">OsclRefCounterMTSA</a>(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterMTSA.html">OsclRefCounterMTSA<DeallocType, LockType></a>& x); 258 00415 <a class="code" href="classOsclRefCounterMTSA.html">OsclRefCounterMTSA<DeallocType, LockType></a>& operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterMTSA.html">OsclRefCounterMTSA<DeallocType, LockType></a>& x); 259 00416 260 00417 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; 261 00418 LockType lock; 262 00419 uint32 refcnt; 263 00420 }; 264 00421 265 00426 <span class="keyword">template</span><<span class="keyword">class</span> DefAlloc> 266 <a name="l00427"></a><a class="code" href="classOscl__DefAllocWithRefCounter.html">00427</a> <span class="keyword">class </span><a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>: <span class="keyword">public</span> <a class="code" href="classOsclRefCounter.html">OsclRefCounter</a>, <span class="keyword">public</span> DefAlloc 267 00428 { 268 00429 <span class="keyword">public</span>: 269 <a name="l00432"></a><a class="code" href="classOscl__DefAllocWithRefCounter.html#d0">00432</a> <span class="keyword">static</span> <a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>* <a class="code" href="classOscl__DefAllocWithRefCounter.html#d0">New</a>() 270 00433 { 271 00434 DefAlloc alloc; 272 00435 <a class="code" href="group__osclbase.html#a25">OsclAny</a>* p = alloc.ALLOCATE(<span class="keyword">sizeof</span>(<a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>)); 273 00436 <span class="keywordflow">return</span> <span class="keyword">new</span>(p) <a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>(); 274 00437 } 275 00438 276 <a name="l00441"></a><a class="code" href="classOscl__DefAllocWithRefCounter.html#a0">00441</a> <span class="keywordtype">void</span> <a class="code" href="classOscl__DefAllocWithRefCounter.html#a0">Delete</a>() 277 00442 { 278 00443 <a class="code" href="classOscl__DefAllocWithRefCounter.html#a2">removeRef</a>(); 279 00444 } 280 00445 281 <a name="l00446"></a><a class="code" href="classOscl__DefAllocWithRefCounter.html#a1">00446</a> <span class="keywordtype">void</span> <a class="code" href="classOscl__DefAllocWithRefCounter.html#a1">addRef</a>() 282 00447 { 283 00448 refcount++; 284 00449 } 285 00450 286 <a name="l00451"></a><a class="code" href="classOscl__DefAllocWithRefCounter.html#a2">00451</a> <span class="keywordtype">void</span> <a class="code" href="classOscl__DefAllocWithRefCounter.html#a2">removeRef</a>() 287 00452 { 288 00453 --refcount; 289 00454 <span class="keywordflow">if</span> (refcount == 0) 290 00455 DefAlloc::deallocate(<span class="keyword">this</span>); 291 00456 } 292 00457 293 <a name="l00458"></a><a class="code" href="classOscl__DefAllocWithRefCounter.html#a3">00458</a> uint32 <a class="code" href="classOscl__DefAllocWithRefCounter.html#a3">getCount</a>() 294 00459 { 295 00460 <span class="keywordflow">return</span> refcount; 296 00461 } 297 00462 298 00463 <span class="keyword">private</span>: 299 00464 <a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>(): refcount(1) 300 00465 {} 301 00466 uint32 refcount; 302 00467 }; 303 00468 304 00472 <span class="preprocessor">#endif</span> 305 </pre></div><hr size="1"><img src="pvlogo_small.jpg"><address style="align: right;"><small>OSCL API</small> 306 <address style="align: left;"><small>Posting Version: OPENCORE_20090310 </small> 307 </small></address> 308 </body> 309 </html> 310