Пример #1
0
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;
}
Пример #3
0
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;
}