From d99529999451043166c6dbf3ef22be42463e16f3 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 11 May 2016 11:06:51 +0200 Subject: score: Avoid Giant lock _Scheduler_Get_affinity() Update #2555. --- cpukit/score/src/schedulergetaffinity.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'cpukit/score/src/schedulergetaffinity.c') diff --git a/cpukit/score/src/schedulergetaffinity.c b/cpukit/score/src/schedulergetaffinity.c index 06ebfbe6a6..c910a75d46 100644 --- a/cpukit/score/src/schedulergetaffinity.c +++ b/cpukit/score/src/schedulergetaffinity.c @@ -26,28 +26,35 @@ bool _Scheduler_Get_affinity( cpu_set_t *cpuset ) { - const Scheduler_Control *scheduler = _Scheduler_Get( the_thread ); + const Scheduler_Control *scheduler; + ISR_lock_Context lock_context; + bool ok; if ( !_CPU_set_Is_large_enough( cpusetsize ) ) { return false; } + scheduler = _Scheduler_Get( the_thread ); + _Scheduler_Acquire_critical( scheduler, &lock_context ); #if defined(RTEMS_SMP) - return ( *scheduler->Operations.get_affinity )( + ok = ( *scheduler->Operations.get_affinity )( scheduler, the_thread, cpusetsize, cpuset ); #else - return _Scheduler_default_Get_affinity_body( + ok = _Scheduler_default_Get_affinity_body( scheduler, the_thread, cpusetsize, cpuset ); #endif + + _Scheduler_Release_critical( scheduler, &lock_context ); + return ok; } #endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */ -- cgit v1.2.3