summaryrefslogtreecommitdiffstats
path: root/c_user/region_manager.rst
diff options
context:
space:
mode:
Diffstat (limited to 'c_user/region_manager.rst')
-rw-r--r--c_user/region_manager.rst684
1 files changed, 368 insertions, 316 deletions
diff --git a/c_user/region_manager.rst b/c_user/region_manager.rst
index 0b4b939..c055a4f 100644
--- a/c_user/region_manager.rst
+++ b/c_user/region_manager.rst
@@ -1,3 +1,7 @@
+.. COMMENT: COPYRIGHT (c) 1988-2008.
+.. COMMENT: On-Line Applications Research Corporation (OAR).
+.. COMMENT: All rights reserved.
+
Region Manager
##############
@@ -6,25 +10,24 @@ Region Manager
Introduction
============
-The region manager provides facilities to dynamically
-allocate memory in variable sized units. The directives
-provided by the region manager are:
+The region manager provides facilities to dynamically allocate memory in
+variable sized units. The directives provided by the region manager are:
-- ``rtems_region_create`` - Create a region
+- rtems_region_create_ - Create a region
-- ``rtems_region_ident`` - Get ID of a region
+- rtems_region_ident_ - Get ID of a region
-- ``rtems_region_delete`` - Delete a region
+- rtems_region_delete_ - Delete a region
-- ``rtems_region_extend`` - Add memory to a region
+- rtems_region_extend_ - Add memory to a region
-- ``rtems_region_get_segment`` - Get segment from a region
+- rtems_region_get_segment_ - Get segment from a region
-- ``rtems_region_return_segment`` - Return segment to a region
+- rtems_region_return_segment_ - Return segment to a region
-- ``rtems_region_get_segment_size`` - Obtain size of a segment
+- rtems_region_get_segment_size_ - Obtain size of a segment
-- ``rtems_region_resize_segment`` - Change size of a segment
+- rtems_region_resize_segment_ - Change size of a segment
Background
==========
@@ -34,80 +37,79 @@ Region Manager Definitions
.. index:: region, definition
.. index:: segment, definition
-A region makes up a physically contiguous memory
-space with user-defined boundaries from which variable-sized
-segments are dynamically allocated and deallocated. A segment
-is a variable size section of memory which is allocated in
-multiples of a user-defined page size. This page size is
-required to be a multiple of four greater than or equal to four.
-For example, if a request for a 350-byte segment is made in a
-region with 256-byte pages, then a 512-byte segment is allocated.
-
-Regions are organized as doubly linked chains of
-variable sized memory blocks. Memory requests are allocated
-using a first-fit algorithm. If available, the requester
-receives the number of bytes requested (rounded up to the next
-page size). RTEMS requires some overhead from the region's
-memory for each segment that is allocated. Therefore, an
-application should only modify the memory of a segment that has
-been obtained from the region. The application should NOT
-modify the memory outside of any obtained segments and within
-the region's boundaries while the region is currently active in
-the system.
-
-Upon return to the region, the free block is
-coalesced with its neighbors (if free) on both sides to produce
-the largest possible unused block.
+A region makes up a physically contiguous memory space with user-defined
+boundaries from which variable-sized segments are dynamically allocated and
+deallocated. A segment is a variable size section of memory which is allocated
+in multiples of a user-defined page size. This page size is required to be a
+multiple of four greater than or equal to four. For example, if a request for
+a 350-byte segment is made in a region with 256-byte pages, then a 512-byte
+segment is allocated.
+
+Regions are organized as doubly linked chains of variable sized memory blocks.
+Memory requests are allocated using a first-fit algorithm. If available, the
+requester receives the number of bytes requested (rounded up to the next page
+size). RTEMS requires some overhead from the region's memory for each segment
+that is allocated. Therefore, an application should only modify the memory of
+a segment that has been obtained from the region. The application should NOT
+modify the memory outside of any obtained segments and within the region's
+boundaries while the region is currently active in the system.
+
+Upon return to the region, the free block is coalesced with its neighbors (if
+free) on both sides to produce the largest possible unused block.
Building an Attribute Set
-------------------------
.. index:: region attribute set, building
-In general, an attribute set is built by a bitwise OR
-of the desired attribute components. The set of valid region
-attributes is provided in the following table:
+In general, an attribute set is built by a bitwise OR of the desired attribute
+components. The set of valid region attributes is provided in the following
+table:
-- ``RTEMS_FIFO`` - tasks wait by FIFO (default)
+.. list-table::
+ :class: rtems-table
-- ``RTEMS_PRIORITY`` - tasks wait by priority
+ * - ``RTEMS_FIFO``
+ - tasks wait by FIFO (default)
+ * - ``RTEMS_PRIORITY``
+ - tasks wait by priority
-Attribute values are specifically designed to be
-mutually exclusive, therefore bitwise OR and addition operations
-are equivalent as long as each attribute appears exactly once in
-the component list. An attribute listed as a default is not
-required to appear in the attribute list, although it is a good
-programming practice to specify default attributes. If all
-defaults are desired, the attribute``RTEMS_DEFAULT_ATTRIBUTES`` should be
-specified on this call.
+Attribute values are specifically designed to be mutually exclusive, therefore
+bitwise OR and addition operations are equivalent as long as each attribute
+appears exactly once in the component list. An attribute listed as a default
+is not required to appear in the attribute list, although it is a good
+programming practice to specify default attributes. If all defaults are
+desired, the attribute ``RTEMS_DEFAULT_ATTRIBUTES`` should be specified on this
+call.
-This example demonstrates the attribute_set parameter
-needed to create a region with the task priority waiting queue
-discipline. The attribute_set parameter to the``rtems_region_create``
-directive should be ``RTEMS_PRIORITY``.
+This example demonstrates the attribute_set parameter needed to create a region
+with the task priority waiting queue discipline. The attribute_set parameter
+to the ``rtems_region_create`` directive should be ``RTEMS_PRIORITY``.
Building an Option Set
----------------------
-In general, an option is built by a bitwise OR of the
-desired option components. The set of valid options for the``rtems_region_get_segment`` directive are
-listed in the following table:
+In general, an option is built by a bitwise OR of the desired option
+components. The set of valid options for the ``rtems_region_get_segment``
+directive are listed in the following table:
-- ``RTEMS_WAIT`` - task will wait for segment (default)
+.. list-table::
+ :class: rtems-table
-- ``RTEMS_NO_WAIT`` - task should not wait
+ * - ``RTEMS_WAIT``
+ - task will wait for segment (default)
+ * - ``RTEMS_NO_WAIT``
+ - task should not wait
-Option values are specifically designed to be
-mutually exclusive, therefore bitwise OR and addition operations
-are equivalent as long as each option appears exactly once in
-the component list. An option listed as a default is not
-required to appear in the option list, although it is a good
-programming practice to specify default options. If all
-defaults are desired, the option``RTEMS_DEFAULT_OPTIONS`` should be
-specified on this call.
+Option values are specifically designed to be mutually exclusive, therefore
+bitwise OR and addition operations are equivalent as long as each option
+appears exactly once in the component list. An option listed as a default is
+not required to appear in the option list, although it is a good programming
+practice to specify default options. If all defaults are desired, the
+option ``RTEMS_DEFAULT_OPTIONS`` should be specified on this call.
-This example demonstrates the option parameter needed
-to poll for a segment. The option parameter passed to the``rtems_region_get_segment`` directive should
-be ``RTEMS_NO_WAIT``.
+This example demonstrates the option parameter needed to poll for a segment.
+The option parameter passed to the ``rtems_region_get_segment`` directive
+should be ``RTEMS_NO_WAIT``.
Operations
==========
@@ -115,121 +117,112 @@ Operations
Creating a Region
-----------------
-The ``rtems_region_create`` directive creates a region with the
-user-defined name. The user may select FIFO or task priority as
-the method for placing waiting tasks in the task wait queue.
-RTEMS allocates a Region Control Block (RNCB) from the RNCB free
-list to maintain the newly created region. RTEMS also generates
-a unique region ID which is returned to the calling task.
-
-It is not possible to calculate the exact number of
-bytes available to the user since RTEMS requires overhead for
-each segment allocated. For example, a region with one segment
-that is the size of the entire region has more available bytes
-than a region with two segments that collectively are the size
-of the entire region. This is because the region with one
-segment requires only the overhead for one segment, while the
-other region requires the overhead for two segments.
-
-Due to automatic coalescing, the number of segments
-in the region dynamically changes. Therefore, the total
-overhead required by RTEMS dynamically changes.
+The ``rtems_region_create`` directive creates a region with the user-defined
+name. The user may select FIFO or task priority as the method for placing
+waiting tasks in the task wait queue. RTEMS allocates a Region Control Block
+(RNCB) from the RNCB free list to maintain the newly created region. RTEMS
+also generates a unique region ID which is returned to the calling task.
+
+It is not possible to calculate the exact number of bytes available to the user
+since RTEMS requires overhead for each segment allocated. For example, a
+region with one segment that is the size of the entire region has more
+available bytes than a region with two segments that collectively are the size
+of the entire region. This is because the region with one segment requires
+only the overhead for one segment, while the other region requires the overhead
+for two segments.
+
+Due to automatic coalescing, the number of segments in the region dynamically
+changes. Therefore, the total overhead required by RTEMS dynamically changes.
Obtaining Region IDs
--------------------
-When a region is created, RTEMS generates a unique
-region ID and assigns it to the created region until it is
-deleted. The region ID may be obtained by either of two
-methods. First, as the result of an invocation of the``rtems_region_create`` directive,
-the region ID is stored in a user
-provided location. Second, the region ID may be obtained later
-using the ``rtems_region_ident`` directive.
-The region ID is used by other region manager directives to
-access this region.
+When a region is created, RTEMS generates a unique region ID and assigns it to
+the created region until it is deleted. The region ID may be obtained by
+either of two methods. First, as the result of an invocation of the
+``rtems_region_create`` directive, the region ID is stored in a user provided
+location. Second, the region ID may be obtained later using the
+``rtems_region_ident`` directive. The region ID is used by other region
+manager directives to access this region.
Adding Memory to a Region
-------------------------
-The ``rtems_region_extend`` directive may be used to add memory
-to an existing region. The caller specifies the size in bytes
-and starting address of the memory being added.
+The ``rtems_region_extend`` directive may be used to add memory to an existing
+region. The caller specifies the size in bytes and starting address of the
+memory being added.
+
+.. note::
-NOTE: Please see the release notes or RTEMS source
-code for information regarding restrictions on the location of
-the memory being added in relation to memory already in the
-region.
+ Please see the release notes or RTEMS source code for information regarding
+ restrictions on the location of the memory being added in relation to memory
+ already in the region.
Acquiring a Segment
-------------------
-The ``rtems_region_get_segment`` directive attempts to acquire
-a segment from a specified region. If the region has enough
-available free memory, then a segment is returned successfully
-to the caller. When the segment cannot be allocated, one of the
-following situations applies:
+The ``rtems_region_get_segment`` directive attempts to acquire a segment from a
+specified region. If the region has enough available free memory, then a
+segment is returned successfully to the caller. When the segment cannot be
+allocated, one of the following situations applies:
- By default, the calling task will wait forever to acquire the segment.
-- Specifying the ``RTEMS_NO_WAIT`` option forces
- an immediate return with an error status code.
+- Specifying the ``RTEMS_NO_WAIT`` option forces an immediate return with an
+ error status code.
-- Specifying a timeout limits the interval the task will
- wait before returning with an error status code.
+- Specifying a timeout limits the interval the task will wait before returning
+ with an error status code.
-If the task waits for the segment, then it is placed
-in the region's task wait queue in either FIFO or task priority
-order. All tasks waiting on a region are returned an error when
-the message queue is deleted.
+If the task waits for the segment, then it is placed in the region's task wait
+queue in either FIFO or task priority order. All tasks waiting on a region are
+returned an error when the message queue is deleted.
Releasing a Segment
-------------------
-When a segment is returned to a region by the``rtems_region_return_segment`` directive, it is merged with its
-unallocated neighbors to form the largest possible segment. The
-first task on the wait queue is examined to determine if its
-segment request can now be satisfied. If so, it is given a
-segment and unblocked. This process is repeated until the first
-task's segment request cannot be satisfied.
+When a segment is returned to a region by the ``rtems_region_return_segment``
+directive, it is merged with its unallocated neighbors to form the largest
+possible segment. The first task on the wait queue is examined to determine if
+its segment request can now be satisfied. If so, it is given a segment and
+unblocked. This process is repeated until the first task's segment request
+cannot be satisfied.
Obtaining the Size of a Segment
-------------------------------
-The ``rtems_region_get_segment_size`` directive returns the
-size in bytes of the specified segment. The size returned
-includes any "extra" memory included in the segment because of
-rounding up to a page size boundary.
+The ``rtems_region_get_segment_size`` directive returns the size in bytes of
+the specified segment. The size returned includes any "extra" memory included
+in the segment because of rounding up to a page size boundary.
Changing the Size of a Segment
------------------------------
-The ``rtems_region_resize_segment`` directive is used
-to change the size in bytes of the specified segment. The size may be
-increased or decreased. When increasing the size of a segment, it is
-possible that the request cannot be satisfied. This directive provides
-functionality similar to the ``realloc()`` function in the Standard
-C Library.
+The ``rtems_region_resize_segment`` directive is used to change the size in
+bytes of the specified segment. The size may be increased or decreased. When
+increasing the size of a segment, it is possible that the request cannot be
+satisfied. This directive provides functionality similar to the ``realloc()``
+function in the Standard C Library.
Deleting a Region
-----------------
-A region can be removed from the system and returned
-to RTEMS with the ``rtems_region_delete``
-directive. When a region is
-deleted, its control block is returned to the RNCB free list. A
-region with segments still allocated is not allowed to be
-deleted. Any task attempting to do so will be returned an
-error. As a result of this directive, all tasks blocked waiting
-to obtain a segment from the region will be readied and returned
-a status code which indicates that the region was deleted.
+A region can be removed from the system and returned to RTEMS with the
+``rtems_region_delete`` directive. When a region is deleted, its control block
+is returned to the RNCB free list. A region with segments still allocated is
+not allowed to be deleted. Any task attempting to do so will be returned an
+error. As a result of this directive, all tasks blocked waiting to obtain a
+segment from the region will be readied and returned a status code which
+indicates that the region was deleted.
Directives
==========
-This section details the region manager's directives.
-A subsection is dedicated to each of this manager's directives
-and describes the calling sequence, related constants, usage,
-and status codes.
+This section details the region manager's directives. A subsection is
+dedicated to each of this manager's directives and describes the calling
+sequence, related constants, usage, and status codes.
+
+.. _rtems_region_create:
REGION_CREATE - Create a region
-------------------------------
@@ -242,59 +235,71 @@ REGION_CREATE - Create a region
.. code:: c
rtems_status_code rtems_region_create(
- rtems_name name,
- void \*starting_address,
- intptr_t length,
- uint32_t page_size,
- rtems_attribute attribute_set,
- rtems_id \*id
+ rtems_name name,
+ void *starting_address,
+ intptr_t length,
+ uint32_t page_size,
+ rtems_attribute attribute_set,
+ rtems_id *id
);
**DIRECTIVE STATUS CODES:**
-``RTEMS_SUCCESSFUL`` - region created successfully
-``RTEMS_INVALID_NAME`` - invalid region name
-``RTEMS_INVALID_ADDRESS`` - ``id`` is NULL
-``RTEMS_INVALID_ADDRESS`` - ``starting_address`` is NULL
-``RTEMS_INVALID_ADDRESS`` - address not on four byte boundary
-``RTEMS_TOO_MANY`` - too many regions created
-``RTEMS_INVALID_SIZE`` - invalid page size
+.. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - region created successfully
+ * - ``RTEMS_INVALID_NAME``
+ - invalid region name
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``id`` is NULL
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``starting_address`` is NULL
+ * - ``RTEMS_INVALID_ADDRESS``
+ - address not on four byte boundary
+ * - ``RTEMS_TOO_MANY``
+ - too many regions created
+ * - ``RTEMS_INVALID_SIZE``
+ - invalid page size
**DESCRIPTION:**
-This directive creates a region from a physically
-contiguous memory space which starts at starting_address and is
-length bytes long. Segments allocated from the region will be a
-multiple of page_size bytes in length. The assigned region id
-is returned in id. This region id is used as an argument to
-other region related directives to access the region.
+This directive creates a region from a physically contiguous memory space which
+starts at starting_address and is length bytes long. Segments allocated from
+the region will be a multiple of page_size bytes in length. The assigned
+region id is returned in id. This region id is used as an argument to other
+region related directives to access the region.
-For control and maintenance of the region, RTEMS
-allocates and initializes an RNCB from the RNCB free pool. Thus
-memory from the region is not used to store the RNCB. However,
-some overhead within the region is required by RTEMS each time a
-segment is constructed in the region.
+For control and maintenance of the region, RTEMS allocates and initializes an
+RNCB from the RNCB free pool. Thus memory from the region is not used to store
+the RNCB. However, some overhead within the region is required by RTEMS each
+time a segment is constructed in the region.
-Specifying ``RTEMS_PRIORITY`` in attribute_set causes tasks
-waiting for a segment to be serviced according to task priority.
-Specifying ``RTEMS_FIFO`` in attribute_set or selecting``RTEMS_DEFAULT_ATTRIBUTES`` will cause waiting tasks to
-be serviced in First In-First Out order.
+Specifying ``RTEMS_PRIORITY`` in attribute_set causes tasks waiting for a
+segment to be serviced according to task priority. Specifying ``RTEMS_FIFO``
+in attribute_set or selecting ``RTEMS_DEFAULT_ATTRIBUTES`` will cause waiting
+tasks to be serviced in First In-First Out order.
-The ``starting_address`` parameter must be aligned on a
-four byte boundary. The ``page_size`` parameter must be a multiple
-of four greater than or equal to eight.
+The ``starting_address`` parameter must be aligned on a four byte boundary.
+The ``page_size`` parameter must be a multiple of four greater than or equal to
+eight.
**NOTES:**
-This directive will not cause the calling task to be
-preempted.
+This directive will not cause the calling task to be preempted.
+
+The following region attribute constants are defined by RTEMS:
-The following region attribute constants are defined
-by RTEMS:
+.. list-table::
+ :class: rtems-table
-- ``RTEMS_FIFO`` - tasks wait by FIFO (default)
+ * - ``RTEMS_FIFO``
+ - tasks wait by FIFO (default)
+ * - ``RTEMS_PRIORITY``
+ - tasks wait by priority
-- ``RTEMS_PRIORITY`` - tasks wait by priority
+.. _rtems_region_ident:
REGION_IDENT - Get ID of a region
---------------------------------
@@ -308,29 +313,36 @@ REGION_IDENT - Get ID of a region
.. code:: c
rtems_status_code rtems_region_ident(
- rtems_name name,
- rtems_id \*id
+ rtems_name name,
+ rtems_id *id
);
**DIRECTIVE STATUS CODES:**
-``RTEMS_SUCCESSFUL`` - region identified successfully
-``RTEMS_INVALID_ADDRESS`` - ``id`` is NULL
-``RTEMS_INVALID_NAME`` - region name not found
+.. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - region identified successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``id`` is NULL
+ * - ``RTEMS_INVALID_NAME``
+ - region name not found
**DESCRIPTION:**
-This directive obtains the region id associated with
-the region name to be acquired. If the region name is not
-unique, then the region id will match one of the regions with
-that name. However, this region id is not guaranteed to
-correspond to the desired region. The region id is used to
-access this region in other region manager directives.
+This directive obtains the region id associated with the region name to be
+acquired. If the region name is not unique, then the region id will match one
+of the regions with that name. However, this region id is not guaranteed to
+correspond to the desired region. The region id is used to access this region
+in other region manager directives.
**NOTES:**
This directive will not cause the running task to be preempted.
+.. _rtems_region_delete:
+
REGION_DELETE - Delete a region
-------------------------------
.. index:: delete a region
@@ -342,29 +354,35 @@ REGION_DELETE - Delete a region
.. code:: c
rtems_status_code rtems_region_delete(
- rtems_id id
+ rtems_id id
);
**DIRECTIVE STATUS CODES:**
-``RTEMS_SUCCESSFUL`` - region deleted successfully
-``RTEMS_INVALID_ID`` - invalid region id
-``RTEMS_RESOURCE_IN_USE`` - segments still in use
+.. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - region deleted successfully
+ * - ``RTEMS_INVALID_ID``
+ - invalid region id
+ * - ``RTEMS_RESOURCE_IN_USE``
+ - segments still in use
**DESCRIPTION:**
-This directive deletes the region specified by id.
-The region cannot be deleted if any of its segments are still
-allocated. The RNCB for the deleted region is reclaimed by
-RTEMS.
+This directive deletes the region specified by id. The region cannot be
+deleted if any of its segments are still allocated. The RNCB for the deleted
+region is reclaimed by RTEMS.
**NOTES:**
This directive will not cause the calling task to be preempted.
-The calling task does not have to be the task that
-created the region. Any local task that knows the region id can
-delete the region.
+The calling task does not have to be the task that created the region. Any
+local task that knows the region id can delete the region.
+
+.. _rtems_region_extend:
REGION_EXTEND - Add memory to a region
--------------------------------------
@@ -378,30 +396,38 @@ REGION_EXTEND - Add memory to a region
.. code:: c
rtems_status_code rtems_region_extend(
- rtems_id id,
- void \*starting_address,
- intptr_t length
+ rtems_id id,
+ void *starting_address,
+ intptr_t length
);
**DIRECTIVE STATUS CODES:**
-``RTEMS_SUCCESSFUL`` - region extended successfully
-``RTEMS_INVALID_ADDRESS`` - ``starting_address`` is NULL
-``RTEMS_INVALID_ID`` - invalid region id
-``RTEMS_INVALID_ADDRESS`` - invalid address of area to add
+.. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - region extended successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``starting_address`` is NULL
+ * - ``RTEMS_INVALID_ID``
+ - invalid region id
+ * - ``RTEMS_INVALID_ADDRESS``
+ - invalid address of area to add
**DESCRIPTION:**
-This directive adds the memory which starts at
-starting_address for length bytes to the region specified by id.
+This directive adds the memory which starts at starting_address for length
+bytes to the region specified by id.
**NOTES:**
This directive will not cause the calling task to be preempted.
-The calling task does not have to be the task that
-created the region. Any local task that knows the region id can
-extend the region.
+The calling task does not have to be the task that created the region. Any
+local task that knows the region id can extend the region.
+
+.. _rtems_region_get_segment:
REGION_GET_SEGMENT - Get segment from a region
----------------------------------------------
@@ -414,68 +440,76 @@ REGION_GET_SEGMENT - Get segment from a region
.. code:: c
rtems_status_code rtems_region_get_segment(
- rtems_id id,
- intptr_t size,
- rtems_option option_set,
- rtems_interval timeout,
- void \**segment
+ rtems_id id,
+ intptr_t size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
);
**DIRECTIVE STATUS CODES:**
-``RTEMS_SUCCESSFUL`` - segment obtained successfully
-``RTEMS_INVALID_ADDRESS`` - ``segment`` is NULL
-``RTEMS_INVALID_ID`` - invalid region id
-``RTEMS_INVALID_SIZE`` - request is for zero bytes or exceeds
-the size of maximum segment which is possible for this region
-``RTEMS_UNSATISFIED`` - segment of requested size not available
-``RTEMS_TIMEOUT`` - timed out waiting for segment
-``RTEMS_OBJECT_WAS_DELETED`` - region deleted while waiting
+.. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - segment obtained successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``segment`` is NULL
+ * - ``RTEMS_INVALID_ID``
+ - invalid region id
+ * - ``RTEMS_INVALID_SIZE``
+ - request is for zero bytes or exceeds the size of maximum segment which is
+ possible for this region
+ * - ``RTEMS_UNSATISFIED``
+ - segment of requested size not available
+ * - ``RTEMS_TIMEOUT``
+ - timed out waiting for segment
+ * - ``RTEMS_OBJECT_WAS_DELETED``
+ - region deleted while waiting
**DESCRIPTION:**
-This directive obtains a variable size segment from
-the region specified by id. The address of the allocated
-segment is returned in segment. The ``RTEMS_WAIT``
-and ``RTEMS_NO_WAIT`` components
-of the options parameter are used to specify whether the calling
-tasks wish to wait for a segment to become available or return
-immediately if no segment is available. For either option, if a
-sufficiently sized segment is available, then the segment is
-successfully acquired by returning immediately with the``RTEMS_SUCCESSFUL`` status code.
-
-If the calling task chooses to return immediately and
-a segment large enough is not available, then an error code
-indicating this fact is returned. If the calling task chooses
-to wait for the segment and a segment large enough is not
-available, then the calling task is placed on the region's
-segment wait queue and blocked. If the region was created with
-the ``RTEMS_PRIORITY`` option, then the calling
-task is inserted into the
-wait queue according to its priority. However, if the region
-was created with the ``RTEMS_FIFO`` option, then the calling
-task is placed at the rear of the wait queue.
-
-The timeout parameter specifies the maximum interval
-that a task is willing to wait to obtain a segment. If timeout
-is set to ``RTEMS_NO_TIMEOUT``, then the
+This directive obtains a variable size segment from the region specified by
+``id``. The address of the allocated segment is returned in segment. The
+``RTEMS_WAIT`` and ``RTEMS_NO_WAIT`` components of the options parameter are
+used to specify whether the calling tasks wish to wait for a segment to become
+available or return immediately if no segment is available. For either option,
+if a sufficiently sized segment is available, then the segment is successfully
+acquired by returning immediately with the ``RTEMS_SUCCESSFUL`` status code.
+
+If the calling task chooses to return immediately and a segment large enough is
+not available, then an error code indicating this fact is returned. If the
+calling task chooses to wait for the segment and a segment large enough is not
+available, then the calling task is placed on the region's segment wait queue
+and blocked. If the region was created with the ``RTEMS_PRIORITY`` option,
+then the calling task is inserted into the wait queue according to its
+priority. However, if the region was created with the ``RTEMS_FIFO`` option,
+then the calling task is placed at the rear of the wait queue.
+
+The timeout parameter specifies the maximum interval that a task is willing to
+wait to obtain a segment. If timeout is set to ``RTEMS_NO_TIMEOUT``, then the
calling task will wait forever.
**NOTES:**
-The actual length of the allocated segment may be
-larger than the requested size because a segment size is always
-a multiple of the region's page size.
+The actual length of the allocated segment may be larger than the requested
+size because a segment size is always a multiple of the region's page size.
-The following segment acquisition option constants
-are defined by RTEMS:
+The following segment acquisition option constants are defined by RTEMS:
-- ``RTEMS_WAIT`` - task will wait for segment (default)
+.. list-table::
+ :class: rtems-table
-- ``RTEMS_NO_WAIT`` - task should not wait
+ * - ``RTEMS_WAIT``
+ - task will wait for segment (default)
+ * - ``RTEMS_NO_WAIT``
+ - task should not wait
-A clock tick is required to support the timeout functionality of
-this directive.
+A clock tick is required to support the timeout functionality of this
+directive.
+
+.. _rtems_region_return_segment:
REGION_RETURN_SEGMENT - Return segment to a region
--------------------------------------------------
@@ -488,37 +522,44 @@ REGION_RETURN_SEGMENT - Return segment to a region
.. code:: c
rtems_status_code rtems_region_return_segment(
- rtems_id id,
- void \*segment
+ rtems_id id,
+ void *segment
);
**DIRECTIVE STATUS CODES:**
-``RTEMS_SUCCESSFUL`` - segment returned successfully
-``RTEMS_INVALID_ADDRESS`` - ``segment`` is NULL
-``RTEMS_INVALID_ID`` - invalid region id
-``RTEMS_INVALID_ADDRESS`` - segment address not in region
+.. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - segment returned successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``segment`` is NULL
+ * - ``RTEMS_INVALID_ID``
+ - invalid region id
+ * - ``RTEMS_INVALID_ADDRESS``
+ - segment address not in region
**DESCRIPTION:**
-This directive returns the segment specified by
-segment to the region specified by id. The returned segment is
-merged with its neighbors to form the largest possible segment.
-The first task on the wait queue is examined to determine if its
-segment request can now be satisfied. If so, it is given a
-segment and unblocked. This process is repeated until the first
-task's segment request cannot be satisfied.
+This directive returns the segment specified by segment to the region specified
+by id. The returned segment is merged with its neighbors to form the largest
+possible segment. The first task on the wait queue is examined to determine if
+its segment request can now be satisfied. If so, it is given a segment and
+unblocked. This process is repeated until the first task's segment request
+cannot be satisfied.
**NOTES:**
-This directive will cause the calling task to be
-preempted if one or more local tasks are waiting for a segment
-and the following conditions exist:
+This directive will cause the calling task to be preempted if one or more local
+tasks are waiting for a segment and the following conditions exist:
- a waiting task has a higher priority than the calling task
-- the size of the segment required by the waiting task
- is less than or equal to the size of the segment returned.
+- the size of the segment required by the waiting task is less than or equal to
+ the size of the segment returned.
+
+.. _rtems_region_get_segment_size:
REGION_GET_SEGMENT_SIZE - Obtain size of a segment
--------------------------------------------------
@@ -531,18 +572,26 @@ REGION_GET_SEGMENT_SIZE - Obtain size of a segment
.. code:: c
rtems_status_code rtems_region_get_segment_size(
- rtems_id id,
- void \*segment,
- ssize_t \*size
+ rtems_id id,
+ void *segment,
+ ssize_t *size
);
**DIRECTIVE STATUS CODES:**
-``RTEMS_SUCCESSFUL`` - segment obtained successfully
-``RTEMS_INVALID_ADDRESS`` - ``segment`` is NULL
-``RTEMS_INVALID_ADDRESS`` - ``size`` is NULL
-``RTEMS_INVALID_ID`` - invalid region id
-``RTEMS_INVALID_ADDRESS`` - segment address not in region
+.. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - segment obtained successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``segment`` is NULL
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``size`` is NULL
+ * - ``RTEMS_INVALID_ID``
+ - invalid region id
+ * - ``RTEMS_INVALID_ADDRESS``
+ - segment address not in region
**DESCRIPTION:**
@@ -550,9 +599,10 @@ This directive obtains the size in bytes of the specified segment.
**NOTES:**
-The actual length of the allocated segment may be
-larger than the requested size because a segment size is always
-a multiple of the region's page size.
+The actual length of the allocated segment may be larger than the requested
+size because a segment size is always a multiple of the region's page size.
+
+.. _rtems_region_resize_segment:
REGION_RESIZE_SEGMENT - Change size of a segment
------------------------------------------------
@@ -565,37 +615,39 @@ REGION_RESIZE_SEGMENT - Change size of a segment
.. code:: c
rtems_status_code rtems_region_resize_segment(
- rtems_id id,
- void \*segment,
- ssize_t size,
- ssize_t \*old_size
+ rtems_id id,
+ void *segment,
+ ssize_t size,
+ ssize_t *old_size
);
**DIRECTIVE STATUS CODES:**
-``RTEMS_SUCCESSFUL`` - segment obtained successfully
-``RTEMS_INVALID_ADDRESS`` - ``segment`` is NULL
-``RTEMS_INVALID_ADDRESS`` - ``old_size`` is NULL
-``RTEMS_INVALID_ID`` - invalid region id
-``RTEMS_INVALID_ADDRESS`` - segment address not in region``RTEMS_UNSATISFIED`` - unable to make segment larger
+.. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - segment obtained successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``segment`` is NULL
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``old_size`` is NULL
+ * - ``RTEMS_INVALID_ID``
+ - invalid region id
+ * - ``RTEMS_INVALID_ADDRESS``
+ - segment address not in region
+ * - ``RTEMS_UNSATISFIED``
+ - unable to make segment larger
**DESCRIPTION:**
-This directive is used to increase or decrease the size of
-a segment. When increasing the size of a segment, it
-is possible that there is not memory available contiguous
-to the segment. In this case, the request is unsatisfied.
+This directive is used to increase or decrease the size of a segment. When
+increasing the size of a segment, it is possible that there is not memory
+available contiguous to the segment. In this case, the request is unsatisfied.
**NOTES:**
-If an attempt to increase the size of a segment fails, then
-the application may want to allocate a new segment of the desired
-size, copy the contents of the original segment to the new, larger
-segment and then return the original segment.
-
-.. COMMENT: COPYRIGHT (c) 1988-2002.
-
-.. COMMENT: On-Line Applications Research Corporation (OAR).
-
-.. COMMENT: All rights reserved.
-
+If an attempt to increase the size of a segment fails, then the application may
+want to allocate a new segment of the desired size, copy the contents of the
+original segment to the new, larger segment and then return the original
+segment.