• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &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>
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> &amp;&amp; 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-&gt;<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-&gt;<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>&amp; x);
8300137         <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);
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>&lt;<span class="keyword">class</span> DeallocType&gt;
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&lt;DeallocType&gt;</a>&amp; x);
13800225         <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);
13900226
14000227         <a class="code" href="group__osclbase.html#a25">OsclAny</a> *ptr;
14100228         uint32 refcnt;
14200229 };
14300230
14400235 <span class="keyword">template</span>&lt;<span class="keyword">class</span> LockType&gt;
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> &amp;&amp; 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-&gt;<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-&gt;<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&lt;LockType&gt;</a>&amp; x);
19600320         <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);
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>&lt;<span class="keyword">class</span> DeallocType, <span class="keyword">class</span> LockType&gt;
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&lt;DeallocType, LockType&gt;</a>&amp; x);
25800415         <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);
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>&lt;<span class="keyword">class</span> DefAlloc&gt;
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