int rtems_shell_main_task_set_affinity(
  int   argc,
  char *argv[]
)
{
  rtems_id             id;
  rtems_status_code    status;
  unsigned long        tmp;
  cpu_set_t            cpuset;

  CHECK_RTEMS_IS_UP();

  if (argc != 3) {
    fprintf( stderr, "%s: Usage [name|id] affinity\n", argv[0] );
    return -1;
  }

  if ( lookup_task( argv[1], &id ) )
    return -1;

  if ( rtems_string_to_unsigned_long( argv[2], &tmp, NULL, 0) ) {
    fprintf( stderr, "Affinity (%s) is not a number\n", argv[2] );
    return 1;
  }

  CPU_ZERO( &cpuset );
  cpuset.__bits[0] = tmp;

  /*
   *  Now change the affinity of the task
   */
  status = rtems_task_set_affinity( id, sizeof(cpuset), &cpuset );
  if ( status != RTEMS_SUCCESSFUL ) {
    fprintf(
      stderr,
      "Task Set Affinity(%s) returned %s\n",
      argv[1],
      rtems_status_text( status )
    );
    return -1;
  }

  printf("Task (0x%08x) Set affinity=0x%08x\n", id, cpuset.__bits[0] );

  return 0;
}
int rtems_shell_main_task_delete(
  int   argc,
  char *argv[]
)
{
  rtems_id           id;
  rtems_status_code  status;

  CHECK_RTEMS_IS_UP();

  if (argc != 2) {
    fprintf( stderr, "%s: Usage [name|id]\n", argv[0] );
    return -1;
  }

  if ( lookup_task( argv[1], &id ) )
    return -1;

  /*
   *  Now delete the task
   */
  status = rtems_task_delete( id );
  if ( status != RTEMS_SUCCESSFUL ) {
    fprintf(
      stderr,
      "Task Delete(%s) returned %s\n",
      argv[1],
      rtems_status_text( status )
    );
    return -1;
  }

  printf("Task (0x%08x) deleted\n", id );

  return 0;
}
Exemple #3
0
long sys_timer_create(clockid_t clockid,struct sigevent *evp,
                      posixid_t *timerid)
{
  task_t *caller=current_task(), *target=NULL;
  posix_stuff_t *stuff;
  struct sigevent kevp;
  long id,r;
  posix_timer_t *ptimer=NULL;
  ksiginfo_t *ksiginfo;

  if( !s_check_system_capability(SYS_CAP_TIMER) ) {
    return ERR(-EPERM);
  }

  if( clockid != CLOCK_REALTIME ) {
    return ERR(-EINVAL);
  }

  if( evp ) {
    if( copy_from_user(&kevp,evp,sizeof(kevp)) ) {
      return ERR(-EFAULT);
    }
    if( !posix_validate_sigevent(&kevp) ) {
      return ERR(-EINVAL);
    }
  } else {
    INIT_SIGEVENT(kevp);
  }

  ptimer=memalloc(sizeof(*ptimer));
  if( !ptimer ) {
    return ERR(-ENOMEM);
  }

  memset(ptimer,0,sizeof(*ptimer));
  stuff=caller->posix_stuff;

  LOCK_POSIX_STUFF_W(stuff);
  r=-EAGAIN;
  if( ++stuff->timers > get_limit(caller->limits, LIMIT_TIMERS) ) {
    goto out;
  }
  id=posix_allocate_obj_id(stuff);
  if( id < 0 ) {
    goto out;
  }
  UNLOCK_POSIX_STUFF_W(stuff);

  if( !evp ) {
    kevp.sigev_value.sival_int=id;
  }

  POSIX_KOBJ_INIT(&ptimer->kpo,POSIX_OBJ_TIMER,id);
  init_timer(&ptimer->ktimer,0,DEF_ACTION_SIGACTION);
  ptimer->ktimer.da.kern_priv=ptimer;
  ptimer->overrun=0;

  ksiginfo=&ptimer->ktimer.da.d.siginfo;
  siginfo_initialize(current_task(), &ksiginfo->user_siginfo);
  ksiginfo->user_siginfo.si_signo=kevp.sigev_signo;
  ksiginfo->user_siginfo.si_value=kevp.sigev_value;

  switch( kevp.sigev_notify ) {
    case SIGEV_SIGNAL_THREAD:
      target=lookup_task(current_task()->pid,kevp.tid,0);
      if( !target ) {
        r=-ESRCH;
        goto free_id;
      }

#ifdef CONFIG_DEBUG_TIMERS
      kprintf_fault("sys_timer_create() [%d:%d] timer %d will target task %d:%d by signal %d\n",
                    current_task()->pid,current_task()->tid,
                    id,target->pid,target->tid);
#endif

      ksiginfo->target=target;
      break;
  }

  if( copy_to_user(timerid,&id,sizeof(id)) ) {
    r=-EFAULT;
    goto free_target;
  }

  LOCK_POSIX_STUFF_W(stuff);
  posix_insert_object(stuff,&ptimer->kpo,id);
  stuff->timers++;
  UNLOCK_POSIX_STUFF_W(stuff);

#ifdef CONFIG_DEBUG_TIMERS
  kprintf_fault("sys_timer_create() [%d:%d] created POSIX timer (%p) N %d %p\n",
                current_task()->pid,current_task()->tid,ptimer,id,
                &ptimer->ktimer);
#endif

  return 0;
free_target:
  if( target ) {
    release_task_struct(target);
  }
free_id:
  LOCK_POSIX_STUFF_W(stuff);
  posix_free_obj_id(stuff,id);
out:
  stuff->timers--;
  UNLOCK_POSIX_STUFF_W(stuff);

  if( ptimer ) {
    memfree(ptimer);
  }
  return ERR(r);
}