Exemplo n.º 1
0
rtems_status_code rtems_region_create(
  rtems_name          name,
  void               *starting_address,
  uintptr_t           length,
  uintptr_t           page_size,
  rtems_attribute     attribute_set,
  rtems_id           *id
)
{
  rtems_status_code  return_status;
  Region_Control    *the_region;

  if ( !rtems_is_name_valid( name ) )
    return RTEMS_INVALID_NAME;

  if ( !starting_address )
    return RTEMS_INVALID_ADDRESS;

  if ( !id )
    return RTEMS_INVALID_ADDRESS;

  the_region = _Region_Allocate();

    if ( !the_region )
      return_status = RTEMS_TOO_MANY;

    else {
      _Thread_queue_Initialize( &the_region->Wait_queue );

      if ( _Attributes_Is_priority( attribute_set ) ) {
        the_region->wait_operations = &_Thread_queue_Operations_priority;
      } else {
        the_region->wait_operations = &_Thread_queue_Operations_FIFO;
      }

      the_region->maximum_segment_size = _Heap_Initialize(
        &the_region->Memory, starting_address, length, page_size
      );

      if ( !the_region->maximum_segment_size ) {
        _Region_Free( the_region );
        return_status = RTEMS_INVALID_SIZE;
      } else {
        the_region->attribute_set = attribute_set;

        _Objects_Open(
          &_Region_Information,
          &the_region->Object,
          (Objects_Name) name
        );

        *id = the_region->Object.id;
        return_status = RTEMS_SUCCESSFUL;
      }
    }

  _Objects_Allocator_unlock();

  return return_status;
}
Exemplo n.º 2
0
rtems_status_code rtems_region_delete(
  rtems_id id
)
{
  Objects_Locations   location;
  rtems_status_code   return_status;
  Region_Control     *the_region;

  _RTEMS_Lock_allocator();

    the_region = _Region_Get( id, &location );
    switch ( location ) {

      case OBJECTS_LOCAL:
        _Region_Debug_Walk( the_region, 5 );
        if ( the_region->number_of_used_blocks != 0 )
          return_status = RTEMS_RESOURCE_IN_USE;
        else {
          _Objects_Close( &_Region_Information, &the_region->Object );
          _Region_Free( the_region );
          return_status = RTEMS_SUCCESSFUL;
        }
        break;

#if defined(RTEMS_MULTIPROCESSING)
      case OBJECTS_REMOTE:        /* this error cannot be returned */
        break;
#endif

      case OBJECTS_ERROR:
      default:
        return_status = RTEMS_INVALID_ID;
        break;
    }

  _RTEMS_Unlock_allocator();
  return return_status;
}
Exemplo n.º 3
0
rtems_status_code rtems_region_create(
    rtems_name          name,
    void               *starting_address,
    uintptr_t           length,
    uintptr_t           page_size,
    rtems_attribute     attribute_set,
    rtems_id           *id
)
{
    rtems_status_code  return_status;
    Region_Control    *the_region;

    if ( !rtems_is_name_valid( name ) )
        return RTEMS_INVALID_NAME;

    if ( !starting_address )
        return RTEMS_INVALID_ADDRESS;

    if ( !id )
        return RTEMS_INVALID_ADDRESS;

    _RTEMS_Lock_allocator();                      /* to prevent deletion */

    the_region = _Region_Allocate();

    if ( !the_region )
        return_status = RTEMS_TOO_MANY;

    else {

        the_region->maximum_segment_size = _Heap_Initialize(
                                               &the_region->Memory, starting_address, length, page_size
                                           );

        if ( !the_region->maximum_segment_size ) {
            _Region_Free( the_region );
            return_status = RTEMS_INVALID_SIZE;
        }

        else {

            the_region->starting_address      = starting_address;
            the_region->length                = length;
            the_region->page_size             = page_size;
            the_region->attribute_set         = attribute_set;
            the_region->number_of_used_blocks = 0;

            _Thread_queue_Initialize(
                &the_region->Wait_queue,
                _Attributes_Is_priority( attribute_set ) ?
                THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
                STATES_WAITING_FOR_SEGMENT,
                RTEMS_TIMEOUT
            );

            _Objects_Open(
                &_Region_Information,
                &the_region->Object,
                (Objects_Name) name
            );

            *id = the_region->Object.id;
            return_status = RTEMS_SUCCESSFUL;
        }
    }

    _RTEMS_Unlock_allocator();
    return return_status;
}