Ejemplo n.º 1
0
ER rsm_tsk(
  ID tskid
)
{
  register Thread_Control *the_thread;
  Objects_Locations        location;

  the_thread = _ITRON_Task_Get( tskid, &location );
  switch ( location ) {
#if defined(RTEMS_MULTIPROCESSING)
    case OBJECTS_REMOTE:
#endif
    case OBJECTS_ERROR:
      return _ITRON_Task_Clarify_get_id_error( tskid );

    case OBJECTS_LOCAL:

      if ( _Thread_Is_executing( the_thread ) )
        _ITRON_return_errorno( E_OBJ );

      if ( _States_Is_dormant( the_thread->current_state ))
        _ITRON_return_errorno( E_OBJ );

      if ( ! _States_Is_suspended(the_thread->current_state) )
        _ITRON_return_errorno( E_OBJ );

      _Thread_Resume( the_thread, false );
      break;
  }

  _ITRON_return_errorno( E_OK );
}
rtems_status_code rtems_task_is_suspended(
  rtems_id id
)
{
  register Thread_Control *the_thread;
  Objects_Locations        location;

  the_thread = _Thread_Get( id, &location );
  switch ( location ) {

    case OBJECTS_LOCAL:
      if ( !_States_Is_suspended( the_thread->current_state ) ) {
        _Thread_Enable_dispatch();
        return RTEMS_SUCCESSFUL;
      }
      _Thread_Enable_dispatch();
      return RTEMS_ALREADY_SUSPENDED;

#if defined(RTEMS_MULTIPROCESSING)
    case OBJECTS_REMOTE:
      _Thread_Dispatch();
      return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
#endif

    case OBJECTS_ERROR:
      break;
  }

  return RTEMS_INVALID_ID;
}
Ejemplo n.º 3
0
rtems_status_code rtems_task_resume(
  rtems_id id
)
{
  Thread_Control          *the_thread;
  Objects_Locations        location;
  States_Control           previous_state;

  the_thread = _Thread_Get( id, &location );
  switch ( location ) {

    case OBJECTS_LOCAL:
      previous_state = _Thread_Clear_state( the_thread, STATES_SUSPENDED );
      _Objects_Put( &the_thread->Object );

      return _States_Is_suspended( previous_state ) ?
        RTEMS_SUCCESSFUL : RTEMS_INCORRECT_STATE;

#if defined(RTEMS_MULTIPROCESSING)
    case OBJECTS_REMOTE:
      return _RTEMS_tasks_MP_Send_request_packet(
          RTEMS_TASKS_MP_RESUME_REQUEST,
          id,
          0,          /* Not used */
          0,          /* Not used */
          0           /* Not used */
        );
#endif

    case OBJECTS_ERROR:
      break;
  }

  return RTEMS_INVALID_ID;
}
Ejemplo n.º 4
0
rtems_status_code rtems_task_suspend(
  rtems_id id
)
{
  register Thread_Control *the_thread;
  Objects_Locations        location;

  the_thread = _Thread_Get( id, &location );
  switch ( location ) {

    case OBJECTS_LOCAL:
      if ( !_States_Is_suspended( the_thread->current_state ) ) {
        _Thread_Suspend( the_thread );
        _Thread_Enable_dispatch();
        return RTEMS_SUCCESSFUL;
      }
      _Thread_Enable_dispatch();
      return RTEMS_ALREADY_SUSPENDED;

#if defined(RTEMS_MULTIPROCESSING)
    case OBJECTS_REMOTE:
      return _RTEMS_tasks_MP_Send_request_packet(
        RTEMS_TASKS_MP_SUSPEND_REQUEST,
        id,
        0,          /* Not used */
        0,          /* Not used */
        0           /* Not used */
      );
#endif

    case OBJECTS_ERROR:
      break;
  }

  return RTEMS_INVALID_ID;
}
Ejemplo n.º 5
0
rtems_status_code rtems_task_resume(
  rtems_id id
)
{
  register Thread_Control *the_thread;
  Objects_Locations        location;

  the_thread = _Thread_Get( id, &location );
  switch ( location ) {

    case OBJECTS_LOCAL:
      if ( _States_Is_suspended( the_thread->current_state ) ) {
        _Thread_Resume( the_thread );
        _Objects_Put( &the_thread->Object );
        return RTEMS_SUCCESSFUL;
      }
      _Objects_Put( &the_thread->Object );
      return RTEMS_INCORRECT_STATE;

#if defined(RTEMS_MULTIPROCESSING)
    case OBJECTS_REMOTE:
      return _RTEMS_tasks_MP_Send_request_packet(
          RTEMS_TASKS_MP_RESUME_REQUEST,
          id,
          0,          /* Not used */
          0,          /* Not used */
          0           /* Not used */
        );
#endif

    case OBJECTS_ERROR:
      break;
  }

  return RTEMS_INVALID_ID;
}
Ejemplo n.º 6
0
ER ref_tsk(
    T_RTSK *pk_rtsk,
    ID      tskid
)
{
    register Thread_Control *the_thread;
    Objects_Locations        location;
    Priority_Control         core_priority;

    if (!pk_rtsk)
        return E_PAR;

    the_thread = _ITRON_Task_Get( tskid, &location );
    switch ( location ) {
#if defined(RTEMS_MULTIPROCESSING)
    case OBJECTS_REMOTE:
#endif
    case OBJECTS_ERROR:
        return _ITRON_Task_Clarify_get_id_error( tskid );

    case OBJECTS_LOCAL:

        if ( location != OBJECTS_LOCAL )
            return  _ITRON_Task_Clarify_get_id_error( tskid );

        /*
         * The following are extended functions [level X ].
         * XXX - tskwait, wid, wupcnt, and tskatr are presently not implemented.
         */

        pk_rtsk->tskwait = 0;
        pk_rtsk->wid     = 0;
        pk_rtsk->wupcnt  = 0;
        pk_rtsk->suscnt  = the_thread->suspend_count;
        pk_rtsk->tskatr  = 0;       /* XXX - Not correctly implemented */
        pk_rtsk->task    = (FP) the_thread->Start.entry_point;
        core_priority    = the_thread->Start.initial_priority;
        pk_rtsk->itskpri = _ITRON_Task_Core_to_Priority( core_priority );
        pk_rtsk->stksz   = the_thread->Start.Initial_stack.size;

        /*
         * The following are required.
         */

        pk_rtsk->exinf   = NULL;   /* extended information */
        pk_rtsk->tskpri  =
            _ITRON_Task_Core_to_Priority(the_thread->current_priority);

        /*
         * Mask in the tskstat information
         * Convert the task state XXX double check this
         */

        pk_rtsk->tskstat = 0;
        if ( the_thread == _Thread_Executing )
            pk_rtsk->tskstat |= TTS_RUN;
        if ( _States_Is_ready(the_thread->current_state) )
            pk_rtsk->tskstat |= TTS_RDY;
        if ( _States_Is_dormant( the_thread->current_state) )
            pk_rtsk->tskstat |= TTS_DMT;
        if ( _States_Is_suspended(the_thread->current_state) )
            pk_rtsk->tskstat |= TTS_SUS;
        if ( _States_Is_blocked(the_thread->current_state) )
            pk_rtsk->tskstat |= TTS_WAI;

        break;
    }

    _ITRON_return_errorno( E_OK );

}