Changeset 8568341 in rtems
- Timestamp:
- 06/11/14 12:31:03 (9 years ago)
- Branches:
- 4.11, 5, master
- Children:
- 52f8e90d
- Parents:
- ac532f3
- git-author:
- Sebastian Huber <sebastian.huber@…> (06/11/14 12:31:03)
- git-committer:
- Sebastian Huber <sebastian.huber@…> (07/08/14 14:30:48)
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/score/include/rtems/score/scheduler.h
rac532f3 r8568341 45 45 typedef struct Scheduler_Node Scheduler_Node; 46 46 47 #if defined(RTEMS_SMP) 48 typedef Thread_Control * Scheduler_Void_or_thread; 49 50 #define SCHEDULER_RETURN_VOID_OR_NULL return NULL 51 #else 52 typedef void Scheduler_Void_or_thread; 53 54 #define SCHEDULER_RETURN_VOID_OR_NULL return 55 #endif 56 47 57 /** 48 58 * @brief The scheduler operations. … … 56 66 57 67 /** @see _Scheduler_Yield() */ 58 void ( *yield )( const Scheduler_Control *, Thread_Control *); 68 Scheduler_Void_or_thread ( *yield )( 69 const Scheduler_Control *, 70 Thread_Control * 71 ); 59 72 60 73 /** @see _Scheduler_Block() */ 61 void ( *block )( const Scheduler_Control *, Thread_Control * ); 74 void ( *block )( 75 const Scheduler_Control *, 76 Thread_Control * 77 ); 62 78 63 79 /** @see _Scheduler_Unblock() */ 64 void ( *unblock )( const Scheduler_Control *, Thread_Control * ); 80 Scheduler_Void_or_thread ( *unblock )( 81 const Scheduler_Control *, 82 Thread_Control * 83 ); 65 84 66 85 /** @see _Scheduler_Change_priority() */ 67 void ( *change_priority )(86 Scheduler_Void_or_thread ( *change_priority )( 68 87 const Scheduler_Control *, 69 88 Thread_Control *, -
cpukit/score/include/rtems/score/schedulercbs.h
rac532f3 r8568341 154 154 * @note This has to be asessed as missed deadline of the current job. 155 155 */ 156 void _Scheduler_CBS_Unblock(156 Scheduler_Void_or_thread _Scheduler_CBS_Unblock( 157 157 const Scheduler_Control *scheduler, 158 158 Thread_Control *the_thread -
cpukit/score/include/rtems/score/scheduleredf.h
rac532f3 r8568341 178 178 * @param[in] the_thread will be unblocked. 179 179 */ 180 void _Scheduler_EDF_Unblock(181 const Scheduler_Control *scheduler, 182 Thread_Control *the_thread 183 ); 184 185 void _Scheduler_EDF_Change_priority(180 Scheduler_Void_or_thread _Scheduler_EDF_Unblock( 181 const Scheduler_Control *scheduler, 182 Thread_Control *the_thread 183 ); 184 185 Scheduler_Void_or_thread _Scheduler_EDF_Change_priority( 186 186 const Scheduler_Control *scheduler, 187 187 Thread_Control *the_thread, … … 205 205 * @param[in,out] thread The yielding thread. 206 206 */ 207 void _Scheduler_EDF_Yield(207 Scheduler_Void_or_thread _Scheduler_EDF_Yield( 208 208 const Scheduler_Control *scheduler, 209 209 Thread_Control *the_thread -
cpukit/score/include/rtems/score/schedulerimpl.h
rac532f3 r8568341 117 117 } 118 118 119 #if defined(RTEMS_SMP) 120 /** 121 * @brief Ask threads depending on resources owned by the thread for help. 122 * 123 * A thread is in need for help if it lost its assigned processor due to 124 * pre-emption by a higher priority thread or it was not possible to assign it 125 * a processor since its priority is to low on its current scheduler instance. 126 * 127 * @param[in] needs_help The thread needing help. 128 */ 129 RTEMS_INLINE_ROUTINE void _Scheduler_Ask_for_help_if_necessary( 130 Thread_Control *needs_help 131 ) 132 { 133 (void) needs_help; 134 } 135 #endif 136 119 137 /** 120 138 * @brief Scheduler yield with a particular thread. … … 128 146 { 129 147 const Scheduler_Control *scheduler = _Scheduler_Get( the_thread ); 130 148 #if defined(RTEMS_SMP) 149 Thread_Control *needs_help; 150 151 needs_help = 152 #endif 131 153 ( *scheduler->Operations.yield )( scheduler, the_thread ); 154 155 #if defined(RTEMS_SMP) 156 _Scheduler_Ask_for_help_if_necessary( needs_help ); 157 #endif 132 158 } 133 159 … … 162 188 { 163 189 const Scheduler_Control *scheduler = _Scheduler_Get( the_thread ); 164 190 #if defined(RTEMS_SMP) 191 Thread_Control *needs_help; 192 193 needs_help = 194 #endif 165 195 ( *scheduler->Operations.unblock )( scheduler, the_thread ); 196 197 #if defined(RTEMS_SMP) 198 _Scheduler_Ask_for_help_if_necessary( needs_help ); 199 #endif 166 200 } 167 201 … … 186 220 { 187 221 const Scheduler_Control *scheduler = _Scheduler_Get( the_thread ); 188 222 #if defined(RTEMS_SMP) 223 Thread_Control *needs_help; 224 225 needs_help = 226 #endif 189 227 ( *scheduler->Operations.change_priority )( 190 228 scheduler, … … 193 231 prepend_it 194 232 ); 233 234 #if defined(RTEMS_SMP) 235 _Scheduler_Ask_for_help_if_necessary( needs_help ); 236 #endif 195 237 } 196 238 -
cpukit/score/include/rtems/score/schedulerpriority.h
rac532f3 r8568341 150 150 * @param[in] the_thread will be unblocked 151 151 */ 152 void _Scheduler_priority_Unblock(153 const Scheduler_Control *scheduler, 154 Thread_Control *the_thread 155 ); 156 157 void _Scheduler_priority_Change_priority(152 Scheduler_Void_or_thread _Scheduler_priority_Unblock( 153 const Scheduler_Control *scheduler, 154 Thread_Control *the_thread 155 ); 156 157 Scheduler_Void_or_thread _Scheduler_priority_Change_priority( 158 158 const Scheduler_Control *scheduler, 159 159 Thread_Control *the_thread, … … 181 181 * @param[in,out] thread The yielding thread. 182 182 */ 183 void _Scheduler_priority_Yield(183 Scheduler_Void_or_thread _Scheduler_priority_Yield( 184 184 const Scheduler_Control *scheduler, 185 185 Thread_Control *the_thread -
cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h
rac532f3 r8568341 102 102 * @param[in] thread is the thread to unblock 103 103 */ 104 void_Scheduler_priority_affinity_SMP_Unblock(104 Thread_Control *_Scheduler_priority_affinity_SMP_Unblock( 105 105 const Scheduler_Control *scheduler, 106 106 Thread_Control *thread … … 133 133 * @param[in] prepend_it Append or prepend the thread to its priority FIFO. 134 134 */ 135 void_Scheduler_priority_affinity_SMP_Change_priority(135 Thread_Control *_Scheduler_priority_affinity_SMP_Change_priority( 136 136 const Scheduler_Control *scheduler, 137 137 Thread_Control *the_thread, -
cpukit/score/include/rtems/score/schedulerprioritysmp.h
rac532f3 r8568341 107 107 ); 108 108 109 void_Scheduler_priority_SMP_Unblock(109 Thread_Control *_Scheduler_priority_SMP_Unblock( 110 110 const Scheduler_Control *scheduler, 111 111 Thread_Control *thread 112 112 ); 113 113 114 void_Scheduler_priority_SMP_Change_priority(114 Thread_Control *_Scheduler_priority_SMP_Change_priority( 115 115 const Scheduler_Control *scheduler, 116 116 Thread_Control *the_thread, … … 125 125 ); 126 126 127 void_Scheduler_priority_SMP_Yield(127 Thread_Control *_Scheduler_priority_SMP_Yield( 128 128 const Scheduler_Control *scheduler, 129 129 Thread_Control *thread -
cpukit/score/include/rtems/score/schedulersimple.h
rac532f3 r8568341 102 102 * @param[in,out] thread The yielding thread. 103 103 */ 104 void _Scheduler_simple_Yield(104 Scheduler_Void_or_thread _Scheduler_simple_Yield( 105 105 const Scheduler_Control *scheduler, 106 106 Thread_Control *the_thread … … 131 131 * @param[in] the_thread is the thread that is to be unblocked 132 132 */ 133 void _Scheduler_simple_Unblock(133 Scheduler_Void_or_thread _Scheduler_simple_Unblock( 134 134 const Scheduler_Control *scheduler, 135 135 Thread_Control *the_thread 136 136 ); 137 137 138 void _Scheduler_simple_Change_priority(138 Scheduler_Void_or_thread _Scheduler_simple_Change_priority( 139 139 const Scheduler_Control *scheduler, 140 140 Thread_Control *the_thread, -
cpukit/score/include/rtems/score/schedulersimplesmp.h
rac532f3 r8568341 88 88 ); 89 89 90 void_Scheduler_simple_SMP_Unblock(90 Thread_Control *_Scheduler_simple_SMP_Unblock( 91 91 const Scheduler_Control *scheduler, 92 92 Thread_Control *thread 93 93 ); 94 94 95 void_Scheduler_simple_SMP_Change_priority(95 Thread_Control *_Scheduler_simple_SMP_Change_priority( 96 96 const Scheduler_Control *scheduler, 97 97 Thread_Control *the_thread, … … 106 106 ); 107 107 108 void_Scheduler_simple_SMP_Yield(108 Thread_Control *_Scheduler_simple_SMP_Yield( 109 109 const Scheduler_Control *scheduler, 110 110 Thread_Control *thread -
cpukit/score/include/rtems/score/schedulersmpimpl.h
rac532f3 r8568341 307 307 ); 308 308 309 typedef void ( *Scheduler_SMP_Enqueue )( 309 typedef Thread_Control *( *Scheduler_SMP_Enqueue )( 310 Scheduler_Context *context, 311 Scheduler_Node *node_to_enqueue, 312 Thread_Control *needs_help 313 ); 314 315 typedef Thread_Control *( *Scheduler_SMP_Enqueue_scheduled )( 310 316 Scheduler_Context *context, 311 317 Scheduler_Node *node_to_enqueue … … 493 499 * @param[in] context The scheduler instance context. 494 500 * @param[in] node The node to enqueue. 501 * @param[in] needs_help The thread needing help in case the node cannot be 502 * scheduled. 495 503 * @param[in] order The order function. 496 504 * @param[in] insert_ready Function to insert a node into the set of ready … … 507 515 * based on the rules of the scheduler. 508 516 */ 509 static inline void_Scheduler_SMP_Enqueue_ordered(517 static inline Thread_Control *_Scheduler_SMP_Enqueue_ordered( 510 518 Scheduler_Context *context, 511 519 Scheduler_Node *node, 520 Thread_Control *needs_help, 512 521 Chain_Node_order order, 513 522 Scheduler_SMP_Insert insert_ready, … … 536 545 ( *insert_scheduled )( context, node ); 537 546 ( *move_from_scheduled_to_ready )( context, lowest_scheduled ); 547 548 needs_help = _Scheduler_Node_get_user( lowest_scheduled ); 538 549 } else { 539 550 ( *insert_ready )( context, node ); 540 551 } 552 553 return needs_help; 541 554 } 542 555 … … 558 571 * based on the rules of the scheduler. 559 572 */ 560 static inline void_Scheduler_SMP_Enqueue_scheduled_ordered(573 static inline Thread_Control *_Scheduler_SMP_Enqueue_scheduled_ordered( 561 574 Scheduler_Context *context, 562 575 Scheduler_Node *node, … … 570 583 { 571 584 Scheduler_Node *highest_ready = ( *get_highest_ready )( context, node ); 585 Thread_Control *needs_help; 572 586 573 587 _Assert( highest_ready != NULL ); … … 579 593 if ( ( *order )( &node->Node, &highest_ready->Node ) ) { 580 594 ( *insert_scheduled )( context, node ); 595 596 needs_help = NULL; 581 597 } else { 582 598 _Scheduler_SMP_Node_change_state( … … 594 610 ( *insert_ready )( context, node ); 595 611 ( *move_from_ready_to_scheduled )( context, highest_ready ); 612 613 needs_help = _Scheduler_Node_get_user( node ); 596 614 } 615 616 return needs_help; 597 617 } 598 618 … … 664 684 } 665 685 666 static inline void_Scheduler_SMP_Unblock(686 static inline Thread_Control *_Scheduler_SMP_Unblock( 667 687 Scheduler_Context *context, 668 688 Thread_Control *thread, … … 674 694 _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_READY ); 675 695 676 ( *enqueue_fifo )( context, &node->Base);677 } 678 679 static inline void_Scheduler_SMP_Change_priority(680 Scheduler_Context *context,681 Thread_Control *thread,682 Priority_Control new_priority,683 bool prepend_it,684 Scheduler_SMP_Extract extract_from_ready,685 Scheduler_SMP_Update update,686 Scheduler_SMP_Enqueue enqueue_fifo,687 Scheduler_SMP_Enqueue enqueue_lifo,688 Scheduler_SMP_Enqueue enqueue_scheduled_fifo,689 Scheduler_SMP_Enqueue enqueue_scheduled_lifo696 return ( *enqueue_fifo )( context, &node->Base, thread ); 697 } 698 699 static inline Thread_Control *_Scheduler_SMP_Change_priority( 700 Scheduler_Context *context, 701 Thread_Control *thread, 702 Priority_Control new_priority, 703 bool prepend_it, 704 Scheduler_SMP_Extract extract_from_ready, 705 Scheduler_SMP_Update update, 706 Scheduler_SMP_Enqueue enqueue_fifo, 707 Scheduler_SMP_Enqueue enqueue_lifo, 708 Scheduler_SMP_Enqueue_scheduled enqueue_scheduled_fifo, 709 Scheduler_SMP_Enqueue_scheduled enqueue_scheduled_lifo 690 710 ) 691 711 { 692 712 Scheduler_SMP_Node *node = _Scheduler_SMP_Thread_get_node( thread ); 713 Thread_Control *needs_help; 693 714 694 715 if ( node->state == SCHEDULER_SMP_NODE_SCHEDULED ) { … … 698 719 699 720 if ( prepend_it ) { 700 ( *enqueue_scheduled_lifo )( context, &node->Base );721 needs_help = ( *enqueue_scheduled_lifo )( context, &node->Base ); 701 722 } else { 702 ( *enqueue_scheduled_fifo )( context, &node->Base );723 needs_help = ( *enqueue_scheduled_fifo )( context, &node->Base ); 703 724 } 704 725 } else { … … 708 729 709 730 if ( prepend_it ) { 710 ( *enqueue_lifo )( context, &node->Base);731 needs_help = ( *enqueue_lifo )( context, &node->Base, NULL ); 711 732 } else { 712 ( *enqueue_fifo )( context, &node->Base);733 needs_help = ( *enqueue_fifo )( context, &node->Base, NULL ); 713 734 } 714 735 } 715 } 716 717 static inline void _Scheduler_SMP_Yield( 718 Scheduler_Context *context, 719 Thread_Control *thread, 720 Scheduler_SMP_Extract extract_from_ready, 721 Scheduler_SMP_Enqueue enqueue_fifo, 722 Scheduler_SMP_Enqueue enqueue_scheduled_fifo 736 737 return needs_help; 738 } 739 740 static inline Thread_Control *_Scheduler_SMP_Yield( 741 Scheduler_Context *context, 742 Thread_Control *thread, 743 Scheduler_SMP_Extract extract_from_ready, 744 Scheduler_SMP_Enqueue enqueue_fifo, 745 Scheduler_SMP_Enqueue_scheduled enqueue_scheduled_fifo 723 746 ) 724 747 { 725 748 Scheduler_SMP_Node *node = _Scheduler_SMP_Thread_get_node( thread ); 749 Thread_Control *needs_help; 726 750 727 751 if ( node->state == SCHEDULER_SMP_NODE_SCHEDULED ) { 728 752 _Scheduler_SMP_Extract_from_scheduled( &node->Base ); 729 753 730 ( *enqueue_scheduled_fifo )( context, &node->Base );754 needs_help = ( *enqueue_scheduled_fifo )( context, &node->Base ); 731 755 } else { 732 756 ( *extract_from_ready )( context, &node->Base ); 733 757 734 ( *enqueue_fifo )( context, &node->Base);758 needs_help = ( *enqueue_fifo )( context, &node->Base, NULL ); 735 759 } 760 761 return needs_help; 736 762 } 737 763 -
cpukit/score/src/schedulercbsunblock.c
rac532f3 r8568341 26 26 #include <rtems/score/watchdogimpl.h> 27 27 28 void _Scheduler_CBS_Unblock(28 Scheduler_Void_or_thread _Scheduler_CBS_Unblock( 29 29 const Scheduler_Control *scheduler, 30 30 Thread_Control *the_thread … … 85 85 _Thread_Dispatch_necessary = true; 86 86 } 87 88 SCHEDULER_RETURN_VOID_OR_NULL; 87 89 } -
cpukit/score/src/scheduleredfchangepriority.c
rac532f3 r8568341 21 21 #include <rtems/score/scheduleredfimpl.h> 22 22 23 void _Scheduler_EDF_Change_priority(23 Scheduler_Void_or_thread _Scheduler_EDF_Change_priority( 24 24 const Scheduler_Control *scheduler, 25 25 Thread_Control *the_thread, … … 34 34 _RBTree_Extract( &context->Ready, &node->Node ); 35 35 _RBTree_Insert( &context->Ready, &node->Node ); 36 37 SCHEDULER_RETURN_VOID_OR_NULL; 36 38 } -
cpukit/score/src/scheduleredfunblock.c
rac532f3 r8568341 23 23 #include <rtems/score/thread.h> 24 24 25 void _Scheduler_EDF_Unblock(25 Scheduler_Void_or_thread _Scheduler_EDF_Unblock( 26 26 const Scheduler_Control *scheduler, 27 27 Thread_Control *the_thread … … 52 52 _Thread_Dispatch_necessary = true; 53 53 } 54 55 SCHEDULER_RETURN_VOID_OR_NULL; 54 56 } -
cpukit/score/src/scheduleredfyield.c
rac532f3 r8568341 22 22 #include <rtems/score/scheduleredfimpl.h> 23 23 24 void _Scheduler_EDF_Yield(24 Scheduler_Void_or_thread _Scheduler_EDF_Yield( 25 25 const Scheduler_Control *scheduler, 26 26 Thread_Control *the_thread … … 39 39 40 40 _Scheduler_EDF_Schedule_body( scheduler, the_thread, false ); 41 42 SCHEDULER_RETURN_VOID_OR_NULL; 41 43 } -
cpukit/score/src/schedulerpriorityaffinitysmp.c
rac532f3 r8568341 289 289 * _Scheduler_SMP_Enqueue_ordered. 290 290 */ 291 static void_Scheduler_priority_affinity_SMP_Enqueue_fifo(291 static Thread_Control *_Scheduler_priority_affinity_SMP_Enqueue_fifo( 292 292 Scheduler_Context *context, 293 Scheduler_Node *node 294 ) 295 { 296 _Scheduler_SMP_Enqueue_ordered( 293 Scheduler_Node *node, 294 Thread_Control *needs_help 295 ) 296 { 297 return _Scheduler_SMP_Enqueue_ordered( 297 298 context, 298 299 node, 300 needs_help, 299 301 _Scheduler_priority_affinity_SMP_Insert_priority_fifo_order, 300 302 _Scheduler_priority_SMP_Insert_ready_fifo, … … 375 377 * This is the public scheduler specific Unblock operation. 376 378 */ 377 void_Scheduler_priority_affinity_SMP_Unblock(379 Thread_Control *_Scheduler_priority_affinity_SMP_Unblock( 378 380 const Scheduler_Control *scheduler, 379 381 Thread_Control *thread … … 381 383 { 382 384 Scheduler_Context *context = _Scheduler_Get_context( scheduler ); 383 384 _Scheduler_SMP_Unblock( 385 Thread_Control *needs_help; 386 387 needs_help = _Scheduler_SMP_Unblock( 385 388 context, 386 389 thread, … … 392 395 */ 393 396 _Scheduler_priority_affinity_SMP_Check_for_migrations( context ); 397 398 return needs_help; 394 399 } 395 400 … … 398 403 * get_lowest_scheduled helper to _Scheduler_SMP_Enqueue_ordered. 399 404 */ 400 static void_Scheduler_priority_affinity_SMP_Enqueue_ordered(405 static Thread_Control *_Scheduler_priority_affinity_SMP_Enqueue_ordered( 401 406 Scheduler_Context *context, 402 407 Scheduler_Node *node, 408 Thread_Control *needs_help, 403 409 Chain_Node_order order, 404 410 Scheduler_SMP_Insert insert_ready, … … 406 412 ) 407 413 { 408 _Scheduler_SMP_Enqueue_ordered(414 return _Scheduler_SMP_Enqueue_ordered( 409 415 context, 410 416 node, 417 needs_help, 411 418 order, 412 419 insert_ready, … … 423 430 * invokes a scheduler unique get_lowest_scheduled helper. 424 431 */ 425 static void_Scheduler_priority_affinity_SMP_Enqueue_lifo(432 static Thread_Control *_Scheduler_priority_affinity_SMP_Enqueue_lifo( 426 433 Scheduler_Context *context, 427 Scheduler_Node *node 428 ) 429 { 430 _Scheduler_priority_affinity_SMP_Enqueue_ordered( 434 Scheduler_Node *node, 435 Thread_Control *needs_help 436 ) 437 { 438 return _Scheduler_priority_affinity_SMP_Enqueue_ordered( 431 439 context, 432 440 node, 441 needs_help, 433 442 _Scheduler_priority_affinity_SMP_Insert_priority_lifo_order, 434 443 _Scheduler_priority_SMP_Insert_ready_lifo, … … 442 451 * this scheduler's get_highest_ready() helper. 443 452 */ 444 static void _Scheduler_priority_affinity_SMP_Enqueue_scheduled_ordered( 453 static Thread_Control * 454 _Scheduler_priority_affinity_SMP_Enqueue_scheduled_ordered( 445 455 Scheduler_Context *context, 446 456 Scheduler_Node *node, … … 450 460 ) 451 461 { 452 _Scheduler_SMP_Enqueue_scheduled_ordered(462 return _Scheduler_SMP_Enqueue_scheduled_ordered( 453 463 context, 454 464 node, … … 467 477 * invokes a scheduler unique get_lowest_scheduled helper. 468 478 */ 469 static void_Scheduler_priority_affinity_SMP_Enqueue_scheduled_lifo(479 static Thread_Control *_Scheduler_priority_affinity_SMP_Enqueue_scheduled_lifo( 470 480 Scheduler_Context *context, 471 481 Scheduler_Node *node 472 482 ) 473 483 { 474 _Scheduler_priority_affinity_SMP_Enqueue_scheduled_ordered(484 return _Scheduler_priority_affinity_SMP_Enqueue_scheduled_ordered( 475 485 context, 476 486 node, … … 486 496 * invokes a scheduler unique get_lowest_scheduled helper. 487 497 */ 488 static void_Scheduler_priority_affinity_SMP_Enqueue_scheduled_fifo(498 static Thread_Control *_Scheduler_priority_affinity_SMP_Enqueue_scheduled_fifo( 489 499 Scheduler_Context *context, 490 500 Scheduler_Node *node 491 501 ) 492 502 { 493 _Scheduler_priority_affinity_SMP_Enqueue_scheduled_ordered(503 return _Scheduler_priority_affinity_SMP_Enqueue_scheduled_ordered( 494 504 context, 495 505 node, … … 503 513 * This is the public scheduler specific Change Priority operation. 504 514 */ 505 void_Scheduler_priority_affinity_SMP_Change_priority(515 Thread_Control *_Scheduler_priority_affinity_SMP_Change_priority( 506 516 const Scheduler_Control *scheduler, 507 517 Thread_Control *thread, … … 511 521 { 512 522 Scheduler_Context *context = _Scheduler_Get_context( scheduler ); 513 514 _Scheduler_SMP_Change_priority( 523 Thread_Control *displaced; 524 525 displaced = _Scheduler_SMP_Change_priority( 515 526 context, 516 527 thread, … … 529 540 */ 530 541 _Scheduler_priority_affinity_SMP_Check_for_migrations( context ); 542 543 return displaced; 531 544 } 532 545 -
cpukit/score/src/schedulerprioritychangepriority.c
rac532f3 r8568341 22 22 #include <rtems/score/schedulerpriorityimpl.h> 23 23 24 void _Scheduler_priority_Change_priority(24 Scheduler_Void_or_thread _Scheduler_priority_Change_priority( 25 25 const Scheduler_Control *scheduler, 26 26 Thread_Control *the_thread, … … 59 59 ); 60 60 } 61 62 SCHEDULER_RETURN_VOID_OR_NULL; 61 63 } -
cpukit/score/src/schedulerprioritysmp.c
rac532f3 r8568341 98 98 } 99 99 100 static void _Scheduler_priority_SMP_Enqueue_ordered( 101 Scheduler_Context *context, 102 Scheduler_Node *node, 103 Chain_Node_order order, 104 Scheduler_SMP_Insert insert_ready, 105 Scheduler_SMP_Insert insert_scheduled 106 ) 107 { 108 _Scheduler_SMP_Enqueue_ordered( 109 context, 110 node, 100 static Thread_Control *_Scheduler_priority_SMP_Enqueue_ordered( 101 Scheduler_Context *context, 102 Scheduler_Node *node, 103 Thread_Control *needs_help, 104 Chain_Node_order order, 105 Scheduler_SMP_Insert insert_ready, 106 Scheduler_SMP_Insert insert_scheduled 107 ) 108 { 109 return _Scheduler_SMP_Enqueue_ordered( 110 context, 111 node, 112 needs_help, 111 113 order, 112 114 insert_ready, … … 118 120 } 119 121 120 static void _Scheduler_priority_SMP_Enqueue_lifo( 121 Scheduler_Context *context, 122 Scheduler_Node *node 123 ) 124 { 125 _Scheduler_priority_SMP_Enqueue_ordered( 126 context, 127 node, 122 static Thread_Control *_Scheduler_priority_SMP_Enqueue_lifo( 123 Scheduler_Context *context, 124 Scheduler_Node *node, 125 Thread_Control *needs_help 126 ) 127 { 128 return _Scheduler_priority_SMP_Enqueue_ordered( 129 context, 130 node, 131 needs_help, 128 132 _Scheduler_SMP_Insert_priority_lifo_order, 129 133 _Scheduler_priority_SMP_Insert_ready_lifo, … … 132 136 } 133 137 134 static void _Scheduler_priority_SMP_Enqueue_fifo( 135 Scheduler_Context *context, 136 Scheduler_Node *node 137 ) 138 { 139 _Scheduler_priority_SMP_Enqueue_ordered( 140 context, 141 node, 138 static Thread_Control *_Scheduler_priority_SMP_Enqueue_fifo( 139 Scheduler_Context *context, 140 Scheduler_Node *node, 141 Thread_Control *needs_help 142 ) 143 { 144 return _Scheduler_priority_SMP_Enqueue_ordered( 145 context, 146 node, 147 needs_help, 142 148 _Scheduler_SMP_Insert_priority_fifo_order, 143 149 _Scheduler_priority_SMP_Insert_ready_fifo, … … 146 152 } 147 153 148 static void_Scheduler_priority_SMP_Enqueue_scheduled_ordered(154 static Thread_Control *_Scheduler_priority_SMP_Enqueue_scheduled_ordered( 149 155 Scheduler_Context *context, 150 156 Scheduler_Node *node, … … 154 160 ) 155 161 { 156 _Scheduler_SMP_Enqueue_scheduled_ordered(162 return _Scheduler_SMP_Enqueue_scheduled_ordered( 157 163 context, 158 164 node, … … 166 172 } 167 173 168 static void_Scheduler_priority_SMP_Enqueue_scheduled_lifo(174 static Thread_Control *_Scheduler_priority_SMP_Enqueue_scheduled_lifo( 169 175 Scheduler_Context *context, 170 176 Scheduler_Node *node 171 177 ) 172 178 { 173 _Scheduler_priority_SMP_Enqueue_scheduled_ordered(179 return _Scheduler_priority_SMP_Enqueue_scheduled_ordered( 174 180 context, 175 181 node, … … 180 186 } 181 187 182 static void_Scheduler_priority_SMP_Enqueue_scheduled_fifo(188 static Thread_Control *_Scheduler_priority_SMP_Enqueue_scheduled_fifo( 183 189 Scheduler_Context *context, 184 190 Scheduler_Node *node 185 191 ) 186 192 { 187 _Scheduler_priority_SMP_Enqueue_scheduled_ordered(193 return _Scheduler_priority_SMP_Enqueue_scheduled_ordered( 188 194 context, 189 195 node, … … 194 200 } 195 201 196 void_Scheduler_priority_SMP_Unblock(197 const Scheduler_Control *scheduler, 198 Thread_Control *thread 199 ) 200 { 201 Scheduler_Context *context = _Scheduler_Get_context( scheduler ); 202 203 _Scheduler_SMP_Unblock(202 Thread_Control *_Scheduler_priority_SMP_Unblock( 203 const Scheduler_Control *scheduler, 204 Thread_Control *thread 205 ) 206 { 207 Scheduler_Context *context = _Scheduler_Get_context( scheduler ); 208 209 return _Scheduler_SMP_Unblock( 204 210 context, 205 211 thread, … … 208 214 } 209 215 210 void_Scheduler_priority_SMP_Change_priority(216 Thread_Control *_Scheduler_priority_SMP_Change_priority( 211 217 const Scheduler_Control *scheduler, 212 218 Thread_Control *thread, … … 217 223 Scheduler_Context *context = _Scheduler_Get_context( scheduler ); 218 224 219 _Scheduler_SMP_Change_priority(225 return _Scheduler_SMP_Change_priority( 220 226 context, 221 227 thread, … … 231 237 } 232 238 233 void_Scheduler_priority_SMP_Yield(239 Thread_Control *_Scheduler_priority_SMP_Yield( 234 240 const Scheduler_Control *scheduler, 235 241 Thread_Control *thread -
cpukit/score/src/schedulerpriorityunblock.c
rac532f3 r8568341 23 23 #include <rtems/score/schedulerpriorityimpl.h> 24 24 25 void _Scheduler_priority_Unblock (25 Scheduler_Void_or_thread _Scheduler_priority_Unblock ( 26 26 const Scheduler_Control *scheduler, 27 27 Thread_Control *the_thread … … 58 58 _Thread_Dispatch_necessary = true; 59 59 } 60 61 SCHEDULER_RETURN_VOID_OR_NULL; 60 62 } -
cpukit/score/src/schedulerpriorityyield.c
rac532f3 r8568341 22 22 #include <rtems/score/threadimpl.h> 23 23 24 void _Scheduler_priority_Yield(24 Scheduler_Void_or_thread _Scheduler_priority_Yield( 25 25 const Scheduler_Control *scheduler, 26 26 Thread_Control *the_thread … … 44 44 _Thread_Dispatch_necessary = true; 45 45 } 46 47 SCHEDULER_RETURN_VOID_OR_NULL; 46 48 } -
cpukit/score/src/schedulersimplechangepriority.c
rac532f3 r8568341 22 22 #include <rtems/score/schedulersimpleimpl.h> 23 23 24 void _Scheduler_simple_Change_priority(24 Scheduler_Void_or_thread _Scheduler_simple_Change_priority( 25 25 const Scheduler_Control *scheduler, 26 26 Thread_Control *the_thread, … … 39 39 _Scheduler_simple_Insert_priority_fifo( &context->Ready, the_thread ); 40 40 } 41 42 SCHEDULER_RETURN_VOID_OR_NULL; 41 43 } -
cpukit/score/src/schedulersimplesmp.c
rac532f3 r8568341 180 180 } 181 181 182 static void _Scheduler_simple_SMP_Enqueue_ordered( 183 Scheduler_Context *context, 184 Scheduler_Node *node, 185 Chain_Node_order order, 186 Scheduler_SMP_Insert insert_ready, 187 Scheduler_SMP_Insert insert_scheduled 188 ) 189 { 190 _Scheduler_SMP_Enqueue_ordered( 191 context, 192 node, 182 static Thread_Control *_Scheduler_simple_SMP_Enqueue_ordered( 183 Scheduler_Context *context, 184 Scheduler_Node *node, 185 Thread_Control *needs_help, 186 Chain_Node_order order, 187 Scheduler_SMP_Insert insert_ready, 188 Scheduler_SMP_Insert insert_scheduled 189 ) 190 { 191 return _Scheduler_SMP_Enqueue_ordered( 192 context, 193 node, 194 needs_help, 193 195 order, 194 196 insert_ready, … … 200 202 } 201 203 202 static void _Scheduler_simple_SMP_Enqueue_lifo( 203 Scheduler_Context *context, 204 Scheduler_Node *node 205 ) 206 { 207 _Scheduler_simple_SMP_Enqueue_ordered( 208 context, 209 node, 204 static Thread_Control *_Scheduler_simple_SMP_Enqueue_lifo( 205 Scheduler_Context *context, 206 Scheduler_Node *node, 207 Thread_Control *needs_help 208 ) 209 { 210 return _Scheduler_simple_SMP_Enqueue_ordered( 211 context, 212 node, 213 needs_help, 210 214 _Scheduler_SMP_Insert_priority_lifo_order, 211 215 _Scheduler_simple_SMP_Insert_ready_lifo, … … 214 218 } 215 219 216 static void _Scheduler_simple_SMP_Enqueue_fifo( 217 Scheduler_Context *context, 218 Scheduler_Node *node 219 ) 220 { 221 _Scheduler_simple_SMP_Enqueue_ordered( 222 context, 223 node, 220 static Thread_Control *_Scheduler_simple_SMP_Enqueue_fifo( 221 Scheduler_Context *context, 222 Scheduler_Node *node, 223 Thread_Control *needs_help 224 ) 225 { 226 return _Scheduler_simple_SMP_Enqueue_ordered( 227 context, 228 node, 229 needs_help, 224 230 _Scheduler_SMP_Insert_priority_fifo_order, 225 231 _Scheduler_simple_SMP_Insert_ready_fifo, … … 228 234 } 229 235 230 static void_Scheduler_simple_SMP_Enqueue_scheduled_ordered(236 static Thread_Control *_Scheduler_simple_SMP_Enqueue_scheduled_ordered( 231 237 Scheduler_Context *context, 232 238 Scheduler_Node *node, … … 236 242 ) 237 243 { 238 _Scheduler_SMP_Enqueue_scheduled_ordered(244 return _Scheduler_SMP_Enqueue_scheduled_ordered( 239 245 context, 240 246 node, … … 248 254 } 249 255 250 static void_Scheduler_simple_SMP_Enqueue_scheduled_lifo(256 static Thread_Control *_Scheduler_simple_SMP_Enqueue_scheduled_lifo( 251 257 Scheduler_Context *context, 252 258 Scheduler_Node *node 253 259 ) 254 260 { 255 _Scheduler_simple_SMP_Enqueue_scheduled_ordered(261 return _Scheduler_simple_SMP_Enqueue_scheduled_ordered( 256 262 context, 257 263 node, … … 262 268 } 263 269 264 static void_Scheduler_simple_SMP_Enqueue_scheduled_fifo(270 static Thread_Control *_Scheduler_simple_SMP_Enqueue_scheduled_fifo( 265 271 Scheduler_Context *context, 266 272 Scheduler_Node *node 267 273 ) 268 274 { 269 _Scheduler_simple_SMP_Enqueue_scheduled_ordered(275 return _Scheduler_simple_SMP_Enqueue_scheduled_ordered( 270 276 context, 271 277 node, … … 276 282 } 277 283 278 void_Scheduler_simple_SMP_Unblock(284 Thread_Control *_Scheduler_simple_SMP_Unblock( 279 285 const Scheduler_Control *scheduler, 280 286 Thread_Control *thread … … 283 289 Scheduler_Context *context = _Scheduler_Get_context( scheduler ); 284 290 285 _Scheduler_SMP_Unblock(291 return _Scheduler_SMP_Unblock( 286 292 context, 287 293 thread, … … 290 296 } 291 297 292 void_Scheduler_simple_SMP_Change_priority(298 Thread_Control *_Scheduler_simple_SMP_Change_priority( 293 299 const Scheduler_Control *scheduler, 294 300 Thread_Control *thread, … … 299 305 Scheduler_Context *context = _Scheduler_Get_context( scheduler ); 300 306 301 _Scheduler_SMP_Change_priority(307 return _Scheduler_SMP_Change_priority( 302 308 context, 303 309 thread, … … 313 319 } 314 320 315 void_Scheduler_simple_SMP_Yield(321 Thread_Control *_Scheduler_simple_SMP_Yield( 316 322 const Scheduler_Control *scheduler, 317 323 Thread_Control *thread -
cpukit/score/src/schedulersimpleunblock.c
rac532f3 r8568341 22 22 #include <rtems/score/thread.h> 23 23 24 void _Scheduler_simple_Unblock(24 Scheduler_Void_or_thread _Scheduler_simple_Unblock( 25 25 const Scheduler_Control *scheduler, 26 26 Thread_Control *the_thread … … 50 50 _Thread_Dispatch_necessary = true; 51 51 } 52 53 SCHEDULER_RETURN_VOID_OR_NULL; 52 54 } -
cpukit/score/src/schedulersimpleyield.c
rac532f3 r8568341 21 21 #include <rtems/score/schedulersimpleimpl.h> 22 22 23 void _Scheduler_simple_Yield(23 Scheduler_Void_or_thread _Scheduler_simple_Yield( 24 24 const Scheduler_Control *scheduler, 25 25 Thread_Control *the_thread … … 32 32 _Scheduler_simple_Insert_priority_fifo( &context->Ready, the_thread ); 33 33 _Scheduler_simple_Schedule_body( scheduler, the_thread, false ); 34 35 SCHEDULER_RETURN_VOID_OR_NULL; 34 36 } -
testsuites/smptests/smpscheduler03/init.c
rac532f3 r8568341 54 54 } 55 55 56 static void test_case( 56 static rtems_id start_task(rtems_task_priority prio) 57 { 58 rtems_status_code sc; 59 rtems_id task_id; 60 61 sc = rtems_task_create( 62 rtems_build_name('T', 'A', 'S', 'K'), 63 prio, 64 RTEMS_MINIMUM_STACK_SIZE, 65 RTEMS_DEFAULT_MODES, 66 RTEMS_DEFAULT_ATTRIBUTES, 67 &task_id 68 ); 69 rtems_test_assert(sc == RTEMS_SUCCESSFUL); 70 71 sc = rtems_task_start(task_id, task, 0); 72 rtems_test_assert(sc == RTEMS_SUCCESSFUL); 73 74 return task_id; 75 } 76 77 static Thread_Control *get_thread_by_id(rtems_id task_id) 78 { 79 Objects_Locations location; 80 Thread_Control *thread; 81 82 thread = _Thread_Get(task_id, &location); 83 rtems_test_assert(location == OBJECTS_LOCAL); 84 _Thread_Enable_dispatch(); 85 86 return thread; 87 } 88 89 static void test_case_change_priority( 57 90 Thread_Control *executing, 58 91 Scheduler_SMP_Node *node, … … 99 132 size_t k; 100 133 101 sc = rtems_task_create( 102 rtems_build_name('T', 'A', 'S', 'K'), 103 3, 104 RTEMS_MINIMUM_STACK_SIZE, 105 RTEMS_DEFAULT_MODES, 106 RTEMS_DEFAULT_ATTRIBUTES, 107 &task_id 108 ); 109 rtems_test_assert(sc == RTEMS_SUCCESSFUL); 110 111 sc = rtems_task_start(task_id, task, 0); 112 rtems_test_assert(sc == RTEMS_SUCCESSFUL); 134 task_id = start_task(3); 113 135 114 136 _Thread_Disable_dispatch(); … … 120 142 for (j = 0; j < RTEMS_ARRAY_SIZE(priorities); ++j) { 121 143 for (k = 0; k < RTEMS_ARRAY_SIZE(prepend_it); ++k) { 122 test_case (144 test_case_change_priority( 123 145 executing, 124 146 node, … … 141 163 } 142 164 165 static Thread_Control *change_priority_op( 166 Thread_Control *thread, 167 Priority_Control new_priority, 168 bool prepend_it 169 ) 170 { 171 const Scheduler_Control *scheduler = _Scheduler_Get(thread); 172 Thread_Control *needs_help; 173 ISR_Level level; 174 175 _ISR_Disable( level ); 176 thread->current_priority = new_priority; 177 needs_help = (*scheduler->Operations.change_priority)( 178 scheduler, 179 thread, 180 new_priority, 181 prepend_it 182 ); 183 _ISR_Enable( level ); 184 185 return needs_help; 186 } 187 188 static void test_case_change_priority_op( 189 Thread_Control *executing, 190 Scheduler_SMP_Node *executing_node, 191 Thread_Control *other, 192 Scheduler_SMP_Node_state start_state, 193 Priority_Control prio, 194 bool prepend_it, 195 Scheduler_SMP_Node_state new_state 196 ) 197 { 198 Thread_Control *needs_help; 199 200 switch (start_state) { 201 case SCHEDULER_SMP_NODE_SCHEDULED: 202 _Thread_Change_priority(executing, 1, true); 203 break; 204 case SCHEDULER_SMP_NODE_READY: 205 _Thread_Change_priority(executing, 4, true); 206 break; 207 default: 208 rtems_test_assert(0); 209 break; 210 } 211 rtems_test_assert(executing_node->state == start_state); 212 213 needs_help = change_priority_op(executing, prio, prepend_it); 214 rtems_test_assert(executing_node->state == new_state); 215 216 if (start_state != new_state) { 217 switch (start_state) { 218 case SCHEDULER_SMP_NODE_SCHEDULED: 219 rtems_test_assert(needs_help == executing); 220 break; 221 case SCHEDULER_SMP_NODE_READY: 222 rtems_test_assert(needs_help == other); 223 break; 224 default: 225 rtems_test_assert(0); 226 break; 227 } 228 } else { 229 rtems_test_assert(needs_help == NULL); 230 } 231 } 232 233 static void test_change_priority_op(void) 234 { 235 rtems_status_code sc; 236 rtems_id task_id; 237 Thread_Control *executing; 238 Scheduler_SMP_Node *executing_node; 239 Thread_Control *other; 240 size_t i; 241 size_t j; 242 size_t k; 243 244 task_id = start_task(3); 245 246 _Thread_Disable_dispatch(); 247 248 executing = _Thread_Executing; 249 executing_node = _Scheduler_SMP_Thread_get_node(executing); 250 251 other = get_thread_by_id(task_id); 252 253 for (i = 0; i < RTEMS_ARRAY_SIZE(states); ++i) { 254 for (j = 0; j < RTEMS_ARRAY_SIZE(priorities); ++j) { 255 for (k = 0; k < RTEMS_ARRAY_SIZE(prepend_it); ++k) { 256 test_case_change_priority_op( 257 executing, 258 executing_node, 259 other, 260 states[i], 261 priorities[j], 262 prepend_it[k], 263 states[j] 264 ); 265 } 266 } 267 } 268 269 _Thread_Change_priority(executing, 1, true); 270 rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED); 271 272 _Thread_Enable_dispatch(); 273 274 sc = rtems_task_delete(task_id); 275 rtems_test_assert(sc == RTEMS_SUCCESSFUL); 276 } 277 278 static Thread_Control *yield_op(Thread_Control *thread) 279 { 280 const Scheduler_Control *scheduler = _Scheduler_Get(thread); 281 Thread_Control *needs_help; 282 ISR_Level level; 283 284 _ISR_Disable( level ); 285 needs_help = (*scheduler->Operations.yield)(scheduler, thread); 286 _ISR_Enable( level ); 287 288 return needs_help; 289 } 290 291 static void test_case_yield_op( 292 Thread_Control *executing, 293 Scheduler_SMP_Node *executing_node, 294 Thread_Control *other, 295 Scheduler_SMP_Node_state start_state, 296 Scheduler_SMP_Node_state new_state 297 ) 298 { 299 Thread_Control *needs_help; 300 301 _Thread_Change_priority(executing, 4, false); 302 _Thread_Change_priority(other, 4, false); 303 304 switch (start_state) { 305 case SCHEDULER_SMP_NODE_SCHEDULED: 306 switch (new_state) { 307 case SCHEDULER_SMP_NODE_SCHEDULED: 308 _Thread_Change_priority(executing, 2, false); 309 _Thread_Change_priority(other, 3, false); 310 break; 311 case SCHEDULER_SMP_NODE_READY: 312 _Thread_Change_priority(executing, 2, false); 313 _Thread_Change_priority(other, 2, false); 314 break; 315 default: 316 rtems_test_assert(0); 317 break; 318 } 319 break; 320 case SCHEDULER_SMP_NODE_READY: 321 switch (new_state) { 322 case SCHEDULER_SMP_NODE_SCHEDULED: 323 rtems_test_assert(0); 324 break; 325 case SCHEDULER_SMP_NODE_READY: 326 _Thread_Change_priority(executing, 3, false); 327 _Thread_Change_priority(other, 2, false); 328 break; 329 default: 330 rtems_test_assert(0); 331 break; 332 } 333 break; 334 default: 335 rtems_test_assert(0); 336 break; 337 } 338 rtems_test_assert(executing_node->state == start_state); 339 340 needs_help = yield_op(executing); 341 rtems_test_assert(executing_node->state == new_state); 342 343 if (start_state != new_state) { 344 switch (start_state) { 345 case SCHEDULER_SMP_NODE_SCHEDULED: 346 rtems_test_assert(needs_help == executing); 347 break; 348 case SCHEDULER_SMP_NODE_READY: 349 rtems_test_assert(needs_help == other); 350 break; 351 default: 352 rtems_test_assert(0); 353 break; 354 } 355 } else { 356 rtems_test_assert(needs_help == NULL); 357 } 358 } 359 360 static void test_yield_op(void) 361 { 362 rtems_status_code sc; 363 rtems_id task_id; 364 Thread_Control *executing; 365 Scheduler_SMP_Node *executing_node; 366 Thread_Control *other; 367 size_t i; 368 size_t j; 369 370 task_id = start_task(2); 371 372 _Thread_Disable_dispatch(); 373 374 executing = _Thread_Executing; 375 executing_node = _Scheduler_SMP_Thread_get_node(executing); 376 377 other = get_thread_by_id(task_id); 378 379 for (i = 0; i < RTEMS_ARRAY_SIZE(states); ++i) { 380 for (j = 0; j < RTEMS_ARRAY_SIZE(states); ++j) { 381 if ( 382 states[i] != SCHEDULER_SMP_NODE_READY 383 || states[j] != SCHEDULER_SMP_NODE_SCHEDULED 384 ) { 385 test_case_yield_op( 386 executing, 387 executing_node, 388 other, 389 states[i], 390 states[j] 391 ); 392 } 393 } 394 } 395 396 _Thread_Change_priority(executing, 1, true); 397 rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED); 398 399 _Thread_Enable_dispatch(); 400 401 sc = rtems_task_delete(task_id); 402 rtems_test_assert(sc == RTEMS_SUCCESSFUL); 403 } 404 405 static void block_op(Thread_Control *thread) 406 { 407 const Scheduler_Control *scheduler = _Scheduler_Get(thread); 408 ISR_Level level; 409 410 _ISR_Disable( level ); 411 (*scheduler->Operations.block)(scheduler, thread); 412 _ISR_Enable( level ); 413 } 414 415 static Thread_Control *unblock_op(Thread_Control *thread) 416 { 417 const Scheduler_Control *scheduler = _Scheduler_Get(thread); 418 Thread_Control *needs_help; 419 ISR_Level level; 420 421 _ISR_Disable( level ); 422 needs_help = (*scheduler->Operations.unblock)(scheduler, thread); 423 _ISR_Enable( level ); 424 425 return needs_help; 426 } 427 428 static void test_case_unblock_op( 429 Thread_Control *executing, 430 Scheduler_SMP_Node *executing_node, 431 Thread_Control *other, 432 Scheduler_SMP_Node_state new_state 433 ) 434 { 435 Thread_Control *needs_help; 436 437 switch (new_state) { 438 case SCHEDULER_SMP_NODE_SCHEDULED: 439 _Thread_Change_priority(executing, 2, false); 440 rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED); 441 break; 442 case SCHEDULER_SMP_NODE_READY: 443 _Thread_Change_priority(executing, 4, false); 444 rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_READY); 445 break; 446 default: 447 rtems_test_assert(0); 448 break; 449 } 450 451 block_op(executing); 452 rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_BLOCKED); 453 454 needs_help = unblock_op(executing); 455 rtems_test_assert(executing_node->state == new_state); 456 457 switch (new_state) { 458 case SCHEDULER_SMP_NODE_SCHEDULED: 459 rtems_test_assert(needs_help == other); 460 break; 461 case SCHEDULER_SMP_NODE_READY: 462 rtems_test_assert(needs_help == executing); 463 break; 464 default: 465 rtems_test_assert(0); 466 break; 467 } 468 } 469 470 static void test_unblock_op(void) 471 { 472 rtems_status_code sc; 473 rtems_id task_id; 474 Thread_Control *executing; 475 Scheduler_SMP_Node *executing_node; 476 Thread_Control *other; 477 size_t i; 478 479 task_id = start_task(3); 480 481 _Thread_Disable_dispatch(); 482 483 executing = _Thread_Executing; 484 executing_node = _Scheduler_SMP_Thread_get_node(executing); 485 486 other = get_thread_by_id(task_id); 487 488 for (i = 0; i < RTEMS_ARRAY_SIZE(states); ++i) { 489 test_case_unblock_op( 490 executing, 491 executing_node, 492 other, 493 states[i] 494 ); 495 } 496 497 _Thread_Change_priority(executing, 1, true); 498 rtems_test_assert(executing_node->state == SCHEDULER_SMP_NODE_SCHEDULED); 499 500 _Thread_Enable_dispatch(); 501 502 sc = rtems_task_delete(task_id); 503 rtems_test_assert(sc == RTEMS_SUCCESSFUL); 504 } 505 506 static void tests(void) 507 { 508 test_change_priority(); 509 test_change_priority_op(); 510 test_yield_op(); 511 test_unblock_op(); 512 } 513 143 514 static void test_task(rtems_task_argument arg) 144 515 { 145 516 test_context *ctx = &test_instance; 146 517 147 test _change_priority();518 tests(); 148 519 149 520 ctx->cpu_index[arg] = rtems_get_current_processor(); … … 203 574 } 204 575 205 test _change_priority();576 tests(); 206 577 207 578 barrier_wait(ctx);
Note: See TracChangeset
for help on using the changeset viewer.