Changeset 709f38a in rtems
- Timestamp:
- Apr 13, 2016, 4:48:58 AM (5 years ago)
- Branches:
- 5, master
- Children:
- 4cf41fd
- Parents:
- 0a97ba5b
- git-author:
- Sebastian Huber <sebastian.huber@…> (04/13/16 04:48:58)
- git-committer:
- Sebastian Huber <sebastian.huber@…> (04/18/16 06:20:16)
- Files:
-
- 4 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/score/include/rtems/score/thread.h
r0a97ba5b r709f38a 48 48 49 49 struct Scheduler_Node; 50 51 struct User_extensions_Iterator; 50 52 51 53 #ifdef __cplusplus … … 900 902 901 903 /** 904 * @brief LIFO list of user extensions iterators. 905 */ 906 struct User_extensions_Iterator *last_user_extensions_iterator; 907 908 /** 902 909 * @brief Variable length array of user extension pointers. 903 910 * -
cpukit/score/include/rtems/score/userextimpl.h
r0a97ba5b r709f38a 20 20 21 21 #include <rtems/score/userext.h> 22 #include <rtems/score/isrlock.h> 22 23 #include <rtems/score/chainimpl.h> 23 24 #include <rtems/score/percpu.h> … … 37 38 38 39 /** 40 * @brief Chain iterator for dynamic user extensions. 41 * 42 * Since user extensions may delete or restart the executing thread, we must 43 * clean up registered iterators. 44 * 45 * @see _User_extensions_Iterate(), _User_extensions_Destroy_iterators() and 46 * Thread_Control::last_user_extensions_iterator. 47 */ 48 typedef struct User_extensions_Iterator { 49 Chain_Iterator Iterator; 50 struct User_extensions_Iterator *previous; 51 } User_extensions_Iterator; 52 53 typedef struct { 54 /** 55 * @brief Active dynamically added user extensions. 56 */ 57 Chain_Control Active; 58 59 /** 60 * @brief Chain iterator registration. 61 */ 62 Chain_Iterator_registry Iterators; 63 64 /** 65 * @brief Lock to protect User_extensions_List::Active and 66 * User_extensions_List::Iterators. 67 */ 68 ISR_LOCK_MEMBER( Lock ) 69 } User_extensions_List; 70 71 /** 39 72 * @brief List of active extensions. 40 73 */ 41 extern Chain_Control_User_extensions_List;74 extern User_extensions_List _User_extensions_List; 42 75 43 76 /** … … 154 187 * 155 188 * @param[in, out] arg The argument passed to the visitor. 156 * @param[in] visitor is the visitor for each extension. 189 * @param[in] visitor The visitor for each extension. 190 * @param[in] direction The iteration direction for dynamic extensions. 157 191 */ 158 192 void _User_extensions_Iterate( 159 void *arg, 160 User_extensions_Visitor visitor 193 void *arg, 194 User_extensions_Visitor visitor, 195 Chain_Iterator_direction direction 161 196 ); 162 197 … … 172 207 User_extensions_Thread_create_context ctx = { created, true }; 173 208 174 _User_extensions_Iterate( &ctx, _User_extensions_Thread_create_visitor ); 209 _User_extensions_Iterate( 210 &ctx, 211 _User_extensions_Thread_create_visitor, 212 CHAIN_ITERATOR_FORWARD 213 ); 175 214 176 215 return ctx.ok; … … 181 220 _User_extensions_Iterate( 182 221 deleted, 183 _User_extensions_Thread_delete_visitor 222 _User_extensions_Thread_delete_visitor, 223 CHAIN_ITERATOR_BACKWARD 184 224 ); 185 225 } … … 189 229 _User_extensions_Iterate( 190 230 started, 191 _User_extensions_Thread_start_visitor 231 _User_extensions_Thread_start_visitor, 232 CHAIN_ITERATOR_FORWARD 192 233 ); 193 234 } … … 197 238 _User_extensions_Iterate( 198 239 restarted, 199 _User_extensions_Thread_restart_visitor 240 _User_extensions_Thread_restart_visitor, 241 CHAIN_ITERATOR_FORWARD 200 242 ); 201 243 } … … 205 247 _User_extensions_Iterate( 206 248 executing, 207 _User_extensions_Thread_begin_visitor 249 _User_extensions_Thread_begin_visitor, 250 CHAIN_ITERATOR_FORWARD 208 251 ); 209 252 } … … 240 283 _User_extensions_Iterate( 241 284 executing, 242 _User_extensions_Thread_exitted_visitor 285 _User_extensions_Thread_exitted_visitor, 286 CHAIN_ITERATOR_FORWARD 243 287 ); 244 288 } … … 252 296 User_extensions_Fatal_context ctx = { source, is_internal, error }; 253 297 254 _User_extensions_Iterate( &ctx, _User_extensions_Fatal_visitor ); 298 _User_extensions_Iterate( 299 &ctx, 300 _User_extensions_Fatal_visitor, 301 CHAIN_ITERATOR_BACKWARD 302 ); 255 303 } 256 304 … … 261 309 _User_extensions_Iterate( 262 310 executing, 263 _User_extensions_Thread_terminate_visitor 264 ); 311 _User_extensions_Thread_terminate_visitor, 312 CHAIN_ITERATOR_FORWARD 313 ); 314 } 315 316 static inline void _User_extensions_Acquire( ISR_lock_Context *lock_context ) 317 { 318 _ISR_lock_ISR_disable_and_acquire( 319 &_User_extensions_List.Lock, 320 lock_context 321 ); 322 } 323 324 static inline void _User_extensions_Release( ISR_lock_Context *lock_context ) 325 { 326 _ISR_lock_Release_and_ISR_enable( 327 &_User_extensions_List.Lock, 328 lock_context 329 ); 330 } 331 332 static inline void _User_extensions_Destroy_iterators( 333 Thread_Control *the_thread 334 ) 335 { 336 ISR_lock_Context lock_context; 337 User_extensions_Iterator *iter; 338 339 _User_extensions_Acquire( &lock_context ); 340 341 iter = the_thread->last_user_extensions_iterator; 342 343 while ( iter != NULL ) { 344 _Chain_Iterator_destroy( &iter->Iterator ); 345 iter = iter->previous; 346 } 347 348 _User_extensions_Release( &lock_context ); 265 349 } 266 350 -
cpukit/score/src/threadrestart.c
r0a97ba5b r709f38a 98 98 99 99 _User_extensions_Thread_delete( the_thread ); 100 _User_extensions_Destroy_iterators( the_thread ); 100 101 _ISR_lock_Destroy( &the_thread->Keys.Lock ); 101 102 _Scheduler_Node_destroy( _Scheduler_Get( the_thread ), the_thread ); … … 256 257 executing->Life.state = THREAD_LIFE_NORMAL; 257 258 259 _User_extensions_Destroy_iterators( executing ); 258 260 _Thread_Load_environment( executing ); 259 261 _Thread_Restart_self( executing ); -
cpukit/score/src/userextaddset.c
r0a97ba5b r709f38a 21 21 22 22 #include <rtems/score/userextimpl.h> 23 #include <rtems/score/objectimpl.h>24 23 #include <rtems/score/percpu.h> 25 #include <rtems/score/sysstate.h>26 24 27 25 void _User_extensions_Add_set( … … 29 27 ) 30 28 { 31 _Assert( 32 _Objects_Allocator_is_owner() 33 || _System_state_Is_before_multitasking( _System_state_Get() ) 29 ISR_lock_Context lock_context; 30 31 _User_extensions_Acquire( &lock_context ); 32 _Chain_Append_unprotected( 33 &_User_extensions_List.Active, 34 &the_extension->Node 34 35 ); 35 36 _Chain_Append_unprotected( &_User_extensions_List, &the_extension->Node ); 36 _User_extensions_Release( &lock_context ); 37 37 38 38 /* -
cpukit/score/src/userextiterate.c
r0a97ba5b r709f38a 8 8 9 9 /* 10 * Copyright (c) 2012 embedded brains GmbH. All rights reserved.10 * Copyright (c) 2012, 2016 embedded brains GmbH. All rights reserved. 11 11 * 12 12 * embedded brains GmbH 13 * Obere Lagerstr. 3013 * Dornierstr. 4 14 14 * 82178 Puchheim 15 15 * Germany … … 28 28 #include <rtems/score/userextimpl.h> 29 29 30 CHAIN_DEFINE_EMPTY( _User_extensions_List ); 30 #include <pthread.h> 31 32 User_extensions_List _User_extensions_List = { 33 CHAIN_INITIALIZER_EMPTY( _User_extensions_List.Active ), 34 CHAIN_ITERATOR_REGISTRY_INITIALIZER( _User_extensions_List.Iterators ) 35 #if defined(RTEMS_SMP) 36 , 37 ISR_LOCK_INITIALIZER( "User Extensions List" ) 38 #endif 39 }; 31 40 32 41 void _User_extensions_Thread_create_visitor( … … 140 149 141 150 void _User_extensions_Iterate( 142 void *arg, 143 User_extensions_Visitor visitor 144 ) 145 { 146 Thread_Control *executing = _Thread_Get_executing(); 147 const User_extensions_Table *callouts_current = 148 rtems_configuration_get_user_extension_table(); 149 const User_extensions_Table *callouts_end = 150 callouts_current + rtems_configuration_get_number_of_initial_extensions(); 151 const Chain_Node *node; 152 const Chain_Node *tail; 151 void *arg, 152 User_extensions_Visitor visitor, 153 Chain_Iterator_direction direction 154 ) 155 { 156 Thread_Control *executing; 157 const User_extensions_Table *callouts_current; 158 const User_extensions_Table *callouts_end; 159 const Chain_Node *end; 160 Chain_Node *node; 161 User_extensions_Iterator iter; 162 ISR_lock_Context lock_context; 163 164 executing = _Thread_Get_executing(); 165 166 callouts_current = rtems_configuration_get_user_extension_table(); 167 callouts_end = callouts_current 168 + rtems_configuration_get_number_of_initial_extensions(); 153 169 154 170 while ( callouts_current != callouts_end ) { … … 158 174 } 159 175 160 node = _Chain_Immutable_first( &_User_extensions_List ); 161 tail = _Chain_Immutable_tail( &_User_extensions_List ); 162 while ( node != tail ) { 163 const User_extensions_Control *extension = 164 (const User_extensions_Control *) node; 165 166 (*visitor)( executing, arg, &extension->Callouts ); 167 168 node = _Chain_Immutable_next( node ); 169 } 170 } 176 if ( direction == CHAIN_ITERATOR_FORWARD ) { 177 end = _Chain_Immutable_tail( &_User_extensions_List.Active ); 178 } else { 179 end = _Chain_Immutable_head( &_User_extensions_List.Active ); 180 } 181 182 _User_extensions_Acquire( &lock_context ); 183 184 _Chain_Iterator_initialize( 185 &_User_extensions_List.Active, 186 &_User_extensions_List.Iterators, 187 &iter.Iterator, 188 direction 189 ); 190 191 if ( executing != NULL ) { 192 iter.previous = executing->last_user_extensions_iterator; 193 executing->last_user_extensions_iterator = &iter; 194 } 195 196 while ( ( node = _Chain_Iterator_next( &iter.Iterator ) ) != end ) { 197 const User_extensions_Control *extension; 198 199 _Chain_Iterator_set_position( &iter.Iterator, node ); 200 201 _User_extensions_Release( &lock_context ); 202 203 extension = (const User_extensions_Control *) node; 204 ( *visitor )( executing, arg, &extension->Callouts ); 205 206 _User_extensions_Acquire( &lock_context ); 207 } 208 209 if ( executing != NULL ) { 210 executing->last_user_extensions_iterator = iter.previous; 211 } 212 213 _Chain_Iterator_destroy( &iter.Iterator ); 214 215 _User_extensions_Release( &lock_context ); 216 } -
cpukit/score/src/userextremoveset.c
r0a97ba5b r709f38a 21 21 22 22 #include <rtems/score/userextimpl.h> 23 #include <rtems/score/objectimpl.h>24 23 #include <rtems/score/percpu.h> 25 24 … … 28 27 ) 29 28 { 30 _Assert( _Objects_Allocator_is_owner() );29 ISR_lock_Context lock_context; 31 30 31 _User_extensions_Acquire( &lock_context ); 32 _Chain_Iterator_registry_update( 33 &_User_extensions_List.Iterators, 34 &the_extension->Node 35 ); 32 36 _Chain_Extract_unprotected( &the_extension->Node ); 37 _User_extensions_Release( &lock_context ); 33 38 34 39 /* -
testsuites/sptests/Makefile.am
r0a97ba5b r709f38a 34 34 spsem_err02 sptask_err01 spevent_err03 sptask_err03 sptask_err02 \ 35 35 sptask_err04 spclock_err01 36 _SUBDIRS += spextensions01 36 37 _SUBDIRS += spsysinit01 37 38 if HAS_SMP -
testsuites/sptests/configure.ac
r0a97ba5b r709f38a 47 47 # Explicitly list all Makefiles here 48 48 AC_CONFIG_FILES([Makefile 49 spextensions01/Makefile 49 50 sptimerserver01/Makefile 50 51 spsysinit01/Makefile
Note: See TracChangeset
for help on using the changeset viewer.