comparison packages/compat/uitron/current/include/uit_func.inl @ 2:443894e2e912 ecos-v1_2_1-release

Block commit of eCos version 1.2.1
author jlarmour
date Tue, 11 May 1999 12:24:34 +0000
parents 3111d98ba7b3
children ece80412419a
comparison
equal deleted inserted replaced
1:72f549f0d891 2:443894e2e912
1 #ifndef CYGONCE_COMPAT_UITRON_UIT_FUNC_INL 1 #ifndef CYGONCE_COMPAT_UITRON_UIT_FUNC_INL
2 #define CYGONCE_COMPAT_UITRON_UIT_FUNC_INL 2 #define CYGONCE_COMPAT_UITRON_UIT_FUNC_INL
3 //=========================================================================== 3 //===========================================================================
4 // 4 //
5 // uit_func.inl 5 // uit_func.inl
6 // 6 //
7 // uITRON compatibility functions 7 // uITRON compatibility functions
8 // 8 //
9 //=========================================================================== 9 //===========================================================================
10 //####COPYRIGHTBEGIN#### 10 //####COPYRIGHTBEGIN####
11 // 11 //
12 // ------------------------------------------- 12 // -------------------------------------------
22 // 22 //
23 // The Original Code is eCos - Embedded Cygnus Operating System, released 23 // The Original Code is eCos - Embedded Cygnus Operating System, released
24 // September 30, 1998. 24 // September 30, 1998.
25 // 25 //
26 // The Initial Developer of the Original Code is Cygnus. Portions created 26 // The Initial Developer of the Original Code is Cygnus. Portions created
27 // by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. 27 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
28 // ------------------------------------------- 28 // -------------------------------------------
29 // 29 //
30 //####COPYRIGHTEND#### 30 //####COPYRIGHTEND####
31 //=========================================================================== 31 //===========================================================================
32 //#####DESCRIPTIONBEGIN#### 32 //#####DESCRIPTIONBEGIN####
33 // 33 //
34 // Author(s): hmt 34 // Author(s): hmt
35 // Contributors: hmt 35 // Contributors: hmt
36 // Date: 1998-03-13 36 // Date: 1998-03-13
37 // Purpose: uITRON compatibility functions 37 // Purpose: uITRON compatibility functions
38 // Description: 38 // Description:
39 // 39 //
40 //####DESCRIPTIONEND#### 40 //####DESCRIPTIONEND####
41 // 41 //
42 //=========================================================================== 42 //===========================================================================
43 43
54 // and the implementations of other kernel facilities 54 // and the implementations of other kernel facilities
55 #include <cyg/kernel/thread.inl> 55 #include <cyg/kernel/thread.inl>
56 #include <cyg/kernel/sched.inl> 56 #include <cyg/kernel/sched.inl>
57 #include <cyg/kernel/clock.inl> 57 #include <cyg/kernel/clock.inl>
58 58
59
60 // ------------------------------------------------------------------------
61 // The variable where dis_dsp/ena_dsp state is held:
62 extern cyg_uint32 cyg_uitron_dis_dsp_old_priority;
63
59 // ------------------------------------------------------------------------ 64 // ------------------------------------------------------------------------
60 // Parameter checking; either check the expression and return an error code 65 // Parameter checking; either check the expression and return an error code
61 // if not true, or assert the truth with a made-up message. 66 // if not true, or assert the truth with a made-up message.
62 67
63 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS 68 #ifdef CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
64 // default: uitron error codes are returned 69 // default: uitron error codes are returned
65 #define CYG_UIT_PARAMCHECK( _true_, _error_ ) CYG_MACRO_START \ 70 #define CYG_UIT_PARAMCHECK( _true_, _error_ ) CYG_MACRO_START \
66 if ( ! (_true_) ) return (_error_); \ 71 if ( ! (_true_) ) return (_error_); \
67 CYG_MACRO_END 72 CYG_MACRO_END
68 #else 73 #else
69 // ...but they are asserted if asserts are on 74 // ...but they are asserted if asserts are on
70 #define CYG_UIT_PARAMCHECK( _true_, _error_ ) CYG_MACRO_START \ 75 #define CYG_UIT_PARAMCHECK( _true_, _error_ ) CYG_MACRO_START \
71 CYG_ASSERT( (_true_), "CYG_UIT_PARAMCHECK fail: " #_true_ ); \ 76 CYG_ASSERT( (_true_), "CYG_UIT_PARAMCHECK fail: " #_true_ ); \
72 CYG_MACRO_END 77 CYG_MACRO_END
73 #endif // else !CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS 78 #endif // else !CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS
74 79
75 // ------------------------------------------------------------------------ 80 // ------------------------------------------------------------------------
76 // CYG_UITRON_CHECK_AND_GETP 81 // CYG_UITRON_CHECK_AND_GETP
79 // object; _which_ sort of object is given, and token pasting is used 84 // object; _which_ sort of object is given, and token pasting is used
80 // horribly to get the static array, limits and the like. 85 // horribly to get the static array, limits and the like.
81 // 86 //
82 // Usage: 87 // Usage:
83 // INT snd_msg( ID mbxid, ... ) { 88 // INT snd_msg( ID mbxid, ... ) {
84 // Cyg_Mbox *p; 89 // Cyg_Mbox *p;
85 // CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p ); 90 // CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
86 // p->...(...); 91 // p->...(...);
87 92
88 // internal: plain assignment to the object pointer, from static array 93 // internal: plain assignment to the object pointer, from static array
89 #define CYG_UIT_SPTR( _which_, _idx_, _ptr_ ) CYG_MACRO_START \ 94 #define CYG_UIT_SPTR( _which_, _idx_, _ptr_ ) CYG_MACRO_START \
90 (_ptr_) = CYG_UITRON_OBJS( _which_ ) + ((_idx_) - 1); \ 95 (_ptr_) = CYG_UITRON_OBJS( _which_ ) + ((_idx_) - 1); \
91 CYG_MACRO_END 96 CYG_MACRO_END
92 97
93 // internal: plain assignment to the object pointer, from pointer array 98 // internal: plain assignment to the object pointer, from pointer array
94 // with error checking. 99 // with error checking.
95 #define CYG_UIT_SPTR_PTR( _which_, _idx_, _ptr_ ) CYG_MACRO_START \ 100 #define CYG_UIT_SPTR_PTR( _which_, _idx_, _ptr_ ) CYG_MACRO_START \
96 (_ptr_) = CYG_UITRON_PTRS( _which_ )[ ((_idx_) - 1) ]; \ 101 (_ptr_) = CYG_UITRON_PTRS( _which_ )[ ((_idx_) - 1) ]; \
97 if ( NULL == (_ptr_) ) return E_NOEXS; \ 102 if ( NULL == (_ptr_) ) return E_NOEXS; \
98 CYG_MACRO_END 103 CYG_MACRO_END
99 104
100 #define CYG_UITRON_CHECK_AND_GETP_DIRECT( _which_, _idx_, _ptr_ ) \ 105 #define CYG_UITRON_CHECK_AND_GETP_DIRECT( _which_, _idx_, _ptr_ ) \
101 CYG_MACRO_START \ 106 CYG_MACRO_START \
102 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \ 107 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \
103 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \ 108 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \
104 CYG_UIT_SPTR( _which_, _idx_, _ptr_ ); \ 109 CYG_UIT_SPTR( _which_, _idx_, _ptr_ ); \
105 CYG_MACRO_END 110 CYG_MACRO_END
106 111
107 #define CYG_UITRON_CHECK_AND_GETP_INDIRECT( _which_, _idx_, _ptr_ ) \ 112 #define CYG_UITRON_CHECK_AND_GETP_INDIRECT( _which_, _idx_, _ptr_ ) \
108 CYG_MACRO_START \ 113 CYG_MACRO_START \
109 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \ 114 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \
110 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \ 115 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \
111 CYG_UIT_SPTR_PTR( _which_, _idx_, _ptr_ ); \ 116 CYG_UIT_SPTR_PTR( _which_, _idx_, _ptr_ ); \
112 CYG_MACRO_END 117 CYG_MACRO_END
113 118
114 // As above but for handler numbers which return E_PAR when out of range 119 // As above but for handler numbers which return E_PAR when out of range
115 #define CYG_UITRON_CHECK_AND_GETHDLR( _which_, _num_, _ptr_ ) \ 120 #define CYG_UITRON_CHECK_AND_GETHDLR( _which_, _num_, _ptr_ ) \
116 CYG_MACRO_START \ 121 CYG_MACRO_START \
117 CYG_UIT_PARAMCHECK( 0 < (_num_), E_PAR ); \ 122 CYG_UIT_PARAMCHECK( 0 < (_num_), E_PAR ); \
118 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_num_), E_PAR ); \ 123 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_num_), E_PAR ); \
119 CYG_UIT_SPTR( _which_, _num_, _ptr_ ); \ 124 CYG_UIT_SPTR( _which_, _num_, _ptr_ ); \
120 CYG_MACRO_END 125 CYG_MACRO_END
121 126
122 // And a macro to check that creation of an object is OK 127 // And a macro to check that creation of an object is OK
123 #define CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( _which_, _idx_ ) \ 128 #define CYG_UITRON_CHECK_NO_OBJ_LOCK_SCHED( _which_, _idx_ ) \
124 CYG_MACRO_START \ 129 CYG_MACRO_START \
125 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \ 130 CYG_UIT_PARAMCHECK( 0 < (_idx_), E_ID ); \
126 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \ 131 CYG_UIT_PARAMCHECK( CYG_UITRON_NUM( _which_ ) >= (_idx_), E_ID ); \
127 Cyg_Scheduler::lock(); \ 132 Cyg_Scheduler::lock(); \
128 if ( NULL != CYG_UITRON_PTRS( _which_ )[ ((_idx_) - 1) ] ) { \ 133 if ( NULL != CYG_UITRON_PTRS( _which_ )[ ((_idx_) - 1) ] ) { \
129 Cyg_Scheduler::unlock(); \ 134 Cyg_Scheduler::unlock(); \
130 return E_OBJ; \ 135 return E_OBJ; \
131 } \ 136 } \
132 CYG_MACRO_END 137 CYG_MACRO_END
133 138
134 // define a magic new operator in order to call constructors 139 // define a magic new operator in order to call constructors
135 #define CYG_UITRON_NEWFUNCTION( _class_ ) \ 140 #define CYG_UITRON_NEWFUNCTION( _class_ ) \
136 inline void *operator new(size_t size, _class_ *ptr) \ 141 inline void *operator new(size_t size, _class_ *ptr) \
137 { \ 142 { \
138 CYG_CHECK_DATA_PTR( ptr, "Bad pointer" ); \ 143 CYG_CHECK_DATA_PTR( ptr, "Bad pointer" ); \
139 return ptr; \ 144 return ptr; \
140 } 145 }
141 146
142 // now configury to support selectable create/delete support ie. an 147 // now configury to support selectable create/delete support ie. an
143 // array of pointers to the objects themselves. 148 // array of pointers to the objects themselves.
144 #ifdef CYGPKG_UITRON_TASKS_CREATE_DELETE 149 #ifdef CYGPKG_UITRON_TASKS_CREATE_DELETE
145 #define CYG_UITRON_CHECK_AND_GETP_TASKS( _idx_, _ptr_ ) \ 150 #define CYG_UITRON_CHECK_AND_GETP_TASKS( _idx_, _ptr_ ) \
146 CYG_UITRON_CHECK_AND_GETP_INDIRECT( TASKS, _idx_, _ptr_ ) 151 CYG_UITRON_CHECK_AND_GETP_INDIRECT( TASKS, _idx_, _ptr_ )
147 #else 152 #else
148 #define CYG_UITRON_CHECK_AND_GETP_TASKS( _idx_, _ptr_ ) \ 153 #define CYG_UITRON_CHECK_AND_GETP_TASKS( _idx_, _ptr_ ) \
149 CYG_UITRON_CHECK_AND_GETP_DIRECT( TASKS, _idx_, _ptr_ ) 154 CYG_UITRON_CHECK_AND_GETP_DIRECT( TASKS, _idx_, _ptr_ )
150 #endif 155 #endif
151 156
152 #ifdef CYGPKG_UITRON_SEMAS_CREATE_DELETE 157 #ifdef CYGPKG_UITRON_SEMAS_CREATE_DELETE
153 #define CYG_UITRON_CHECK_AND_GETP_SEMAS( _idx_, _ptr_ ) \ 158 #define CYG_UITRON_CHECK_AND_GETP_SEMAS( _idx_, _ptr_ ) \
154 CYG_UITRON_CHECK_AND_GETP_INDIRECT( SEMAS, _idx_, _ptr_ ) 159 CYG_UITRON_CHECK_AND_GETP_INDIRECT( SEMAS, _idx_, _ptr_ )
155 #else 160 #else
156 #define CYG_UITRON_CHECK_AND_GETP_SEMAS( _idx_, _ptr_ ) \ 161 #define CYG_UITRON_CHECK_AND_GETP_SEMAS( _idx_, _ptr_ ) \
157 CYG_UITRON_CHECK_AND_GETP_DIRECT( SEMAS, _idx_, _ptr_ ) 162 CYG_UITRON_CHECK_AND_GETP_DIRECT( SEMAS, _idx_, _ptr_ )
158 #endif 163 #endif
159 164
160 #ifdef CYGPKG_UITRON_MBOXES_CREATE_DELETE 165 #ifdef CYGPKG_UITRON_MBOXES_CREATE_DELETE
161 #define CYG_UITRON_CHECK_AND_GETP_MBOXES( _idx_, _ptr_ ) \ 166 #define CYG_UITRON_CHECK_AND_GETP_MBOXES( _idx_, _ptr_ ) \
162 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MBOXES, _idx_, _ptr_ ) 167 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MBOXES, _idx_, _ptr_ )
163 #else 168 #else
164 #define CYG_UITRON_CHECK_AND_GETP_MBOXES( _idx_, _ptr_ ) \ 169 #define CYG_UITRON_CHECK_AND_GETP_MBOXES( _idx_, _ptr_ ) \
165 CYG_UITRON_CHECK_AND_GETP_DIRECT( MBOXES, _idx_, _ptr_ ) 170 CYG_UITRON_CHECK_AND_GETP_DIRECT( MBOXES, _idx_, _ptr_ )
166 #endif 171 #endif
167 172
168 #ifdef CYGPKG_UITRON_FLAGS_CREATE_DELETE 173 #ifdef CYGPKG_UITRON_FLAGS_CREATE_DELETE
169 #define CYG_UITRON_CHECK_AND_GETP_FLAGS( _idx_, _ptr_ ) \ 174 #define CYG_UITRON_CHECK_AND_GETP_FLAGS( _idx_, _ptr_ ) \
170 CYG_UITRON_CHECK_AND_GETP_INDIRECT( FLAGS, _idx_, _ptr_ ) 175 CYG_UITRON_CHECK_AND_GETP_INDIRECT( FLAGS, _idx_, _ptr_ )
171 #else 176 #else
172 #define CYG_UITRON_CHECK_AND_GETP_FLAGS( _idx_, _ptr_ ) \ 177 #define CYG_UITRON_CHECK_AND_GETP_FLAGS( _idx_, _ptr_ ) \
173 CYG_UITRON_CHECK_AND_GETP_DIRECT( FLAGS, _idx_, _ptr_ ) 178 CYG_UITRON_CHECK_AND_GETP_DIRECT( FLAGS, _idx_, _ptr_ )
174 #endif 179 #endif
175 180
176 #ifdef CYGPKG_UITRON_MEMPOOLFIXED_CREATE_DELETE 181 #ifdef CYGPKG_UITRON_MEMPOOLFIXED_CREATE_DELETE
177 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( _idx_, _ptr_ ) \ 182 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( _idx_, _ptr_ ) \
178 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MEMPOOLFIXED, _idx_, _ptr_ ) 183 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MEMPOOLFIXED, _idx_, _ptr_ )
179 #else 184 #else
180 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( _idx_, _ptr_ ) \ 185 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( _idx_, _ptr_ ) \
181 CYG_UITRON_CHECK_AND_GETP_DIRECT( MEMPOOLFIXED, _idx_, _ptr_ ) 186 CYG_UITRON_CHECK_AND_GETP_DIRECT( MEMPOOLFIXED, _idx_, _ptr_ )
182 #endif 187 #endif
183 188
184 #ifdef CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETE 189 #ifdef CYGPKG_UITRON_MEMPOOLVAR_CREATE_DELETE
185 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( _idx_, _ptr_ ) \ 190 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( _idx_, _ptr_ ) \
186 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MEMPOOLVAR, _idx_, _ptr_ ) 191 CYG_UITRON_CHECK_AND_GETP_INDIRECT( MEMPOOLVAR, _idx_, _ptr_ )
187 #else 192 #else
188 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( _idx_, _ptr_ ) \ 193 #define CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( _idx_, _ptr_ ) \
189 CYG_UITRON_CHECK_AND_GETP_DIRECT( MEMPOOLVAR, _idx_, _ptr_ ) 194 CYG_UITRON_CHECK_AND_GETP_DIRECT( MEMPOOLVAR, _idx_, _ptr_ )
190 #endif 195 #endif
191 196
192 // ------------------------------------------------------------------------ 197 // ------------------------------------------------------------------------
193 // Common error checking macros 198 // Common error checking macros
195 #if !defined( CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS ) && \ 200 #if !defined( CYGSEM_UITRON_BAD_PARAMS_RETURN_ERRORS ) && \
196 !defined( CYGDBG_USE_ASSERTS ) 201 !defined( CYGDBG_USE_ASSERTS )
197 // if not checking and not asserted, these are removed to avoid usused 202 // if not checking and not asserted, these are removed to avoid usused
198 // variable warnings. 203 // variable warnings.
199 #define CYG_UITRON_CHECK_TASK_CONTEXT_SELF( _self_ ) CYG_EMPTY_STATEMENT 204 #define CYG_UITRON_CHECK_TASK_CONTEXT_SELF( _self_ ) CYG_EMPTY_STATEMENT
200 #define CYG_UITRON_CHECK_TASK_CONTEXT() CYG_EMPTY_STATEMENT 205 #define CYG_UITRON_CHECK_TASK_CONTEXT() CYG_EMPTY_STATEMENT
201 #define CYG_UITRON_CHECK_DISPATCH_ENABLED() CYG_EMPTY_STATEMENT 206 #define CYG_UITRON_CHECK_DISPATCH_ENABLED() CYG_EMPTY_STATEMENT
202 #define CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( _tmout_ ) CYG_EMPTY_STATEMENT 207 #define CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO( _tmout_ ) CYG_EMPTY_STATEMENT
203 208
204 #else 209 #else
205 // the default: 210 // the default:
206 // Check a task is actually a uITRON task 211 // Check a task is actually a uITRON task
207 #define CYG_UITRON_CHECK_TASK_CONTEXT_SELF( _self_ ) CYG_MACRO_START \ 212 #define CYG_UITRON_CHECK_TASK_CONTEXT_SELF( _self_ ) CYG_MACRO_START \
208 CYG_UIT_PARAMCHECK( \ 213 CYG_UIT_PARAMCHECK( \
209 (&cyg_uitron_TASKS[0] <= (_self_)) && \ 214 (&cyg_uitron_TASKS[0] <= (_self_)) && \
210 ((_self_) < &cyg_uitron_TASKS[CYGNUM_UITRON_TASKS]), \ 215 ((_self_) < &cyg_uitron_TASKS[CYGNUM_UITRON_TASKS]), \
211 E_CTX ); \ 216 E_CTX ); \
212 CYG_MACRO_END 217 CYG_MACRO_END
213 218
214 #define CYG_UITRON_CHECK_TASK_CONTEXT() CYG_MACRO_START \ 219 #define CYG_UITRON_CHECK_TASK_CONTEXT() CYG_MACRO_START \
215 Cyg_Thread *self = Cyg_Thread::self(); \ 220 Cyg_Thread *self = Cyg_Thread::self(); \
216 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self ); \ 221 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self ); \
217 CYG_MACRO_END 222 CYG_MACRO_END
218 223
219 // Check dispatching is enabled for calls which might wait 224 // Check dispatching is enabled for calls which might wait
220 #define CYG_UITRON_CHECK_DISPATCH_ENABLED() CYG_MACRO_START \ 225 #define CYG_UITRON_CHECK_DISPATCH_ENABLED() CYG_MACRO_START \
221 CYG_UIT_PARAMCHECK( 0 == Cyg_Scheduler::get_sched_lock(), E_CTX ); \ 226 CYG_UIT_PARAMCHECK( 0 == cyg_uitron_dis_dsp_old_priority, E_CTX ); \
222 CYG_MACRO_END 227 CYG_MACRO_END
223 228
224 #define CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO(_tmout_) CYG_MACRO_START \ 229 #define CYG_UITRON_CHECK_DISPATCH_ENABLED_TMO(_tmout_) CYG_MACRO_START \
225 CYG_UIT_PARAMCHECK( -1 <= (_tmout_), E_PAR ); \ 230 CYG_UIT_PARAMCHECK( -1 <= (_tmout_), E_PAR ); \
226 if ( TMO_POL != (_tmout_) ) \ 231 if ( TMO_POL != (_tmout_) ) \
227 CYG_UITRON_CHECK_DISPATCH_ENABLED(); \ 232 CYG_UITRON_CHECK_DISPATCH_ENABLED(); \
228 CYG_MACRO_END 233 CYG_MACRO_END
229 234
230 #endif 235 #endif
231 236
232 #ifdef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR 237 #ifdef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
233 #define CYG_UIT_PARAMCHECK_PTR( _p_ ) CYG_MACRO_START \ 238 #define CYG_UIT_PARAMCHECK_PTR( _p_ ) CYG_MACRO_START \
234 CYG_UIT_PARAMCHECK( NADR != (_p_), E_PAR ); \ 239 CYG_UIT_PARAMCHECK( NADR != (_p_), E_PAR ); \
235 CYG_MACRO_END 240 CYG_MACRO_END
236 #else // do check for NULL 241 #else // do check for NULL
237 #define CYG_UIT_PARAMCHECK_PTR( _p_ ) CYG_MACRO_START \ 242 #define CYG_UIT_PARAMCHECK_PTR( _p_ ) CYG_MACRO_START \
238 CYG_UIT_PARAMCHECK( NADR != (_p_), E_PAR ); \ 243 CYG_UIT_PARAMCHECK( NADR != (_p_), E_PAR ); \
239 CYG_UIT_PARAMCHECK( NULL != (_p_), E_PAR ); \ 244 CYG_UIT_PARAMCHECK( NULL != (_p_), E_PAR ); \
240 CYG_MACRO_END 245 CYG_MACRO_END
241 #endif // !CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR 246 #endif // !CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
242 247
243 // ------------------------------------------------------------------------ 248 // ------------------------------------------------------------------------
244 // CYG_UITRON_FAIL_RETURN 249 // CYG_UITRON_FAIL_RETURN
246 // After a call which waits, it might return with success, or due to a 251 // After a call which waits, it might return with success, or due to a
247 // timeout or a release wait (a forced escape from the waiting condition). 252 // timeout or a release wait (a forced escape from the waiting condition).
248 // This macro examines context and finds out which, then executes a return 253 // This macro examines context and finds out which, then executes a return
249 // with the correct uITRON condition code. 254 // with the correct uITRON condition code.
250 255
251 #define CYG_UITRON_FAIL_RETURN_SELF( _self_ ) CYG_MACRO_START \ 256 #define CYG_UITRON_FAIL_RETURN_SELF( _self_ ) CYG_MACRO_START \
252 Cyg_Thread::cyg_reason reason = (_self_)->get_wake_reason(); \ 257 Cyg_Thread::cyg_reason reason = (_self_)->get_wake_reason(); \
253 if ( Cyg_Thread::TIMEOUT == reason ) \ 258 if ( Cyg_Thread::TIMEOUT == reason ) \
254 return E_TMOUT; \ 259 return E_TMOUT; \
255 if ( Cyg_Thread::BREAK == reason ) \ 260 if ( Cyg_Thread::BREAK == reason ) \
256 return E_RLWAI; \ 261 return E_RLWAI; \
257 if ( Cyg_Thread::DESTRUCT == reason ) \ 262 if ( Cyg_Thread::DESTRUCT == reason ) \
258 return E_DLT; \ 263 return E_DLT; \
259 return E_SYS; /* if no plausible reason was found */ \ 264 return E_SYS; /* if no plausible reason was found */ \
260 CYG_MACRO_END 265 CYG_MACRO_END
261 266
262 #define CYG_UITRON_FAIL_RETURN() CYG_MACRO_START \ 267 #define CYG_UITRON_FAIL_RETURN() CYG_MACRO_START \
263 Cyg_Thread *self = Cyg_Thread::self(); \ 268 Cyg_Thread *self = Cyg_Thread::self(); \
264 CYG_UITRON_FAIL_RETURN_SELF( self ); \ 269 CYG_UITRON_FAIL_RETURN_SELF( self ); \
265 CYG_MACRO_END 270 CYG_MACRO_END
266 271
267 // ------------------------------------------------------------------------ 272 // ------------------------------------------------------------------------
268 // Interrupts disabled? 273 // Interrupts disabled?
269 #define CYG_UITRON_CHECK_CPU_UNLOC() \ 274 #define CYG_UITRON_CHECK_CPU_UNLOC() \
270 CYG_UIT_PARAMCHECK( (Cyg_Interrupt::interrupts_enabled()), E_CTX ) 275 CYG_UIT_PARAMCHECK( (Cyg_Interrupt::interrupts_enabled()), E_CTX )
271 276
272 // ------------------------------------------------------------------------ 277 // ------------------------------------------------------------------------
273 // the function definitions themselves: 278 // the function definitions themselves:
274 279
326 Cyg_Thread *p; 331 Cyg_Thread *p;
327 ER ret = E_OK; 332 ER ret = E_OK;
328 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p ); 333 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
329 334
330 Cyg_Scheduler::lock(); 335 Cyg_Scheduler::lock();
336 // deal with the race condition here
337 if ( p != CYG_UITRON_PTRS( TASKS )[ tskid - 1 ] ) {
338 Cyg_Scheduler::unlock();
339 return E_NOEXS;
340 }
331 cyg_uint32 state = p->get_state(); 341 cyg_uint32 state = p->get_state();
332 if ( state & Cyg_Thread::EXITED ) 342 if ( state & Cyg_Thread::EXITED )
333 // just disconnect the pointer from its object 343 // just disconnect the pointer from its object
334 CYG_UITRON_PTRS( TASKS )[ tskid - 1 ] = NULL; 344 CYG_UITRON_PTRS( TASKS )[ tskid - 1 ] = NULL;
335 else 345 else
417 #ifdef CYGIMP_THREAD_PRIORITY 427 #ifdef CYGIMP_THREAD_PRIORITY
418 p->set_priority( (cyg_priority) 0 ); 428 p->set_priority( (cyg_priority) 0 );
419 #endif 429 #endif
420 } 430 }
421 Cyg_Scheduler::unlock(); 431 Cyg_Scheduler::unlock();
432 #ifdef CYGIMP_THREAD_PRIORITY
433 if ( (E_OK == ret) && (0 != cyg_uitron_dis_dsp_old_priority) ) {
434 // then dispatching is disabled, so our prio is 0 too
435 Cyg_Thread::yield(); // so let the dying thread run;
436 Cyg_Thread::yield(); // no cost here of making sure.
437 }
438 #endif
422 return ret; 439 return ret;
423 } 440 }
424 441
425 CYG_UIT_FUNC_INLINE 442 CYG_UIT_FUNC_INLINE
426 ER 443 ER
427 dis_dsp ( void ) 444 dis_dsp ( void )
428 { 445 {
429 CYG_UITRON_CHECK_TASK_CONTEXT(); 446 CYG_UITRON_CHECK_TASK_CONTEXT();
430 CYG_UITRON_CHECK_CPU_UNLOC(); 447 CYG_UITRON_CHECK_CPU_UNLOC();
431 // Prevent preemption 448 Cyg_Scheduler::lock();
432 if ( 0 == Cyg_Scheduler::get_sched_lock() ) 449 // Prevent preemption by going up to prio 0
433 Cyg_Scheduler::lock(); 450 if ( 0 == cyg_uitron_dis_dsp_old_priority ) {
451 #ifdef CYGIMP_THREAD_PRIORITY
452 Cyg_Thread *p = Cyg_Thread::self();
453 cyg_uitron_dis_dsp_old_priority = p->get_priority();
454 p->set_priority( 0 );
455 #else
456 cyg_uitron_dis_dsp_old_priority = 1;
457 #endif
458 }
459 Cyg_Scheduler::unlock();
434 return E_OK; 460 return E_OK;
435 } 461 }
436 462
437 CYG_UIT_FUNC_INLINE 463 CYG_UIT_FUNC_INLINE
438 ER 464 ER
439 ena_dsp ( void ) 465 ena_dsp ( void )
440 { 466 {
441 CYG_UITRON_CHECK_TASK_CONTEXT(); 467 CYG_UITRON_CHECK_TASK_CONTEXT();
442 CYG_UITRON_CHECK_CPU_UNLOC(); 468 CYG_UITRON_CHECK_CPU_UNLOC();
443 // Unlock the scheduler (if locked) and maybe switch threads 469 Cyg_Scheduler::lock();
444 if ( 0 < Cyg_Scheduler::get_sched_lock() ) 470 // Enable dispatching (if disabled) and maybe switch threads
445 Cyg_Scheduler::unlock(); 471 if ( 0 != cyg_uitron_dis_dsp_old_priority ) {
472 // We had prevented preemption by going up to prio 0
473 #ifdef CYGIMP_THREAD_PRIORITY
474 Cyg_Thread *p = Cyg_Thread::self();
475 p->set_priority( cyg_uitron_dis_dsp_old_priority );
476 p->to_queue_head(); // to ensure we continue to run
477 // if nobody higher pri
478 #endif
479 cyg_uitron_dis_dsp_old_priority = 0;
480 }
481 Cyg_Scheduler::unlock();
446 CYG_UITRON_CHECK_DISPATCH_ENABLED(); // NB: afterwards! 482 CYG_UITRON_CHECK_DISPATCH_ENABLED(); // NB: afterwards!
447 return E_OK; 483 return E_OK;
448 } 484 }
449 485
450 486
458 p = Cyg_Thread::self(); 494 p = Cyg_Thread::self();
459 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( p ); 495 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( p );
460 } 496 }
461 else 497 else
462 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p ); 498 CYG_UITRON_CHECK_AND_GETP_TASKS( tskid, p );
499
500 CYG_UIT_PARAMCHECK( 0 < tskpri, E_PAR );
463 #ifdef CYGIMP_THREAD_PRIORITY 501 #ifdef CYGIMP_THREAD_PRIORITY
464 #if CYG_THREAD_MAX_PRIORITY < CYG_THREAD_MIN_PRIORITY 502 #if CYG_THREAD_MAX_PRIORITY < CYG_THREAD_MIN_PRIORITY
465 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY <= tskpri && 503 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY <= tskpri &&
466 tskpri <= CYG_THREAD_MIN_PRIORITY, E_PAR ); 504 tskpri <= CYG_THREAD_MIN_PRIORITY, E_PAR );
467 #else 505 #else
468 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY >= tskpri && 506 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY >= tskpri &&
469 tskpri >= CYG_THREAD_MIN_PRIORITY, E_PAR ); 507 tskpri >= CYG_THREAD_MIN_PRIORITY, E_PAR );
470 #endif 508 #endif
509 // Handle changing our own prio specially, if dispatch disabled:
510 if ( 0 != cyg_uitron_dis_dsp_old_priority ) {
511 // our actual prio is 0 now and must remain so:
512 if ( Cyg_Thread::self() == p ) { // by whichever route p was set
513 // set the priority we will return to when dispatch is enabled:
514 cyg_uitron_dis_dsp_old_priority = (cyg_uint32)tskpri;
515 return E_OK;
516 }
517 }
471 Cyg_Scheduler::lock(); 518 Cyg_Scheduler::lock();
472 if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) || 519 if ( (p->get_state() & (Cyg_Thread::EXITED | Cyg_Thread::CREATING)) ||
473 (Cyg_Thread::EXIT == p->get_wake_reason()) ) 520 (Cyg_Thread::EXIT == p->get_wake_reason()) )
474 ret = E_OBJ; // task is dormant 521 ret = E_OBJ; // task is dormant
475 else 522 else
494 tskpri <= CYG_THREAD_MIN_PRIORITY, E_PAR ); 541 tskpri <= CYG_THREAD_MIN_PRIORITY, E_PAR );
495 #else 542 #else
496 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY >= tskpri && 543 CYG_UIT_PARAMCHECK( CYG_THREAD_MAX_PRIORITY >= tskpri &&
497 tskpri >= CYG_THREAD_MIN_PRIORITY, E_PAR ); 544 tskpri >= CYG_THREAD_MIN_PRIORITY, E_PAR );
498 #endif 545 #endif
499 #ifdef CYGSEM_KERNEL_SCHED_MLQUEUE
500 Cyg_Thread::rotate_queue( tskpri ); 546 Cyg_Thread::rotate_queue( tskpri );
501 #endif
502 #endif // CYGIMP_THREAD_PRIORITY got priorities at all? 547 #endif // CYGIMP_THREAD_PRIORITY got priorities at all?
503 return E_OK; 548 return E_OK;
504 } 549 }
505 550
506 CYG_UIT_FUNC_INLINE 551 CYG_UIT_FUNC_INLINE
528 CYG_UIT_FUNC_INLINE 573 CYG_UIT_FUNC_INLINE
529 ER 574 ER
530 get_tid ( ID *p_tskid ) 575 get_tid ( ID *p_tskid )
531 { 576 {
532 Cyg_Thread *self = Cyg_Thread::self(); 577 Cyg_Thread *self = Cyg_Thread::self();
533 CYG_UITRON_CHECK_TASK_CONTEXT_SELF( self );
534 CYG_UIT_PARAMCHECK_PTR( p_tskid ); 578 CYG_UIT_PARAMCHECK_PTR( p_tskid );
535 *p_tskid = (self - (&cyg_uitron_TASKS[0])) + 1; 579 if ( (&cyg_uitron_TASKS[0] <= (self)) &&
580 ((self) < &cyg_uitron_TASKS[CYGNUM_UITRON_TASKS]) )
581 // then I am a uITRON task
582 *p_tskid = (self - (&cyg_uitron_TASKS[0])) + 1;
583 else
584 *p_tskid = 0; // Otherwise, non-task portion
536 return E_OK; 585 return E_OK;
537 } 586 }
538 587
539 CYG_UIT_FUNC_INLINE 588 CYG_UIT_FUNC_INLINE
540 ER 589 ER
572 ? TTS_WAI // WAIT state 621 ? TTS_WAI // WAIT state
573 : 0; // Not sure what's happening here! 622 : 0; // Not sure what's happening here!
574 #ifdef CYGIMP_THREAD_PRIORITY 623 #ifdef CYGIMP_THREAD_PRIORITY
575 if ( TTS_DMT == pk_rtsk->tskstat ) 624 if ( TTS_DMT == pk_rtsk->tskstat )
576 pk_rtsk->tskpri = CYG_UITRON_TASK_INITIAL_PRIORITY( tskid ); 625 pk_rtsk->tskpri = CYG_UITRON_TASK_INITIAL_PRIORITY( tskid );
626 else if ( (TTS_RUN == pk_rtsk->tskstat) &&
627 (0 != cyg_uitron_dis_dsp_old_priority) )
628 // then we are it and dispatching is disabled, so
629 // report our "real" priority - it is 0 in the kernel at the moment
630 pk_rtsk->tskpri = cyg_uitron_dis_dsp_old_priority;
577 else 631 else
578 pk_rtsk->tskpri = p->get_priority(); 632 pk_rtsk->tskpri = p->get_priority();
579 #else 633 #else
580 pk_rtsk->tskpri = -1; // Not applicable 634 pk_rtsk->tskpri = -1; // Not applicable
581 #endif 635 #endif
754 CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p ); 808 CYG_UITRON_CHECK_AND_GETP_SEMAS( semid, p );
755 Cyg_Scheduler::lock(); 809 Cyg_Scheduler::lock();
756 // deal with the race condition here 810 // deal with the race condition here
757 if ( p != CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] ) { 811 if ( p != CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] ) {
758 Cyg_Scheduler::unlock(); 812 Cyg_Scheduler::unlock();
759 return E_OBJ; 813 return E_NOEXS;
760 } 814 }
761 CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] = NULL; 815 CYG_UITRON_PTRS( SEMAS )[ semid - 1 ] = NULL;
762 p->~Cyg_Counting_Semaphore2(); 816 p->~Cyg_Counting_Semaphore2();
763 Cyg_Scheduler::unlock(); 817 Cyg_Scheduler::unlock();
764 return E_OK; 818 return E_OK;
875 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p ); 929 CYG_UITRON_CHECK_AND_GETP_FLAGS( flgid, p );
876 Cyg_Scheduler::lock(); 930 Cyg_Scheduler::lock();
877 // deal with the race condition here 931 // deal with the race condition here
878 if ( p != CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] ) { 932 if ( p != CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] ) {
879 Cyg_Scheduler::unlock(); 933 Cyg_Scheduler::unlock();
880 return E_OBJ; 934 return E_NOEXS;
881 } 935 }
882 CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] = NULL; 936 CYG_UITRON_PTRS( FLAGS )[ flgid - 1 ] = NULL;
883 p->~Cyg_Flag(); 937 p->~Cyg_Flag();
884 Cyg_Scheduler::unlock(); 938 Cyg_Scheduler::unlock();
885 return E_OK; 939 return E_OK;
1032 CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p ); 1086 CYG_UITRON_CHECK_AND_GETP_MBOXES( mbxid, p );
1033 Cyg_Scheduler::lock(); 1087 Cyg_Scheduler::lock();
1034 // deal with the race condition here 1088 // deal with the race condition here
1035 if ( p != CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] ) { 1089 if ( p != CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] ) {
1036 Cyg_Scheduler::unlock(); 1090 Cyg_Scheduler::unlock();
1037 return E_OBJ; 1091 return E_NOEXS;
1038 } 1092 }
1039 CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] = NULL; 1093 CYG_UITRON_PTRS( MBOXES )[ mbxid - 1 ] = NULL;
1040 p->~Cyg_Mbox(); 1094 p->~Cyg_Mbox();
1041 Cyg_Scheduler::unlock(); 1095 Cyg_Scheduler::unlock();
1042 return E_OK; 1096 return E_OK;
1052 // One hopes that often this will be optimized out, since the one or both 1106 // One hopes that often this will be optimized out, since the one or both
1053 // of these being true has been detected and errored out just above. 1107 // of these being true has been detected and errored out just above.
1054 1108
1055 #ifdef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR 1109 #ifdef CYGSEM_UITRON_PARAMS_NULL_IS_GOOD_PTR
1056 // represent a NULL as NADR internally 1110 // represent a NULL as NADR internally
1057 #define CYG_UIT_TMSG_FIXUP_IN( _p_ ) CYG_MACRO_START \ 1111 #define CYG_UIT_TMSG_FIXUP_IN( _p_ ) CYG_MACRO_START \
1058 if ( NULL == (_p_) ) \ 1112 if ( NULL == (_p_) ) \
1059 (_p_) = (T_MSG *)NADR; \ 1113 (_p_) = (T_MSG *)NADR; \
1060 CYG_MACRO_END 1114 CYG_MACRO_END
1061 1115
1062 // we get a NADR back sometimes, meaning NULL 1116 // we get a NADR back sometimes, meaning NULL
1063 #define CYG_UIT_TMSG_FIXUP_OUT( _p_ ) CYG_MACRO_START \ 1117 #define CYG_UIT_TMSG_FIXUP_OUT( _p_ ) CYG_MACRO_START \
1064 if ( NADR == (_p_) ) \ 1118 if ( NADR == (_p_) ) \
1065 (_p_) = (T_MSG *)NULL; \ 1119 (_p_) = (T_MSG *)NULL; \
1066 CYG_MACRO_END 1120 CYG_MACRO_END
1067 1121
1068 #else 1122 #else
1069 // NULL is checked for and makes an error 1123 // NULL is checked for and makes an error
1070 #define CYG_UIT_TMSG_FIXUP_IN( _p_ ) CYG_EMPTY_STATEMENT 1124 #define CYG_UIT_TMSG_FIXUP_IN( _p_ ) CYG_EMPTY_STATEMENT
1071 #define CYG_UIT_TMSG_FIXUP_OUT( _p_ ) CYG_EMPTY_STATEMENT 1125 #define CYG_UIT_TMSG_FIXUP_OUT( _p_ ) CYG_EMPTY_STATEMENT
1072 #endif 1126 #endif
1073 1127
1074 // and sometimes either in status enquiries 1128 // and sometimes either in status enquiries
1075 #define CYG_UIT_TMSG_FIXUP_ALL( _p_ ) CYG_MACRO_START \ 1129 #define CYG_UIT_TMSG_FIXUP_ALL( _p_ ) CYG_MACRO_START \
1076 if ( NULL == (_p_) ) \ 1130 if ( NULL == (_p_) ) \
1077 (_p_) = (T_MSG *)NADR; \ 1131 (_p_) = (T_MSG *)NADR; \
1078 else if ( NADR == (_p_) ) \ 1132 else if ( NADR == (_p_) ) \
1079 (_p_) = (T_MSG *)NULL; \ 1133 (_p_) = (T_MSG *)NULL; \
1080 CYG_MACRO_END 1134 CYG_MACRO_END
1081 1135
1082 CYG_UIT_FUNC_INLINE 1136 CYG_UIT_FUNC_INLINE
1083 ER 1137 ER
1084 snd_msg ( ID mbxid, T_MSG *pk_msg ) 1138 snd_msg ( ID mbxid, T_MSG *pk_msg )
1176 #endif // CYGPKG_UITRON_MBOXES 1230 #endif // CYGPKG_UITRON_MBOXES
1177 1231
1178 // - Extended Synchronization and Communication Functions 1232 // - Extended Synchronization and Communication Functions
1179 1233
1180 #if 0 // NOT SUPPORTED 1234 #if 0 // NOT SUPPORTED
1181 ER cre_mbf ( ID mbfid, T_CMBF *pk_cmbf ); 1235 ER cre_mbf ( ID mbfid, T_CMBF *pk_cmbf );
1182 ER del_mbf ( ID mbfid ); 1236 ER del_mbf ( ID mbfid );
1183 ER snd_mbf ( ID mbfid, VP msg, INT msgsz ); 1237 ER snd_mbf ( ID mbfid, VP msg, INT msgsz );
1184 ER psnd_mbf ( ID mbfid, VP msg, INT msgsz ); 1238 ER psnd_mbf ( ID mbfid, VP msg, INT msgsz );
1185 ER tsnd_mbf ( ID mbfid, VP msg, INT msgsz, TMO tmout ); 1239 ER tsnd_mbf ( ID mbfid, VP msg, INT msgsz, TMO tmout );
1186 ER rcv_mbf ( VP msg, INT *p_msgsz, ID mbfid ); 1240 ER rcv_mbf ( VP msg, INT *p_msgsz, ID mbfid );
1187 ER prcv_mbf ( VP msg, INT *p_msgsz, ID mbfid ); 1241 ER prcv_mbf ( VP msg, INT *p_msgsz, ID mbfid );
1188 ER trcv_mbf ( VP msg, INT *p_msgsz, ID mbfid, TMO tmout ); 1242 ER trcv_mbf ( VP msg, INT *p_msgsz, ID mbfid, TMO tmout );
1189 ER ref_mbf ( T_RMBF *pk_rmbf, ID mbfid ); 1243 ER ref_mbf ( T_RMBF *pk_rmbf, ID mbfid );
1190 ER cre_por ( ID porid, T_CPOR *pk_cpor ); 1244 ER cre_por ( ID porid, T_CPOR *pk_cpor );
1191 ER del_por ( ID porid ); 1245 ER del_por ( ID porid );
1192 ER cal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT 1246 ER cal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT
1193 cmsgsz ); 1247 cmsgsz );
1194 ER pcal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT 1248 ER pcal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT
1195 cmsgsz ); 1249 cmsgsz );
1196 ER tcal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT 1250 ER tcal_por ( VP msg, INT *p_rmsgsz, ID porid, UINT calptn, INT
1197 cmsgsz, TMO tmout ); 1251 cmsgsz, TMO tmout );
1198 ER acp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT 1252 ER acp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT
1199 acpptn ); 1253 acpptn );
1200 ER pacp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT 1254 ER pacp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT
1201 acpptn ); 1255 acpptn );
1202 ER tacp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT 1256 ER tacp_por ( RNO *p_rdvno, VP msg, INT *p_cmsgsz, ID porid, UINT
1203 acpptn, TMO tmout ); 1257 acpptn, TMO tmout );
1204 ER fwd_por ( ID porid, UINT calptn, RNO rdvno, VP msg, INT cmsgsz 1258 ER fwd_por ( ID porid, UINT calptn, RNO rdvno, VP msg, INT cmsgsz
1205 ); 1259 );
1206 ER rpl_rdv ( RNO rdvno, VP msg, INT rmsgsz ); 1260 ER rpl_rdv ( RNO rdvno, VP msg, INT rmsgsz );
1207 ER ref_por ( T_RPOR *pk_rpor, ID porid ); 1261 ER ref_por ( T_RPOR *pk_rpor, ID porid );
1208 #endif 1262 #endif
1209 1263
1210 // - Interrupt Management Functions 1264 // - Interrupt Management Functions
1211 1265
1212 #if 0 // NOT SUPPORTED 1266 #if 0 // NOT SUPPORTED
1213 ER def_int ( UINT dintno, T_DINT *pk_dint ); 1267 ER def_int ( UINT dintno, T_DINT *pk_dint );
1214 void ret_wup ( ID tskid ); 1268 void ret_wup ( ID tskid );
1215 #endif 1269 #endif
1216 1270
1217 CYG_UIT_FUNC_INLINE 1271 CYG_UIT_FUNC_INLINE
1218 ER 1272 ER
1219 loc_cpu ( void ) 1273 loc_cpu ( void )
1220 { 1274 {
1221 CYG_UITRON_CHECK_TASK_CONTEXT(); 1275 CYG_UITRON_CHECK_TASK_CONTEXT();
1276 Cyg_Scheduler::lock();
1277 // Prevent preemption by going up to prio 0
1278 if ( 0 == cyg_uitron_dis_dsp_old_priority ) {
1279 #ifdef CYGIMP_THREAD_PRIORITY
1280 Cyg_Thread *p = Cyg_Thread::self();
1281 cyg_uitron_dis_dsp_old_priority = p->get_priority();
1282 p->set_priority( 0 );
1283 #else
1284 cyg_uitron_dis_dsp_old_priority = 1;
1285 #endif
1286 }
1222 Cyg_Interrupt::disable_interrupts(); 1287 Cyg_Interrupt::disable_interrupts();
1223 if ( 0 == Cyg_Scheduler::get_sched_lock() ) 1288 Cyg_Scheduler::unlock();
1224 Cyg_Scheduler::lock();
1225 return E_OK; 1289 return E_OK;
1226 } 1290 }
1227 1291
1228 CYG_UIT_FUNC_INLINE 1292 CYG_UIT_FUNC_INLINE
1229 ER 1293 ER
1230 unl_cpu ( void ) 1294 unl_cpu ( void )
1231 { 1295 {
1232 CYG_UITRON_CHECK_TASK_CONTEXT(); 1296 CYG_UITRON_CHECK_TASK_CONTEXT();
1297 Cyg_Scheduler::lock();
1298 // Enable dispatching (if disabled) and maybe switch threads
1299 if ( 0 != cyg_uitron_dis_dsp_old_priority ) {
1300 // We had prevented preemption by going up to prio 0
1301 #ifdef CYGIMP_THREAD_PRIORITY
1302 Cyg_Thread *p = Cyg_Thread::self();
1303 p->set_priority( cyg_uitron_dis_dsp_old_priority );
1304 #endif
1305 cyg_uitron_dis_dsp_old_priority = 0;
1306 }
1233 Cyg_Interrupt::enable_interrupts(); 1307 Cyg_Interrupt::enable_interrupts();
1234 if ( 0 < Cyg_Scheduler::get_sched_lock() ) 1308 Cyg_Scheduler::unlock();
1235 Cyg_Scheduler::unlock(); 1309 CYG_UITRON_CHECK_DISPATCH_ENABLED(); // NB: afterwards!
1236 return E_OK; 1310 return E_OK;
1237 } 1311 }
1238 1312
1239 #if 0 // NOT SUPPORTED 1313 #if 0 // NOT SUPPORTED
1240 ER dis_int ( UINT eintno ); 1314 ER dis_int ( UINT eintno );
1241 ER ena_int ( UINT eintno ); 1315 ER ena_int ( UINT eintno );
1242 ER chg_iXX ( UINT iXXXX ); 1316 ER chg_iXX ( UINT iXXXX );
1243 ER ref_iXX ( UINT *p_iXXXX ); 1317 ER ref_iXX ( UINT *p_iXXXX );
1244 #endif 1318 #endif
1245 1319
1246 // - Memorypool Management Functions 1320 // - Memorypool Management Functions
1247 #ifdef CYGPKG_UITRON_MEMPOOLVAR 1321 #ifdef CYGPKG_UITRON_MEMPOOLVAR
1248 #if 0 < CYG_UITRON_NUM( MEMPOOLVAR ) 1322 #if 0 < CYG_UITRON_NUM( MEMPOOLVAR )
1284 CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p ); 1358 CYG_UITRON_CHECK_AND_GETP_MEMPOOLVAR( mplid, p );
1285 Cyg_Scheduler::lock(); 1359 Cyg_Scheduler::lock();
1286 // deal with the race condition here 1360 // deal with the race condition here
1287 if ( p != CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] ) { 1361 if ( p != CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] ) {
1288 Cyg_Scheduler::unlock(); 1362 Cyg_Scheduler::unlock();
1289 return E_OBJ; 1363 return E_NOEXS;
1290 } 1364 }
1291 CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] = NULL; 1365 CYG_UITRON_PTRS( MEMPOOLVAR )[ mplid - 1 ] = NULL;
1292 p->~Cyg_Mempool_Variable(); 1366 p->~Cyg_Mempool_Variable();
1293 Cyg_Scheduler::unlock(); 1367 Cyg_Scheduler::unlock();
1294 return E_OK; 1368 return E_OK;
1434 CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( mpfid, p ); 1508 CYG_UITRON_CHECK_AND_GETP_MEMPOOLFIXED( mpfid, p );
1435 Cyg_Scheduler::lock(); 1509 Cyg_Scheduler::lock();
1436 // deal with the race condition here 1510 // deal with the race condition here
1437 if ( p != CYG_UITRON_PTRS( MEMPOOLFIXED )[ mpfid - 1 ] ) { 1511 if ( p != CYG_UITRON_PTRS( MEMPOOLFIXED )[ mpfid - 1 ] ) {
1438 Cyg_Scheduler::unlock(); 1512 Cyg_Scheduler::unlock();
1439 return E_OBJ; 1513 return E_NOEXS;
1440 } 1514 }
1441 CYG_UITRON_PTRS( MEMPOOLFIXED )[ mpfid - 1 ] = NULL; 1515 CYG_UITRON_PTRS( MEMPOOLFIXED )[ mpfid - 1 ] = NULL;
1442 p->~Cyg_Mempool_Fixed(); 1516 p->~Cyg_Mempool_Fixed();
1443 Cyg_Scheduler::unlock(); 1517 Cyg_Scheduler::unlock();
1444 return E_OK; 1518 return E_OK;
1709 ER 1783 ER
1710 get_ver ( T_VER *pk_ver ) 1784 get_ver ( T_VER *pk_ver )
1711 { 1785 {
1712 CYG_UIT_PARAMCHECK_PTR( pk_ver ); 1786 CYG_UIT_PARAMCHECK_PTR( pk_ver );
1713 1787
1714 pk_ver->maker = CYGNUM_UITRON_VER_MAKER; 1788 pk_ver->maker = CYGNUM_UITRON_VER_MAKER;
1715 pk_ver->id = CYGNUM_UITRON_VER_ID; 1789 pk_ver->id = CYGNUM_UITRON_VER_ID;
1716 pk_ver->spver = CYGNUM_UITRON_VER_SPVER; 1790 pk_ver->spver = CYGNUM_UITRON_VER_SPVER;
1717 pk_ver->prver = CYGNUM_UITRON_VER_PRVER; 1791 pk_ver->prver = CYGNUM_UITRON_VER_PRVER;
1718 pk_ver->prno[0] = CYGNUM_UITRON_VER_PRNO_0; 1792 pk_ver->prno[0] = CYGNUM_UITRON_VER_PRNO_0;
1719 pk_ver->prno[1] = CYGNUM_UITRON_VER_PRNO_1; 1793 pk_ver->prno[1] = CYGNUM_UITRON_VER_PRNO_1;
1720 pk_ver->prno[2] = CYGNUM_UITRON_VER_PRNO_2; 1794 pk_ver->prno[2] = CYGNUM_UITRON_VER_PRNO_2;
1721 pk_ver->prno[3] = CYGNUM_UITRON_VER_PRNO_3; 1795 pk_ver->prno[3] = CYGNUM_UITRON_VER_PRNO_3;
1722 pk_ver->cpu = CYGNUM_UITRON_VER_CPU; 1796 pk_ver->cpu = CYGNUM_UITRON_VER_CPU;
1723 pk_ver->var = CYGNUM_UITRON_VER_VAR; 1797 pk_ver->var = CYGNUM_UITRON_VER_VAR;
1724 1798
1725 return E_OK; 1799 return E_OK;
1726 } 1800 }
1727 1801
1728 CYG_UIT_FUNC_INLINE 1802 CYG_UIT_FUNC_INLINE
1733 if ( ! Cyg_Interrupt::interrupts_enabled() ) 1807 if ( ! Cyg_Interrupt::interrupts_enabled() )
1734 // CPU is locked 1808 // CPU is locked
1735 pk_rsys->sysstat = TSS_LOC; 1809 pk_rsys->sysstat = TSS_LOC;
1736 else 1810 else
1737 pk_rsys->sysstat = 1811 pk_rsys->sysstat =
1738 (Cyg_Scheduler::get_sched_lock() == 0) ? TSS_TSK : TSS_DDSP; 1812 (0 == cyg_uitron_dis_dsp_old_priority) ? TSS_TSK : TSS_DDSP;
1739 return E_OK; 1813 return E_OK;
1740 } 1814 }
1741 1815
1742 CYG_UIT_FUNC_INLINE 1816 CYG_UIT_FUNC_INLINE
1743 ER 1817 ER
1747 // no details here yet 1821 // no details here yet
1748 return E_OK; 1822 return E_OK;
1749 } 1823 }
1750 1824
1751 #if 0 // NOT SUPPORTED 1825 #if 0 // NOT SUPPORTED
1752 ER def_svc ( FN s_fncd, T_DSVC *pk_dsvc ); 1826 ER def_svc ( FN s_fncd, T_DSVC *pk_dsvc );
1753 ER def_exc ( UINT exckind, T_DEXC *pk_dexc ); 1827 ER def_exc ( UINT exckind, T_DEXC *pk_dexc );
1754 #endif 1828 #endif
1755 1829
1756 // - Network Support Functions 1830 // - Network Support Functions
1757 1831
1758 #if 0 // NOT SUPPORTED 1832 #if 0 // NOT SUPPORTED
1759 ER nrea_dat ( INT *p_reasz, VP dstadr, NODE srcnode, VP srcadr, 1833 ER nrea_dat ( INT *p_reasz, VP dstadr, NODE srcnode, VP srcadr,
1760 INT datsz ); 1834 INT datsz );
1761 ER nwri_dat ( INT *p_wrisz, NODE dstnode, VP dstadr, VP srcadr, 1835 ER nwri_dat ( INT *p_wrisz, NODE dstnode, VP dstadr, VP srcadr,
1762 INT datsz ); 1836 INT datsz );
1763 ER nget_nod ( NODE *p_node ); 1837 ER nget_nod ( NODE *p_node );
1764 ER nget_ver ( T_VER *pk_ver, NODE node ); 1838 ER nget_ver ( T_VER *pk_ver, NODE node );
1765 #endif 1839 #endif
1766 1840
1767 // ======================================================================== 1841 // ========================================================================
1768 1842
1769 #endif // CYGPKG_UITRON 1843 #endif // CYGPKG_UITRON