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> <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_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 >= 0); 7600078 <span class="keywordflow">return</span> &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 < (<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 >= 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->iJumpData->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->iLeave;}\</span> 12700129 <span class="preprocessor"> __trap->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->iJumpData->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->iLeave;}\</span> 14200144 <span class="preprocessor"> __trap->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