diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-11 10:58:59 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-12 13:24:41 +0200 |
commit | e135271b933c896068a343b161773ce3b685be43 (patch) | |
tree | 83faf308498a9695ba551f8e5b3f7473daa37d68 /cpukit/score/src/schedulersetaffinity.c | |
parent | score: Use thread state lock for current state (diff) | |
download | rtems-e135271b933c896068a343b161773ce3b685be43.tar.bz2 |
score: Avoid Giant lock _Scheduler_Set_affinity()
Update #2555.
Diffstat (limited to 'cpukit/score/src/schedulersetaffinity.c')
-rw-r--r-- | cpukit/score/src/schedulersetaffinity.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/cpukit/score/src/schedulersetaffinity.c b/cpukit/score/src/schedulersetaffinity.c index f7c9336df1..b59d8eb68e 100644 --- a/cpukit/score/src/schedulersetaffinity.c +++ b/cpukit/score/src/schedulersetaffinity.c @@ -21,32 +21,40 @@ #if defined(__RTEMS_HAVE_SYS_CPUSET_H__) bool _Scheduler_Set_affinity( - Thread_Control *the_thread, - size_t cpusetsize, - const cpu_set_t *cpuset + Thread_Control *the_thread, + size_t cpusetsize, + const 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.set_affinity )( + ok = ( *scheduler->Operations.set_affinity )( scheduler, the_thread, cpusetsize, cpuset ); #else - return _Scheduler_default_Set_affinity_body( + ok = _Scheduler_default_Set_affinity_body( scheduler, the_thread, cpusetsize, cpuset ); #endif + + _Scheduler_Release_critical( scheduler, &lock_context ); + return ok; } #endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */ |