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; }
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); }