Esempio 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;
}
Esempio n. 2
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;
}