• 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_error_imp_jumps.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_error_imp_jumps.h</h1><a href="oscl__error__imp__jumps_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 _ E R R O R _ I M P _ J U M P S</span>
1300005
1400006 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span>
1500007
1600018 <span class="preprocessor">#ifndef OSCL_ERROR_IMP_JUMPS_H_INCLUDED</span>
1700019 <span class="preprocessor"></span><span class="preprocessor">#define OSCL_ERROR_IMP_JUMPS_H_INCLUDED</span>
1800020 <span class="preprocessor"></span>
1900021 <span class="preprocessor">#ifndef OSCL_ERROR_TRAPCLEANUP_H_INCLUDED</span>
2000022 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__error__trapcleanup_8h.html">oscl_error_trapcleanup.h</a>"</span>
2100023 <span class="preprocessor">#endif</span>
2200024 <span class="preprocessor"></span><span class="preprocessor">#ifndef OSCL_ASSERT_H_INCLUDED</span>
2300025 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__assert_8h.html">oscl_assert.h</a>"</span>
2400026 <span class="preprocessor">#endif</span>
2500027 <span class="preprocessor"></span>
2600028 <span class="comment">// Implemenation of Leave using Setjmp / Longjmp.</span>
2700029
2800030 <span class="comment">//ANSI setjmp/longjmp implementation.  This is needed on any OS</span>
2900031 <span class="comment">//that does not support C++ exceptions.  This is a complete implementation.</span>
3000032
3100033 <span class="preprocessor">#ifndef OSCLCONFIG_ERROR_H_INCLUDED</span>
3200034 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="osclconfig__error_8h.html">osclconfig_error.h</a>"</span>
3300035 <span class="preprocessor">#endif</span>
3400036 <span class="preprocessor"></span>
3500037 <span class="preprocessor">#ifndef OSCL_ERROR_TRAPCLEANUP_H_INCLUDED</span>
3600038 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__error__trapcleanup_8h.html">oscl_error_trapcleanup.h</a>"</span>
3700039 <span class="preprocessor">#endif</span>
3800040 <span class="preprocessor"></span><span class="preprocessor">#ifndef OSCL_DEFALLOC_H_INCLUDED</span>
3900041 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__defalloc_8h.html">oscl_defalloc.h</a>"</span>
4000042 <span class="preprocessor">#endif</span>
4100043 <span class="preprocessor"></span><span class="preprocessor">#ifndef OSCL_ERROR_H_INCLUDED</span>
4200044 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="oscl__error_8h.html">oscl_error.h</a>"</span>
4300045 <span class="preprocessor">#endif</span>
4400046 <span class="preprocessor"></span>
4500047 <span class="keyword">class </span><a class="code" href="classOscl__DefAlloc.html">Oscl_DefAlloc</a>;
4600048
4700049 <span class="comment">//this defines the maximum depth of the jump mark stack.</span>
48<a name="l00050"></a><a class="code" href="group__osclerror.html#a41">00050</a> <span class="preprocessor">#define OSCL_JUMP_MAX_JUMP_MARKS OSCL_MAX_TRAP_LEVELS</span>
4900051 <span class="preprocessor"></span>
5000052
5100053 <span class="comment">//OsclJump class</span>
52<a name="l00054"></a><a class="code" href="classOsclJump.html">00054</a> <span class="keyword">class </span><a class="code" href="classOsclJump.html">OsclJump</a>
5300055 {
5400056     <span class="keyword">public</span>:
5500057         <span class="comment">//for use in macros only.</span>
5600058
5700059         OSCL_IMPORT_REF <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classOsclJump.html#d0">StaticJump</a>(<span class="keywordtype">int</span> a);
5800060
59<a name="l00061"></a><a class="code" href="classOsclJump.html#a0">00061</a>         <span class="keywordtype">void</span> <a class="code" href="classOsclJump.html#a0">Jump</a>(<span class="keywordtype">int</span> a)
6000062         {
6100063             <span class="keywordflow">if</span> (!<a class="code" href="classOsclJump.html#a1">Top</a>())
6200064             {
6300065                 <span class="comment">//Note: you can't leave here, since leave would</span>
6400066                 <span class="comment">//invoke this routine again.  It is not safe to return</span>
6500067                 <span class="comment">//either, because calling code is expecting an execution</span>
6600068                 <span class="comment">//end.</span>
6700069                 <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(<span class="keyword">false</span>);
6800070                 <a class="code" href="group__osclbase.html#a34">_OSCL_Abort</a>();
6900071             }
7000072             longjmp(*<a class="code" href="classOsclJump.html#a1">Top</a>(), a);
7100073         }
7200074
73<a name="l00075"></a><a class="code" href="classOsclJump.html#a1">00075</a>         jmp_buf *<a class="code" href="classOsclJump.html#a1">Top</a>()
7400076         {
7500077             <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(iJumpIndex &gt;= 0);
7600078             <span class="keywordflow">return</span> &amp;iJumpArray[iJumpIndex];
7700079         }
7800080
79<a name="l00081"></a><a class="code" href="classOsclJump.html#a2">00081</a>         <a class="code" href="classOsclJump.html#a2">~OsclJump</a>()
8000082         {
8100083             <span class="comment">//jump mark stack should be empty at this point.</span>
8200084             <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(iJumpIndex == (-1));
8300085         }
8400086
8500087     <span class="keyword">private</span>:
8600088         <a class="code" href="classOsclJump.html">OsclJump</a>(): iJumpIndex(-1) {}
8700089
8800090         <span class="keywordtype">void</span> PushMark()
8900091         {
9000092             <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(iJumpIndex &lt; (<a class="code" href="group__osclerror.html#a41">OSCL_JUMP_MAX_JUMP_MARKS</a> - 1));<span class="comment">//jump stack is full!</span>
9100093             iJumpIndex++;
9200094         }
9300095
9400096         <span class="keywordtype">void</span> PopMark()
9500097         {
9600098             <a class="code" href="group__osclbase.html#a78">OSCL_ASSERT</a>(iJumpIndex &gt;= 0);<span class="comment">//jump stack is empty!</span>
9700099             iJumpIndex--;
9800100         }
9900101
10000102         jmp_buf iJumpArray[<a class="code" href="group__osclerror.html#a41">OSCL_JUMP_MAX_JUMP_MARKS</a>];
10100103
10200104         <span class="comment">//index to top of stack, or (-1) when stack is empty</span>
10300105         int32 iJumpIndex;
10400106
105<a name="l00107"></a><a class="code" href="classOsclJump.html#l0">00107</a>         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classOsclErrorTrapImp.html">OsclErrorTrapImp</a>;
10600108 };
10700109
10800110
10900111 <span class="comment">//internal jump type codes.</span>
110<a name="l00112"></a><a class="code" href="group__osclerror.html#a42">00112</a> <span class="preprocessor">#define internalLeave (-1)</span>
11100113 <span class="preprocessor"></span>
11200114 <span class="comment">//Leave uses the OsclJump methods</span>
113<a name="l00115"></a><a class="code" href="oscl__error__imp__jumps_8h.html#a2">00115</a> <span class="preprocessor">#define PVError_DoLeave() OsclJump::StaticJump(internalLeave)</span>
11400116 <span class="preprocessor"></span>
11500117 <span class="comment">//_PV_TRAP macro catches leaves.</span>
11600118 <span class="comment">//_r is leave code, _s is statements to execute.</span>
117<a name="l00119"></a><a class="code" href="oscl__error__imp__jumps_8h.html#a3">00119</a> <span class="preprocessor">#define _PV_TRAP(__r,__s)\</span>
11800120 <span class="preprocessor">        __r=OsclErrNone;\</span>
11900121 <span class="preprocessor">        {\</span>
12000122 <span class="preprocessor">                OsclErrorTrapImp* __trap=OsclErrorTrapImp::Trap();\</span>
12100123 <span class="preprocessor">                if(!__trap){__s;}else{\</span>
12200124 <span class="preprocessor">                int __tr=setjmp(*(__trap-&gt;iJumpData-&gt;Top()));\</span>
12300125 <span class="preprocessor">                if (__tr==0)\</span>
12400126 <span class="preprocessor">                {__s;}\</span>
12500127 <span class="preprocessor">                else if (__tr==internalLeave)\</span>
12600128 <span class="preprocessor">                {__r=__trap-&gt;iLeave;}\</span>
12700129 <span class="preprocessor">                __trap-&gt;UnTrap();}\</span>
12800130 <span class="preprocessor">        }</span>
12900131 <span class="preprocessor"></span>
13000132 <span class="comment">//Same as _PV_TRAP but avoids a TLS lookup.</span>
13100133 <span class="comment">// __trapimp is the OsclErrorTrapImp* for the calling thread.</span>
132<a name="l00134"></a><a class="code" href="oscl__error__imp__jumps_8h.html#a4">00134</a> <span class="preprocessor">#define _PV_TRAP_NO_TLS(__trapimp,__r,__s)\</span>
13300135 <span class="preprocessor">        __r=OsclErrNone;\</span>
13400136 <span class="preprocessor">        {\</span>
13500137 <span class="preprocessor">                OsclErrorTrapImp* __trap=OsclErrorTrapImp::TrapNoTls(__trapimp);\</span>
13600138 <span class="preprocessor">                if(!__trap){__s;}else{\</span>
13700139 <span class="preprocessor">                int __tr=setjmp(*(__trap-&gt;iJumpData-&gt;Top()));\</span>
13800140 <span class="preprocessor">                if (__tr==0)\</span>
13900141 <span class="preprocessor">                {__s;}\</span>
14000142 <span class="preprocessor">                else if (__tr==internalLeave)\</span>
14100143 <span class="preprocessor">                {__r=__trap-&gt;iLeave;}\</span>
14200144 <span class="preprocessor">                __trap-&gt;UnTrap();}\</span>
14300145 <span class="preprocessor">        }</span>
14400146 <span class="preprocessor"></span>
14500147
14600148 <span class="preprocessor">#endif // OSCL_ERROR_IMP_JUMPS_H_INCLUDED</span>
14700149 <span class="preprocessor"></span>
148</pre></div><hr size="1"><img src="pvlogo_small.jpg"><address style="align: right;"><small>OSCL API</small>
149<address style="align: left;"><small>Posting Version: OPENCORE_20090310 </small>
150</small></address>
151</body>
152</html>
153