| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
| <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> |
| <title>oscl_refcounter.h Source File</title> |
| <link href="doxygen.css" rel="stylesheet" type="text/css"> |
| </head><body> |
| <!-- Generated by Doxygen 1.2.18 --> |
| <center> |
| <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> |
| <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> |
| 00002 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span> |
| 00003 |
| 00004 <span class="comment">// O S C L _ R E F C O U N T E R</span> |
| 00005 |
| 00006 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span> |
| 00007 |
| 00021 <span class="preprocessor">#ifndef OSCL_REFCOUNTER_H_INCLUDED</span> |
| 00022 <span class="preprocessor"></span><span class="preprocessor">#define OSCL_REFCOUNTER_H_INCLUDED</span> |
| 00023 <span class="preprocessor"></span> |
| 00024 <span class="preprocessor">#ifndef OSCL_ASSERT_H_INCLUDED</span> |
| 00025 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__assert_8h.html">oscl_assert.h</a>"</span> |
| 00026 <span class="preprocessor">#endif</span> |
| 00027 <span class="preprocessor"></span> |
| 00028 <span class="preprocessor">#ifndef OSCL_DEFALLOC_H_INCLUDED</span> |
| 00029 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__defalloc_8h.html">oscl_defalloc.h</a>"</span> |
| 00030 <span class="preprocessor">#endif</span> |
| 00031 <span class="preprocessor"></span> |
| <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> |
| 00036 { |
| 00037 <span class="keyword">public</span>: |
| 00041 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounter.html#a0">addRef</a>() = 0; |
| 00042 |
| 00046 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounter.html#a1">removeRef</a>() = 0; |
| 00047 |
| 00051 <span class="keyword">virtual</span> uint32 <a class="code" href="classOsclRefCounter.html#a2">getCount</a>() = 0; |
| 00052 |
| <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>() {} |
| 00054 }; |
| 00055 |
| 00056 |
| <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> |
| 00062 { |
| 00063 <span class="keyword">public</span>: |
| 00064 |
| <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): |
| 00086 ptr(p), deallocator(dealloc), refcnt(1) |
| 00087 { |
| 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>); |
| 00089 } |
| 00090 |
| <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>() {} |
| 00096 |
| <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>() |
| 00101 { |
| 00102 ++refcnt; |
| 00103 } |
| 00104 |
| <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>() |
| 00109 { |
| 00110 <span class="keywordflow">if</span> (--refcnt == 0) |
| 00111 { |
| 00112 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) |
| 00113 { |
| 00114 <span class="comment">// buffer is part of the refcounter</span> |
| 00115 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(<span class="keyword">this</span>); |
| 00116 } |
| 00117 <span class="keywordflow">else</span> |
| 00118 { |
| 00119 <span class="comment">// delete the buffer and the refcounter object</span> |
| 00120 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(ptr); |
| 00121 <span class="keyword">delete</span>(this); |
| 00122 } |
| 00123 } |
| 00124 } |
| 00125 |
| <a name="l00129"></a><a class="code" href="classOsclRefCounterDA.html#a4">00129</a> uint32 <a class="code" href="classOsclRefCounterDA.html#a4">getCount</a>() |
| 00130 { |
| 00131 <span class="keywordflow">return</span> refcnt; |
| 00132 } |
| 00133 |
| 00134 <span class="keyword">private</span>: |
| 00135 <a class="code" href="classOsclRefCounterDA.html#a0">OsclRefCounterDA</a>(); |
| 00136 <a class="code" href="classOsclRefCounterDA.html#a0">OsclRefCounterDA</a>(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& x); |
| 00137 <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& x); |
| 00138 |
| 00139 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; |
| 00140 <a class="code" href="classOsclDestructDealloc.html">OsclDestructDealloc</a> *deallocator; |
| 00141 uint32 refcnt; |
| 00142 }; |
| 00143 |
| 00144 |
| 00149 <span class="keyword">template</span><<span class="keyword">class</span> DeallocType> |
| <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> |
| 00151 { |
| 00152 <span class="keyword">public</span>: |
| <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) : |
| 00170 ptr(p), refcnt(1) |
| 00171 { |
| 00172 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(ptr != <a class="code" href="group__osclbase.html#a81">NULL</a>); |
| 00173 } |
| 00174 |
| <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>() {} |
| 00180 |
| <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>() |
| 00185 { |
| 00186 ++refcnt; |
| 00187 } |
| 00188 |
| <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>() |
| 00193 { |
| 00194 <span class="keywordflow">if</span> (--refcnt == 0) |
| 00195 { |
| 00196 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) |
| 00197 { |
| 00198 |
| 00199 <span class="comment">// buffer is part of the refcounter</span> |
| 00200 DeallocType deallocator; |
| 00201 deallocator.destruct_and_dealloc(<span class="keyword">this</span>); |
| 00202 } |
| 00203 <span class="keywordflow">else</span> |
| 00204 { |
| 00205 |
| 00206 <span class="comment">// delete the buffer and the recounter object</span> |
| 00207 DeallocType deallocator; |
| 00208 deallocator.destruct_and_dealloc(ptr); |
| 00209 <span class="keyword">delete</span>(this); |
| 00210 } |
| 00211 } |
| 00212 } |
| 00213 |
| <a name="l00217"></a><a class="code" href="classOsclRefCounterSA.html#a4">00217</a> uint32 <a class="code" href="classOsclRefCounterSA.html#a4">getCount</a>() |
| 00218 { |
| 00219 <span class="keywordflow">return</span> refcnt; |
| 00220 } |
| 00221 |
| 00222 <span class="keyword">private</span>: |
| 00223 <a class="code" href="classOsclRefCounterSA.html#a0">OsclRefCounterSA</a>(); |
| 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); |
| 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); |
| 00226 |
| 00227 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; |
| 00228 uint32 refcnt; |
| 00229 }; |
| 00230 |
| 00235 <span class="keyword">template</span><<span class="keyword">class</span> LockType> |
| <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> |
| 00237 { |
| 00238 <span class="keyword">public</span>: |
| 00239 |
| <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) : |
| 00261 ptr(p), deallocator(dealloc), refcnt(1) |
| 00262 { |
| 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>); |
| 00264 } |
| 00265 |
| <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>() {} |
| 00271 |
| <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>() |
| 00276 { |
| 00277 lock.Lock(); |
| 00278 ++refcnt; |
| 00279 lock.Unlock(); |
| 00280 } |
| 00281 |
| <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>() |
| 00286 { |
| 00287 lock.Lock(); |
| 00288 <span class="keywordflow">if</span> (--refcnt == 0) |
| 00289 { |
| 00290 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) |
| 00291 { |
| 00292 |
| 00293 <span class="comment">// buffer is part of the refcounter</span> |
| 00294 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(<span class="keyword">this</span>); |
| 00295 } |
| 00296 <span class="keywordflow">else</span> |
| 00297 { |
| 00298 <span class="comment">// delete the buffer and the refcounter object</span> |
| 00299 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(ptr); |
| 00300 <span class="keyword">delete</span>(this); |
| 00301 } |
| 00302 } |
| 00303 <span class="keywordflow">else</span> |
| 00304 { |
| 00305 lock.Unlock(); |
| 00306 } |
| 00307 } |
| 00308 |
| <a name="l00312"></a><a class="code" href="classOsclRefCounterMTDA.html#a4">00312</a> uint32 <a class="code" href="classOsclRefCounterMTDA.html#a4">getCount</a>() |
| 00313 { |
| 00314 <span class="keywordflow">return</span> refcnt; |
| 00315 } |
| 00316 |
| 00317 <span class="keyword">private</span>: |
| 00318 <a class="code" href="classOsclRefCounterMTDA.html#a0">OsclRefCounterMTDA</a>(); |
| 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); |
| 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); |
| 00321 |
| 00322 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; |
| 00323 <a class="code" href="classOsclDestructDealloc.html">OsclDestructDealloc</a> *deallocator; |
| 00324 LockType lock; |
| 00325 uint32 refcnt; |
| 00326 }; |
| 00327 |
| 00328 |
| 00333 <span class="keyword">template</span><<span class="keyword">class</span> DeallocType, <span class="keyword">class</span> LockType> |
| <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> |
| 00335 { |
| 00336 <span class="keyword">public</span>: |
| <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) : |
| 00354 ptr(p), refcnt(1) |
| 00355 { |
| 00356 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(ptr != <a class="code" href="group__osclbase.html#a81">NULL</a>); |
| 00357 } |
| 00358 |
| <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>() {} |
| 00364 |
| <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>() |
| 00369 { |
| 00370 lock.Lock(); |
| 00371 ++refcnt; |
| 00372 lock.Unlock(); |
| 00373 } |
| 00374 |
| <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>() |
| 00379 { |
| 00380 lock.Lock(); |
| 00381 <span class="keywordflow">if</span> (--refcnt == 0) |
| 00382 { |
| 00383 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) |
| 00384 { |
| 00385 <span class="comment">// buffer is part of the refcounter</span> |
| 00386 DeallocType deallocator; |
| 00387 deallocator.destruct_and_dealloc(<span class="keyword">this</span>); |
| 00388 } |
| 00389 <span class="keywordflow">else</span> |
| 00390 { |
| 00391 |
| 00392 <span class="comment">// delete the buffer and the recounter object</span> |
| 00393 DeallocType deallocator; |
| 00394 deallocator.destruct_and_dealloc(ptr); |
| 00395 <span class="keyword">delete</span>(this); |
| 00396 } |
| 00397 } |
| 00398 <span class="keywordflow">else</span> |
| 00399 { |
| 00400 lock.Unlock(); |
| 00401 } |
| 00402 } |
| 00403 |
| <a name="l00407"></a><a class="code" href="classOsclRefCounterMTSA.html#a4">00407</a> uint32 <a class="code" href="classOsclRefCounterMTSA.html#a4">getCount</a>() |
| 00408 { |
| 00409 <span class="keywordflow">return</span> refcnt; |
| 00410 } |
| 00411 |
| 00412 <span class="keyword">private</span>: |
| 00413 <a class="code" href="classOsclRefCounterMTSA.html#a0">OsclRefCounterMTSA</a>(); |
| 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); |
| 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); |
| 00416 |
| 00417 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; |
| 00418 LockType lock; |
| 00419 uint32 refcnt; |
| 00420 }; |
| 00421 |
| 00426 <span class="keyword">template</span><<span class="keyword">class</span> DefAlloc> |
| <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 |
| 00428 { |
| 00429 <span class="keyword">public</span>: |
| <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>() |
| 00433 { |
| 00434 DefAlloc alloc; |
| 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>)); |
| 00436 <span class="keywordflow">return</span> <span class="keyword">new</span>(p) <a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>(); |
| 00437 } |
| 00438 |
| <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>() |
| 00442 { |
| 00443 <a class="code" href="classOscl__DefAllocWithRefCounter.html#a2">removeRef</a>(); |
| 00444 } |
| 00445 |
| <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>() |
| 00447 { |
| 00448 refcount++; |
| 00449 } |
| 00450 |
| <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>() |
| 00452 { |
| 00453 --refcount; |
| 00454 <span class="keywordflow">if</span> (refcount == 0) |
| 00455 DefAlloc::deallocate(<span class="keyword">this</span>); |
| 00456 } |
| 00457 |
| <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>() |
| 00459 { |
| 00460 <span class="keywordflow">return</span> refcount; |
| 00461 } |
| 00462 |
| 00463 <span class="keyword">private</span>: |
| 00464 <a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>(): refcount(1) |
| 00465 {} |
| 00466 uint32 refcount; |
| 00467 }; |
| 00468 |
| 00472 <span class="preprocessor">#endif</span> |
| </pre></div><hr size="1"><img src="pvlogo_small.jpg"><address style="align: right;"><small>OSCL API</small> |
| <address style="align: left;"><small>Posting Version: OPENCORE_20090120 </small> |
| </small></address> |
| </body> |
| </html> |