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> 1000002 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span> 1100003 1200004 <span class="comment">// O S C L _ R E F C O U N T E R</span> 1300005 1400006 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span> 1500007 1600021 <span class="preprocessor">#ifndef OSCL_REFCOUNTER_H_INCLUDED</span> 1700022 <span class="preprocessor"></span><span class="preprocessor">#define OSCL_REFCOUNTER_H_INCLUDED</span> 1800023 <span class="preprocessor"></span> 1900024 <span class="preprocessor">#ifndef OSCL_ASSERT_H_INCLUDED</span> 2000025 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__assert_8h.html">oscl_assert.h</a>"</span> 2100026 <span class="preprocessor">#endif</span> 2200027 <span class="preprocessor"></span> 2300028 <span class="preprocessor">#ifndef OSCL_DEFALLOC_H_INCLUDED</span> 2400029 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__defalloc_8h.html">oscl_defalloc.h</a>"</span> 2500030 <span class="preprocessor">#endif</span> 2600031 <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> 2800036 { 2900037 <span class="keyword">public</span>: 3000041 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounter.html#a0">addRef</a>() = 0; 3100042 3200046 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classOsclRefCounter.html#a1">removeRef</a>() = 0; 3300047 3400051 <span class="keyword">virtual</span> uint32 <a class="code" href="classOsclRefCounter.html#a2">getCount</a>() = 0; 3500052 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>() {} 3700054 }; 3800055 3900056 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> 4100062 { 4200063 <span class="keyword">public</span>: 4300064 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): 4500086 ptr(p), deallocator(dealloc), refcnt(1) 4600087 { 4700088 <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>); 4800089 } 4900090 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>() {} 5100096 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>() 5300101 { 5400102 ++refcnt; 5500103 } 5600104 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>() 5800109 { 5900110 <span class="keywordflow">if</span> (--refcnt == 0) 6000111 { 6100112 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) 6200113 { 6300114 <span class="comment">// buffer is part of the refcounter</span> 6400115 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(<span class="keyword">this</span>); 6500116 } 6600117 <span class="keywordflow">else</span> 6700118 { 6800119 <span class="comment">// delete the buffer and the refcounter object</span> 6900120 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(ptr); 7000121 <span class="keyword">delete</span>(this); 7100122 } 7200123 } 7300124 } 7400125 75<a name="l00129"></a><a class="code" href="classOsclRefCounterDA.html#a4">00129</a> uint32 <a class="code" href="classOsclRefCounterDA.html#a4">getCount</a>() 7600130 { 7700131 <span class="keywordflow">return</span> refcnt; 7800132 } 7900133 8000134 <span class="keyword">private</span>: 8100135 <a class="code" href="classOsclRefCounterDA.html#a0">OsclRefCounterDA</a>(); 8200136 <a class="code" href="classOsclRefCounterDA.html#a0">OsclRefCounterDA</a>(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& x); 8300137 <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& operator=(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterDA.html">OsclRefCounterDA</a>& x); 8400138 8500139 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; 8600140 <a class="code" href="classOsclDestructDealloc.html">OsclDestructDealloc</a> *deallocator; 8700141 uint32 refcnt; 8800142 }; 8900143 9000144 9100149 <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> 9300151 { 9400152 <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) : 9600170 ptr(p), refcnt(1) 9700171 { 9800172 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(ptr != <a class="code" href="group__osclbase.html#a81">NULL</a>); 9900173 } 10000174 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>() {} 10200180 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>() 10400185 { 10500186 ++refcnt; 10600187 } 10700188 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>() 10900193 { 11000194 <span class="keywordflow">if</span> (--refcnt == 0) 11100195 { 11200196 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) 11300197 { 11400198 11500199 <span class="comment">// buffer is part of the refcounter</span> 11600200 DeallocType deallocator; 11700201 deallocator.destruct_and_dealloc(<span class="keyword">this</span>); 11800202 } 11900203 <span class="keywordflow">else</span> 12000204 { 12100205 12200206 <span class="comment">// delete the buffer and the recounter object</span> 12300207 DeallocType deallocator; 12400208 deallocator.destruct_and_dealloc(ptr); 12500209 <span class="keyword">delete</span>(this); 12600210 } 12700211 } 12800212 } 12900213 130<a name="l00217"></a><a class="code" href="classOsclRefCounterSA.html#a4">00217</a> uint32 <a class="code" href="classOsclRefCounterSA.html#a4">getCount</a>() 13100218 { 13200219 <span class="keywordflow">return</span> refcnt; 13300220 } 13400221 13500222 <span class="keyword">private</span>: 13600223 <a class="code" href="classOsclRefCounterSA.html#a0">OsclRefCounterSA</a>(); 13700224 <a class="code" href="classOsclRefCounterSA.html#a0">OsclRefCounterSA</a>(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterSA.html">OsclRefCounterSA<DeallocType></a>& x); 13800225 <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); 13900226 14000227 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; 14100228 uint32 refcnt; 14200229 }; 14300230 14400235 <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> 14600237 { 14700238 <span class="keyword">public</span>: 14800239 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) : 15000261 ptr(p), deallocator(dealloc), refcnt(1) 15100262 { 15200263 <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>); 15300264 } 15400265 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>() {} 15600271 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>() 15800276 { 15900277 lock.Lock(); 16000278 ++refcnt; 16100279 lock.Unlock(); 16200280 } 16300281 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>() 16500286 { 16600287 lock.Lock(); 16700288 <span class="keywordflow">if</span> (--refcnt == 0) 16800289 { 16900290 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) 17000291 { 17100292 17200293 <span class="comment">// buffer is part of the refcounter</span> 17300294 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(<span class="keyword">this</span>); 17400295 } 17500296 <span class="keywordflow">else</span> 17600297 { 17700298 <span class="comment">// delete the buffer and the refcounter object</span> 17800299 deallocator-><a class="code" href="classOsclDestructDealloc.html#a0">destruct_and_dealloc</a>(ptr); 17900300 <span class="keyword">delete</span>(this); 18000301 } 18100302 } 18200303 <span class="keywordflow">else</span> 18300304 { 18400305 lock.Unlock(); 18500306 } 18600307 } 18700308 188<a name="l00312"></a><a class="code" href="classOsclRefCounterMTDA.html#a4">00312</a> uint32 <a class="code" href="classOsclRefCounterMTDA.html#a4">getCount</a>() 18900313 { 19000314 <span class="keywordflow">return</span> refcnt; 19100315 } 19200316 19300317 <span class="keyword">private</span>: 19400318 <a class="code" href="classOsclRefCounterMTDA.html#a0">OsclRefCounterMTDA</a>(); 19500319 <a class="code" href="classOsclRefCounterMTDA.html#a0">OsclRefCounterMTDA</a>(<span class="keyword">const</span> <a class="code" href="classOsclRefCounterMTDA.html">OsclRefCounterMTDA<LockType></a>& x); 19600320 <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); 19700321 19800322 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; 19900323 <a class="code" href="classOsclDestructDealloc.html">OsclDestructDealloc</a> *deallocator; 20000324 LockType lock; 20100325 uint32 refcnt; 20200326 }; 20300327 20400328 20500333 <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> 20700335 { 20800336 <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) : 21000354 ptr(p), refcnt(1) 21100355 { 21200356 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(ptr != <a class="code" href="group__osclbase.html#a81">NULL</a>); 21300357 } 21400358 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>() {} 21600364 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>() 21800369 { 21900370 lock.Lock(); 22000371 ++refcnt; 22100372 lock.Unlock(); 22200373 } 22300374 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>() 22500379 { 22600380 lock.Lock(); 22700381 <span class="keywordflow">if</span> (--refcnt == 0) 22800382 { 22900383 <span class="keywordflow">if</span> (ptr == <span class="keyword">this</span>) 23000384 { 23100385 <span class="comment">// buffer is part of the refcounter</span> 23200386 DeallocType deallocator; 23300387 deallocator.destruct_and_dealloc(<span class="keyword">this</span>); 23400388 } 23500389 <span class="keywordflow">else</span> 23600390 { 23700391 23800392 <span class="comment">// delete the buffer and the recounter object</span> 23900393 DeallocType deallocator; 24000394 deallocator.destruct_and_dealloc(ptr); 24100395 <span class="keyword">delete</span>(this); 24200396 } 24300397 } 24400398 <span class="keywordflow">else</span> 24500399 { 24600400 lock.Unlock(); 24700401 } 24800402 } 24900403 250<a name="l00407"></a><a class="code" href="classOsclRefCounterMTSA.html#a4">00407</a> uint32 <a class="code" href="classOsclRefCounterMTSA.html#a4">getCount</a>() 25100408 { 25200409 <span class="keywordflow">return</span> refcnt; 25300410 } 25400411 25500412 <span class="keyword">private</span>: 25600413 <a class="code" href="classOsclRefCounterMTSA.html#a0">OsclRefCounterMTSA</a>(); 25700414 <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); 25800415 <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); 25900416 26000417 <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr; 26100418 LockType lock; 26200419 uint32 refcnt; 26300420 }; 26400421 26500426 <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 26700428 { 26800429 <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>() 27000433 { 27100434 DefAlloc alloc; 27200435 <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>)); 27300436 <span class="keywordflow">return</span> <span class="keyword">new</span>(p) <a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>(); 27400437 } 27500438 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>() 27700442 { 27800443 <a class="code" href="classOscl__DefAllocWithRefCounter.html#a2">removeRef</a>(); 27900444 } 28000445 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>() 28200447 { 28300448 refcount++; 28400449 } 28500450 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>() 28700452 { 28800453 --refcount; 28900454 <span class="keywordflow">if</span> (refcount == 0) 29000455 DefAlloc::deallocate(<span class="keyword">this</span>); 29100456 } 29200457 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>() 29400459 { 29500460 <span class="keywordflow">return</span> refcount; 29600461 } 29700462 29800463 <span class="keyword">private</span>: 29900464 <a class="code" href="classOscl__DefAllocWithRefCounter.html">Oscl_DefAllocWithRefCounter</a>(): refcount(1) 30000465 {} 30100466 uint32 refcount; 30200467 }; 30300468 30400472 <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