int pthread_attr_setaffinity_np( pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset ) { if ( !cpuset ) return EFAULT; if ( !attr ) return EFAULT; if (! _CPU_set_Is_valid( cpuset, cpusetsize ) ) return EINVAL; CPU_COPY( attr->affinityset, cpuset ); return 0; }
bool _Scheduler_priority_affinity_SMP_Set_affinity( const Scheduler_Control *scheduler, Thread_Control *thread, size_t cpusetsize, const cpu_set_t *cpuset ) { Scheduler_priority_affinity_SMP_Node *node; States_Control current_state; /* * Validate that the cpset meets basic requirements. */ if ( !_CPU_set_Is_valid( cpuset, cpusetsize ) ) { return false; } node = _Scheduler_priority_affinity_SMP_Thread_get_node( thread ); /* * The old and new set are the same, there is no point in * doing anything. */ if ( CPU_EQUAL_S( cpusetsize, cpuset, node->Affinity.set ) ) return true; current_state = thread->current_state; if ( _States_Is_ready( current_state ) ) { _Scheduler_priority_affinity_SMP_Block( scheduler, thread ); } CPU_COPY( node->Affinity.set, cpuset ); if ( _States_Is_ready( current_state ) ) { /* * FIXME: Do not ignore threads in need for help. */ (void) _Scheduler_priority_affinity_SMP_Unblock( scheduler, thread ); } return true; }
bool _Scheduler_priority_affinity_SMP_Set_affinity( const Scheduler_Control *scheduler, Thread_Control *thread, size_t cpusetsize, cpu_set_t *cpuset ) { Scheduler_priority_affinity_SMP_Node *node = _Scheduler_priority_affinity_Node_get(thread); (void) scheduler; if ( ! _CPU_set_Is_valid( cpuset, cpusetsize ) ) { return false; } CPU_COPY( node->Affinity.set, cpuset ); return true; }