Home | History | Annotate | Download | only in oscl_html
      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>
     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> &amp;&amp; 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-&gt;<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-&gt;<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>&amp; x);
     83 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);
     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>&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>
     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&lt;DeallocType&gt;</a>&amp; x);
    138 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);
    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>&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>
    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> &amp;&amp; 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-&gt;<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-&gt;<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&lt;LockType&gt;</a>&amp; x);
    196 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);
    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>&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>
    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&lt;DeallocType, LockType&gt;</a>&amp; x);
    258 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);
    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>&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
    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