blob: 00f0065bdd9f6602fcdfca764db1a21382236808 [file] [log] [blame]
<!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> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="globals.html">Globals</a> &nbsp; </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> &amp;&amp; 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-&gt;<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-&gt;<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>&amp; x);
00137 <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>&amp; 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>&lt;<span class="keyword">class</span> DeallocType&gt;
<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&lt;DeallocType&gt;</a>&amp; x);
00225 <a class="code" href="classOsclRefCounterSA.html">OsclRefCounterSA&lt;DeallocType&gt;</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterSA.html">OsclRefCounterSA&lt;DeallocType&gt;</a>&amp; 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>&lt;<span class="keyword">class</span> LockType&gt;
<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> &amp;&amp; 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-&gt;<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-&gt;<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&lt;LockType&gt;</a>&amp; x);
00320 <a class="code" href="classOsclRefCounterMTDA.html">OsclRefCounterMTDA&lt;LockType&gt;</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterMTDA.html">OsclRefCounterMTDA&lt;LockType&gt;</a>&amp; 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>&lt;<span class="keyword">class</span> DeallocType, <span class="keyword">class</span> LockType&gt;
<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&lt;DeallocType, LockType&gt;</a>&amp; x);
00415 <a class="code" href="classOsclRefCounterMTSA.html">OsclRefCounterMTSA&lt;DeallocType, LockType&gt;</a>&amp; operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterMTSA.html">OsclRefCounterMTSA&lt;DeallocType, LockType&gt;</a>&amp; 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>&lt;<span class="keyword">class</span> DefAlloc&gt;
<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>