[8396c18e] | 1 | /** |
---|
| 2 | * @file |
---|
| 3 | * |
---|
| 4 | * @brief Scheduler EDF Unblock |
---|
| 5 | * @ingroup ScoreScheduler |
---|
| 6 | */ |
---|
| 7 | |
---|
[5472ad41] | 8 | /* |
---|
| 9 | * Copyright (C) 2011 Petr Benes. |
---|
| 10 | * Copyright (C) 2011 On-Line Applications Research Corporation (OAR). |
---|
| 11 | * |
---|
| 12 | * The license and distribution terms for this file may be |
---|
| 13 | * found in the file LICENSE in this distribution or at |
---|
[c499856] | 14 | * http://www.rtems.org/license/LICENSE. |
---|
[5472ad41] | 15 | */ |
---|
| 16 | |
---|
| 17 | #if HAVE_CONFIG_H |
---|
| 18 | #include "config.h" |
---|
| 19 | #endif |
---|
| 20 | |
---|
[f39f667a] | 21 | #include <rtems/score/scheduleredfimpl.h> |
---|
[c6e21ee1] | 22 | #include <rtems/score/schedulerimpl.h> |
---|
[f068384e] | 23 | #include <rtems/score/thread.h> |
---|
[5472ad41] | 24 | |
---|
[8568341] | 25 | Scheduler_Void_or_thread _Scheduler_EDF_Unblock( |
---|
[e1598a6] | 26 | const Scheduler_Control *scheduler, |
---|
| 27 | Thread_Control *the_thread |
---|
[5472ad41] | 28 | ) |
---|
| 29 | { |
---|
[99fc1d1d] | 30 | Scheduler_EDF_Context *context; |
---|
| 31 | Scheduler_EDF_Node *node; |
---|
| 32 | |
---|
| 33 | context = _Scheduler_EDF_Get_context( scheduler ); |
---|
| 34 | node = _Scheduler_EDF_Thread_get_node( the_thread ); |
---|
| 35 | |
---|
| 36 | _Scheduler_EDF_Enqueue( context, node, node->current_priority ); |
---|
[5472ad41] | 37 | |
---|
| 38 | /* |
---|
| 39 | * If the thread that was unblocked is more important than the heir, |
---|
| 40 | * then we have a new heir. This may or may not result in a |
---|
| 41 | * context switch. |
---|
| 42 | * |
---|
| 43 | * Normal case: |
---|
| 44 | * If the current thread is preemptible, then we need to do |
---|
| 45 | * a context switch. |
---|
| 46 | * Pseudo-ISR case: |
---|
| 47 | * Even if the thread isn't preemptible, if the new heir is |
---|
| 48 | * a pseudo-ISR system task, we need to do a context switch. |
---|
| 49 | */ |
---|
[99fc1d1d] | 50 | if ( the_thread->current_priority < _Thread_Heir->current_priority ) { |
---|
[b8a5abf] | 51 | _Scheduler_Update_heir( |
---|
| 52 | the_thread, |
---|
| 53 | the_thread->current_priority == PRIORITY_PSEUDO_ISR |
---|
| 54 | ); |
---|
[5472ad41] | 55 | } |
---|
[8568341] | 56 | |
---|
| 57 | SCHEDULER_RETURN_VOID_OR_NULL; |
---|
[5472ad41] | 58 | } |
---|