[56c396b] | 1 | /** |
---|
| 2 | * @file |
---|
| 3 | * |
---|
| 4 | * @brief Deterministic Priority Affinity SMP Scheduler Implementation |
---|
| 5 | * |
---|
| 6 | * @ingroup ScoreSchedulerPriorityAffinitySMP |
---|
| 7 | */ |
---|
| 8 | |
---|
| 9 | /* |
---|
| 10 | * COPYRIGHT (c) 2014. |
---|
| 11 | * On-Line Applications Research Corporation (OAR). |
---|
| 12 | * |
---|
| 13 | * The license and distribution terms for this file may be |
---|
| 14 | * found in the file LICENSE in this distribution or at |
---|
| 15 | * http://www.rtems.org/license/LICENSE. |
---|
| 16 | */ |
---|
| 17 | |
---|
| 18 | #if HAVE_CONFIG_H |
---|
| 19 | #include "config.h" |
---|
| 20 | #endif |
---|
| 21 | |
---|
| 22 | #include <rtems/score/schedulerpriorityaffinitysmp.h> |
---|
| 23 | #include <rtems/score/schedulerpriorityimpl.h> |
---|
| 24 | #include <rtems/score/schedulersmpimpl.h> |
---|
| 25 | #include <rtems/score/wkspace.h> |
---|
| 26 | #include <rtems/score/cpusetimpl.h> |
---|
| 27 | |
---|
[beab7329] | 28 | static Scheduler_priority_affinity_SMP_Node * |
---|
| 29 | _Scheduler_priority_affinity_Node_get( Thread_Control *thread ) |
---|
[56c396b] | 30 | { |
---|
[beab7329] | 31 | return ( Scheduler_priority_affinity_SMP_Node * ) |
---|
| 32 | _Scheduler_Node_get( thread ); |
---|
[56c396b] | 33 | } |
---|
| 34 | |
---|
[8e467384] | 35 | void _Scheduler_priority_affinity_SMP_Node_initialize( |
---|
[e1598a6] | 36 | const Scheduler_Control *scheduler, |
---|
| 37 | Thread_Control *the_thread |
---|
[24934e36] | 38 | ) |
---|
[56c396b] | 39 | { |
---|
[beab7329] | 40 | Scheduler_priority_affinity_SMP_Node *node = |
---|
| 41 | _Scheduler_priority_affinity_Node_get( the_thread ); |
---|
[56c396b] | 42 | |
---|
[beab7329] | 43 | _Scheduler_SMP_Node_initialize( &node->Base.Base ); |
---|
| 44 | |
---|
| 45 | node->Affinity = *_CPU_set_Default(); |
---|
| 46 | node->Affinity.set = &node->Affinity.preallocated; |
---|
[56c396b] | 47 | } |
---|
| 48 | |
---|
| 49 | bool _Scheduler_priority_affinity_SMP_Get_affinity( |
---|
[e1598a6] | 50 | const Scheduler_Control *scheduler, |
---|
| 51 | Thread_Control *thread, |
---|
| 52 | size_t cpusetsize, |
---|
| 53 | cpu_set_t *cpuset |
---|
[56c396b] | 54 | ) |
---|
| 55 | { |
---|
[beab7329] | 56 | Scheduler_priority_affinity_SMP_Node *node = |
---|
| 57 | _Scheduler_priority_affinity_Node_get(thread); |
---|
[56c396b] | 58 | |
---|
[24934e36] | 59 | (void) scheduler; |
---|
| 60 | |
---|
[beab7329] | 61 | if ( node->Affinity.setsize != cpusetsize ) { |
---|
[56c396b] | 62 | return false; |
---|
| 63 | } |
---|
| 64 | |
---|
[beab7329] | 65 | CPU_COPY( cpuset, node->Affinity.set ); |
---|
[56c396b] | 66 | return true; |
---|
| 67 | } |
---|
| 68 | |
---|
| 69 | bool _Scheduler_priority_affinity_SMP_Set_affinity( |
---|
[e1598a6] | 70 | const Scheduler_Control *scheduler, |
---|
| 71 | Thread_Control *thread, |
---|
| 72 | size_t cpusetsize, |
---|
| 73 | cpu_set_t *cpuset |
---|
[56c396b] | 74 | ) |
---|
| 75 | { |
---|
[beab7329] | 76 | Scheduler_priority_affinity_SMP_Node *node = |
---|
| 77 | _Scheduler_priority_affinity_Node_get(thread); |
---|
[24934e36] | 78 | |
---|
| 79 | (void) scheduler; |
---|
[56c396b] | 80 | |
---|
| 81 | if ( ! _CPU_set_Is_valid( cpuset, cpusetsize ) ) { |
---|
| 82 | return false; |
---|
| 83 | } |
---|
| 84 | |
---|
[beab7329] | 85 | CPU_COPY( node->Affinity.set, cpuset ); |
---|
[56c396b] | 86 | |
---|
| 87 | return true; |
---|
| 88 | } |
---|