aboutsummaryrefslogtreecommitdiff
path: root/doc/oscl_html/oscl__error__imp__jumps_8h_source.html
blob: 0b4aa4c37b7878b2b5c3f2b22b4de28081a71b88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>oscl: oscl_error_imp_jumps.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.3 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
<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 class="fragment"><a name="l00001"></a>00001 <span class="comment">// -*- c++ -*-</span>
<a name="l00002"></a>00002 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span>
<a name="l00003"></a>00003 
<a name="l00004"></a>00004 <span class="comment">//               O S C L _ E R R O R _ I M P _ J U M P S</span>
<a name="l00005"></a>00005 
<a name="l00006"></a>00006 <span class="comment">// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =</span>
<a name="l00007"></a>00007 
<a name="l00018"></a>00018 <span class="preprocessor">#ifndef OSCL_ERROR_IMP_JUMPS_H_INCLUDED</span>
<a name="l00019"></a>00019 <span class="preprocessor"></span><span class="preprocessor">#define OSCL_ERROR_IMP_JUMPS_H_INCLUDED</span>
<a name="l00020"></a>00020 <span class="preprocessor"></span>
<a name="l00021"></a>00021 <span class="preprocessor">#ifndef OSCL_ERROR_TRAPCLEANUP_H_INCLUDED</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#include &quot;<a class="code" href="oscl__error__trapcleanup_8h.html" title="OSCL Error trap and cleanup implementation include file.">oscl_error_trapcleanup.h</a>&quot;</span>
<a name="l00023"></a>00023 <span class="preprocessor">#endif</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#ifndef OSCL_ASSERT_H_INCLUDED</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include &quot;<a class="code" href="oscl__assert_8h.html" title="The file oscl_assert.h provides an OSCL_ASSERT macro to document assumptions and...">oscl_assert.h</a>&quot;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#endif</span>
<a name="l00027"></a>00027 <span class="preprocessor"></span>
<a name="l00028"></a>00028 <span class="comment">// Implemenation of Leave using Setjmp / Longjmp.</span>
<a name="l00029"></a>00029 
<a name="l00030"></a>00030 <span class="comment">//ANSI setjmp/longjmp implementation.  This is needed on any OS</span>
<a name="l00031"></a>00031 <span class="comment">//that does not support C++ exceptions.  This is a complete implementation.</span>
<a name="l00032"></a>00032 
<a name="l00033"></a>00033 <span class="preprocessor">#ifndef OSCLCONFIG_ERROR_H_INCLUDED</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#include &quot;<a class="code" href="osclconfig__error_8h.html" title="This file contains the common typedefs and header files needed to compile osclerror...">osclconfig_error.h</a>&quot;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#endif</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span>
<a name="l00037"></a>00037 <span class="preprocessor">#ifndef OSCL_ERROR_TRAPCLEANUP_H_INCLUDED</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#include &quot;<a class="code" href="oscl__error__trapcleanup_8h.html" title="OSCL Error trap and cleanup implementation include file.">oscl_error_trapcleanup.h</a>&quot;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#endif</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#ifndef OSCL_DEFALLOC_H_INCLUDED</span>
<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#include &quot;<a class="code" href="oscl__defalloc_8h.html" title="The file defines simple default memory allocator classes. These allocators are used...">oscl_defalloc.h</a>&quot;</span>
<a name="l00042"></a>00042 <span class="preprocessor">#endif</span>
<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#ifndef OSCL_ERROR_H_INCLUDED</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#include &quot;<a class="code" href="oscl__error_8h.html" title="OSCL Error trap and cleanup include file.">oscl_error.h</a>&quot;</span>
<a name="l00045"></a>00045 <span class="preprocessor">#endif</span>
<a name="l00046"></a>00046 <span class="preprocessor"></span>
<a name="l00047"></a>00047 <span class="keyword">class </span><a class="code" href="classOscl__DefAlloc.html">Oscl_DefAlloc</a>;
<a name="l00048"></a>00048 
<a name="l00049"></a>00049 <span class="comment">//this defines the maximum depth of the jump mark stack.</span>
<a name="l00050"></a><a class="code" href="group__osclerror.html#ga63901c1d9641c77fc791b7e9bb2cf09b">00050</a> <span class="preprocessor">#define OSCL_JUMP_MAX_JUMP_MARKS OSCL_MAX_TRAP_LEVELS</span>
<a name="l00051"></a>00051 <span class="preprocessor"></span>
<a name="l00052"></a>00052 
<a name="l00053"></a>00053 <span class="comment">//OsclJump class</span>
<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>
<a name="l00055"></a>00055 {
<a name="l00056"></a>00056     <span class="keyword">public</span>:
<a name="l00057"></a>00057         <span class="comment">//for use in macros only.</span>
<a name="l00058"></a>00058 
<a name="l00059"></a>00059         <a class="code" href="osclconfig_8h.html#a6de0f53c5c11f8f53ce72c70d74d9abc">OSCL_IMPORT_REF</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classOsclJump.html#a973d5500ac460d429fd1b59c6d900a70">StaticJump</a>(<span class="keywordtype">int</span> a);
<a name="l00060"></a>00060 
<a name="l00061"></a><a class="code" href="classOsclJump.html#aa279334b6e3beffa971e8e6653eddab0">00061</a>         <span class="keywordtype">void</span> <a class="code" href="classOsclJump.html#aa279334b6e3beffa971e8e6653eddab0">Jump</a>(<span class="keywordtype">int</span> a)
<a name="l00062"></a>00062         {
<a name="l00063"></a>00063             <span class="keywordflow">if</span> (!<a class="code" href="classOsclJump.html#ac9be7d30039e73a5101f5a90c75d0d3a">Top</a>())
<a name="l00064"></a>00064             {
<a name="l00065"></a>00065                 <span class="comment">//Note: you can&#39;t leave here, since leave would</span>
<a name="l00066"></a>00066                 <span class="comment">//invoke this routine again.  It is not safe to return</span>
<a name="l00067"></a>00067                 <span class="comment">//either, because calling code is expecting an execution</span>
<a name="l00068"></a>00068                 <span class="comment">//end.</span>
<a name="l00069"></a>00069                 <a class="code" href="group__osclbase.html#gaf7c21e5b6e4fee4247225dd31f89c8ca">OSCL_ASSERT</a>(<span class="keyword">false</span>);
<a name="l00070"></a>00070                 <a class="code" href="group__osclbase.html#ga97188d2c6248adc3fef36f483696a332" title="This function terminates the current process abnormally.">_OSCL_Abort</a>();
<a name="l00071"></a>00071             }
<a name="l00072"></a>00072             longjmp(*<a class="code" href="classOsclJump.html#ac9be7d30039e73a5101f5a90c75d0d3a">Top</a>(), a);
<a name="l00073"></a>00073         }
<a name="l00074"></a>00074 
<a name="l00075"></a><a class="code" href="classOsclJump.html#ac9be7d30039e73a5101f5a90c75d0d3a">00075</a>         jmp_buf *<a class="code" href="classOsclJump.html#ac9be7d30039e73a5101f5a90c75d0d3a">Top</a>()
<a name="l00076"></a>00076         {
<a name="l00077"></a>00077             <a class="code" href="group__osclbase.html#gaf7c21e5b6e4fee4247225dd31f89c8ca">OSCL_ASSERT</a>(iJumpIndex &gt;= 0);
<a name="l00078"></a>00078             <span class="keywordflow">return</span> &amp;iJumpArray[iJumpIndex];
<a name="l00079"></a>00079         }
<a name="l00080"></a>00080 
<a name="l00081"></a><a class="code" href="classOsclJump.html#a7743ed76cd27703b8a4ce4fb3b488bd7">00081</a>         <a class="code" href="classOsclJump.html#a7743ed76cd27703b8a4ce4fb3b488bd7">~OsclJump</a>()
<a name="l00082"></a>00082         {
<a name="l00083"></a>00083             <span class="comment">//jump mark stack should be empty at this point.</span>
<a name="l00084"></a>00084             <a class="code" href="group__osclbase.html#gaf7c21e5b6e4fee4247225dd31f89c8ca">OSCL_ASSERT</a>(iJumpIndex == (-1));
<a name="l00085"></a>00085         }
<a name="l00086"></a>00086 
<a name="l00087"></a>00087     <span class="keyword">private</span>:
<a name="l00088"></a>00088         <a class="code" href="classOsclJump.html">OsclJump</a>(): iJumpIndex(-1) {}
<a name="l00089"></a>00089 
<a name="l00090"></a>00090         <span class="keywordtype">void</span> PushMark()
<a name="l00091"></a>00091         {
<a name="l00092"></a>00092             <a class="code" href="group__osclbase.html#gaf7c21e5b6e4fee4247225dd31f89c8ca">OSCL_ASSERT</a>(iJumpIndex &lt; (<a class="code" href="group__osclerror.html#ga63901c1d9641c77fc791b7e9bb2cf09b">OSCL_JUMP_MAX_JUMP_MARKS</a> - 1));<span class="comment">//jump stack is full!</span>
<a name="l00093"></a>00093             iJumpIndex++;
<a name="l00094"></a>00094         }
<a name="l00095"></a>00095 
<a name="l00096"></a>00096         <span class="keywordtype">void</span> PopMark()
<a name="l00097"></a>00097         {
<a name="l00098"></a>00098             <a class="code" href="group__osclbase.html#gaf7c21e5b6e4fee4247225dd31f89c8ca">OSCL_ASSERT</a>(iJumpIndex &gt;= 0);<span class="comment">//jump stack is empty!</span>
<a name="l00099"></a>00099             iJumpIndex--;
<a name="l00100"></a>00100         }
<a name="l00101"></a>00101 
<a name="l00102"></a>00102         jmp_buf iJumpArray[<a class="code" href="group__osclerror.html#ga63901c1d9641c77fc791b7e9bb2cf09b">OSCL_JUMP_MAX_JUMP_MARKS</a>];
<a name="l00103"></a>00103 
<a name="l00104"></a>00104         <span class="comment">//index to top of stack, or (-1) when stack is empty</span>
<a name="l00105"></a>00105         int32 iJumpIndex;
<a name="l00106"></a>00106 
<a name="l00107"></a><a class="code" href="classOsclJump.html#a6fbbe12e760047ffa52b7f42f2b0a5a7">00107</a>         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classOsclErrorTrapImp.html">OsclErrorTrapImp</a>;
<a name="l00108"></a>00108 };
<a name="l00109"></a>00109 
<a name="l00110"></a>00110 
<a name="l00111"></a>00111 <span class="comment">//internal jump type codes.</span>
<a name="l00112"></a><a class="code" href="group__osclerror.html#gab9968cc0a0a2328cb2b2c30bcd2c5847">00112</a> <span class="preprocessor">#define internalLeave (-1)</span>
<a name="l00113"></a>00113 <span class="preprocessor"></span>
<a name="l00114"></a>00114 <span class="comment">//Leave uses the OsclJump methods</span>
<a name="l00115"></a><a class="code" href="group__osclerror.html#ga6905eff15f5430b4131a7d83c82f049d">00115</a> <span class="preprocessor">#define PVError_DoLeave() OsclJump::StaticJump(internalLeave)</span>
<a name="l00116"></a>00116 <span class="preprocessor"></span>
<a name="l00117"></a>00117 <span class="comment">//_PV_TRAP macro catches leaves.</span>
<a name="l00118"></a>00118 <span class="comment">//_r is leave code, _s is statements to execute.</span>
<a name="l00119"></a><a class="code" href="group__osclerror.html#ga04851440465e223d0f2710135ea661a4">00119</a> <span class="preprocessor">#define _PV_TRAP(__r,__s)\</span>
<a name="l00120"></a>00120 <span class="preprocessor">    __r=OsclErrNone;\</span>
<a name="l00121"></a>00121 <span class="preprocessor">    {\</span>
<a name="l00122"></a>00122 <span class="preprocessor">        OsclErrorTrapImp* __trap=OsclErrorTrapImp::Trap();\</span>
<a name="l00123"></a>00123 <span class="preprocessor">        if(!__trap){__s;}else{\</span>
<a name="l00124"></a>00124 <span class="preprocessor">        int __tr=setjmp(*(__trap-&gt;iJumpData-&gt;Top()));\</span>
<a name="l00125"></a>00125 <span class="preprocessor">        if (__tr==0)\</span>
<a name="l00126"></a>00126 <span class="preprocessor">        {__s;}\</span>
<a name="l00127"></a>00127 <span class="preprocessor">        else if (__tr==internalLeave)\</span>
<a name="l00128"></a>00128 <span class="preprocessor">        {__r=__trap-&gt;iLeave;}\</span>
<a name="l00129"></a>00129 <span class="preprocessor">        __trap-&gt;UnTrap();}\</span>
<a name="l00130"></a>00130 <span class="preprocessor">    }</span>
<a name="l00131"></a>00131 <span class="preprocessor"></span>
<a name="l00132"></a>00132 <span class="comment">//Same as _PV_TRAP but avoids a TLS lookup.</span>
<a name="l00133"></a>00133 <span class="comment">// __trapimp is the OsclErrorTrapImp* for the calling thread.</span>
<a name="l00134"></a><a class="code" href="group__osclerror.html#gae93e1c9a624029fa749b929f9c9c9158">00134</a> <span class="preprocessor">#define _PV_TRAP_NO_TLS(__trapimp,__r,__s)\</span>
<a name="l00135"></a>00135 <span class="preprocessor">    __r=OsclErrNone;\</span>
<a name="l00136"></a>00136 <span class="preprocessor">    {\</span>
<a name="l00137"></a>00137 <span class="preprocessor">        OsclErrorTrapImp* __trap=OsclErrorTrapImp::TrapNoTls(__trapimp);\</span>
<a name="l00138"></a>00138 <span class="preprocessor">        if(!__trap){__s;}else{\</span>
<a name="l00139"></a>00139 <span class="preprocessor">        int __tr=setjmp(*(__trap-&gt;iJumpData-&gt;Top()));\</span>
<a name="l00140"></a>00140 <span class="preprocessor">        if (__tr==0)\</span>
<a name="l00141"></a>00141 <span class="preprocessor">        {__s;}\</span>
<a name="l00142"></a>00142 <span class="preprocessor">        else if (__tr==internalLeave)\</span>
<a name="l00143"></a>00143 <span class="preprocessor">        {__r=__trap-&gt;iLeave;}\</span>
<a name="l00144"></a>00144 <span class="preprocessor">        __trap-&gt;UnTrap();}\</span>
<a name="l00145"></a>00145 <span class="preprocessor">    }</span>
<a name="l00146"></a>00146 <span class="preprocessor"></span>
<a name="l00147"></a>00147 
<a name="l00148"></a>00148 <span class="preprocessor">#endif // OSCL_ERROR_IMP_JUMPS_H_INCLUDED</span>
<a name="l00149"></a>00149 <span class="preprocessor"></span>
</pre></div></div>
<hr size="1"><img src="pvlogo_small.jpg"><address style="align: right;"><small>OSCL API</small>
<address style="align: left;"><small>Posting Version: CORE_9.005.1.1 </small>
</small></address>
</body>
</html>