summaryrefslogtreecommitdiffstats
path: root/c-user/user_extensions.rst
diff options
context:
space:
mode:
Diffstat (limited to 'c-user/user_extensions.rst')
-rw-r--r--c-user/user_extensions.rst556
1 files changed, 0 insertions, 556 deletions
diff --git a/c-user/user_extensions.rst b/c-user/user_extensions.rst
deleted file mode 100644
index 0840f65..0000000
--- a/c-user/user_extensions.rst
+++ /dev/null
@@ -1,556 +0,0 @@
-.. SPDX-License-Identifier: CC-BY-SA-4.0
-
-.. Copyright (C) 1988, 2008 On-Line Applications Research Corporation (OAR)
-
-.. index:: user extensions
-
-.. _User Extensions Manager:
-
-User Extensions Manager
-***********************
-
-Introduction
-============
-
-The user extensions manager allows the application developer to augment the
-executive by allowing them to supply extension routines which are invoked at
-critical system events. The directives provided by the user extensions manager
-are:
-
-- rtems_extension_create_ - Create an extension set
-
-- rtems_extension_ident_ - Get ID of an extension set
-
-- rtems_extension_delete_ - Delete an extension set
-
-Background
-==========
-
-User extensions (call-back functions) are invoked by the system when the
-following events occur
-
-- thread creation,
-
-- thread start,
-
-- thread restart,
-
-- thread switch,
-
-- thread begin,
-
-- thread exitted (return from thread entry function),
-
-- thread termination,
-
-- thread deletion, and
-
-- fatal error detection (system termination).
-
-The user extensions have event-specific arguments, invocation orders and
-execution contexts. Extension sets can be installed at run-time via
-:ref:`rtems_extension_create() <rtems_extension_create>` (dynamic extension
-sets) or at link-time via the application configuration option
-:ref:`CONFIGURE_INITIAL_EXTENSIONS <CONFIGURE_INITIAL_EXTENSIONS>` (initial
-extension sets).
-
-The execution context of user extensions varies. Some user extensions are
-invoked with ownership of the allocator mutex. The allocator mutex protects
-dynamic memory allocations and object creation/deletion. Some user extensions
-are invoked with thread dispatching disabled. The fatal error extension is
-invoked in an arbitrary context.
-
-.. index:: user extension set
-.. index:: rtems_extensions_table
-
-Extension Sets
---------------
-
-User extensions are maintained as a set. All user extensions are optional and
-may be `NULL`. Together a set of these user extensions typically performs a
-specific functionality such as performance monitoring or debugger support. The
-extension set is defined via the following structure.
-
-.. code-block:: c
-
- typedef struct {
- rtems_task_create_extension thread_create;
- rtems_task_start_extension thread_start;
- rtems_task_restart_extension thread_restart;
- rtems_task_delete_extension thread_delete;
- rtems_task_switch_extension thread_switch;
- rtems_task_begin_extension thread_begin;
- rtems_task_exitted_extension thread_exitted;
- rtems_fatal_extension fatal;
- rtems_task_terminate_extension thread_terminate;
- } rtems_extensions_table;
-
-.. index:: TCB extension area
-
-TCB Extension Area
-------------------
-
-There is no system-provided storage for the initial extension sets.
-
-The task control block (TCB) contains a pointer for each dynamic extension set.
-The pointer is initialized to `NULL` during thread initialization before the
-thread create extension is invoked. The pointer may be used by the dynamic
-extension set to maintain thread-specific data.
-
-The TCB extension is an array of pointers in the TCB. The index into the table
-can be obtained from the extension identifier returned when the extension
-object is created:
-
-.. index:: rtems extensions table index
-
-.. code-block:: c
-
- index = rtems_object_id_get_index( extension_id );
-
-The number of pointers in the area is the same as the number of dynamic user
-extension sets configured. This allows an application to augment the TCB with
-user-defined information. For example, an application could implement task
-profiling by storing timing statistics in the TCB's extended memory area. When
-a task context switch is being executed, the thread switch extension could read
-a real-time clock to calculate how long the task being swapped out has run as
-well as timestamp the starting time for the task being swapped in.
-
-If used, the extended memory area for the TCB should be allocated and the TCB
-extension pointer should be set at the time the task is created or started by
-either the thread create or thread start extension. The application is
-responsible for managing this extended memory area for the TCBs. The memory
-may be reinitialized by the thread restart extension and should be deallocated
-by the thread delete extension when the task is deleted. Since the TCB
-extension buffers would most likely be of a fixed size, the RTEMS partition
-manager could be used to manage the application's extended memory area. The
-application could create a partition of fixed size TCB extension buffers and
-use the partition manager's allocation and deallocation directives to obtain
-and release the extension buffers.
-
-Order of Invocation
--------------------
-
-The user extensions are invoked in either `forward` or `reverse` order. In
-forward order, the user extensions of initial extension sets are invoked before
-the user extensions of the dynamic extension sets. The forward order of
-initial extension sets is defined by the initial extension sets table index.
-The forward order of dynamic extension sets is defined by the order in which
-the dynamic extension sets were created. The reverse order is defined
-accordingly. By invoking the user extensions in this order, extensions can be
-built upon one another. At the following system events, the user extensions
-are invoked in `forward` order
-
-- thread creation,
-
-- thread start,
-
-- thread restart,
-
-- thread switch,
-
-- thread begin,
-
-- thread exitted (return from thread entry function), and
-
-- fatal error detection.
-
-At the following system events, the user extensions are invoked in `reverse`
-order:
-
-- thread termination, and
-
-- thread deletion.
-
-At these system events, the user extensions are invoked in reverse order to insure
-that if an extension set is built upon another, the more complicated user extension
-is invoked before the user extension it is built upon. An example is use of the
-thread delete extension by the Standard C Library. Extension sets which are
-installed after the Standard C Library will operate correctly even if they
-utilize the C Library because the C Library's thread delete extension is
-invoked after that of the other thread delete extensions.
-
-.. index:: rtems_task_create_extension
-
-Thread Create Extension
------------------------
-
-The thread create extension is invoked during thread creation, for example
-via :ref:`rtems_task_create() <rtems_task_create>` or :c:func:`pthread_create`.
-The thread create extension is defined as follows.
-
-.. code-block:: c
-
- typedef bool ( *rtems_task_create_extension )(
- rtems_tcb *executing,
- rtems_tcb *created
- );
-
-The :c:data:`executing` is a pointer to the TCB of the currently executing
-thread. The :c:data:`created` is a pointer to the TCB of the created thread.
-The created thread is completely initialized with respect to the operating
-system.
-
-The executing thread is the owner of the allocator mutex except during creation
-of the idle threads. Since the allocator mutex allows nesting the normal
-memory allocation routines can be used.
-
-A thread create extension will frequently attempt to allocate resources. If
-this allocation fails, then the thread create extension must return
-:c:data:`false` and the entire thread create operation will fail, otherwise it
-must return :c:data:`true`.
-
-The thread create extension is invoked in forward order with thread dispatching
-enabled (except during system initialization).
-
-.. index:: rtems_task_start_extension
-
-Thread Start Extension
-----------------------
-
-The thread start extension is invoked during a thread start, for example
-via :ref:`rtems_task_start() <rtems_task_start>` or :c:func:`pthread_create`.
-The thread start extension is defined as follows.
-
-.. code-block:: c
-
- typedef void ( *rtems_task_start_extension )(
- rtems_tcb *executing,
- rtems_tcb *started
- );
-
-The :c:data:`executing` is a pointer to the TCB of the currently executing
-thread. The :c:data:`started` is a pointer to the TCB of the started thread.
-It is invoked after the environment of the started thread has been loaded and the
-started thread has been made ready. So, in SMP configurations, the thread may
-already run on another processor before the thread start extension is actually
-invoked. Thread switch and thread begin extensions may run before or in
-parallel with the thread start extension in SMP configurations.
-
-The thread start extension is invoked in forward order with thread dispatching
-disabled.
-
-.. index:: rtems_task_restart_extension
-
-Thread Restart Extension
-------------------------
-
-The thread restart extension is invoked during a thread restart, for example
-via :ref:`rtems_task_restart() <rtems_task_start>`.
-The thread restart extension is defined as follows.
-
-.. code-block:: c
-
- typedef void ( *rtems_task_restart_extension )(
- rtems_tcb *executing,
- rtems_tcb *restarted
- );
-
-Both :c:data:`executing` and :c:data:`restarted` are pointers the TCB of the
-currently executing thread. It is invoked in the context of the executing
-thread right before the execution context is reloaded. The thread stack
-reflects the previous execution context.
-
-The thread restart extension is invoked in forward order with thread
-dispatching enabled (except during system initialization). The thread life is
-protected. Thread restart and delete requests issued by thread restart
-extensions lead to recursion. The POSIX cleanup handlers, POSIX key
-destructors and thread-local object destructors run in this context.
-
-.. index:: rtems_task_switch_extension
-
-Thread Switch Extension
------------------------
-
-The thread switch extension is invoked before the context switch from the
-currently executing thread to the heir thread. The thread switch extension is
-defined as follows.
-
-.. code-block:: c
-
- typedef void ( *rtems_task_switch_extension )(
- rtems_tcb *executing,
- rtems_tcb *heir
- );
-
-The :c:data:`executing` is a pointer to the TCB of the currently executing
-thread. The :c:data:`heir` is a pointer to the TCB of the heir thread.
-
-The thread switch extension is invoked in forward order with thread dispatching
-disabled. In SMP configurations, interrupts are disabled and the per-processor
-SMP lock is owned. Thread switch extensions may run in parallel on multiple
-processors. It is recommended to use thread-local or per-processor data
-structures in SMP configurations for thread switch extensions. A global SMP
-lock should be avoided for performance reasons.
-
-The context switches initiated through the multitasking start are not covered
-by the thread switch extension.
-
-.. index:: rtems_task_begin_extension
-
-Thread Begin Extension
-----------------------
-
-The thread begin extension is invoked during a thread begin before the thread
-entry function is called. The thread begin extension is defined as follows.
-
-.. code-block:: c
-
- typedef void ( *rtems_task_begin_extension )(
- rtems_tcb *executing
- );
-
-The :c:data:`executing` is a pointer to the TCB of the currently executing
-thread. The thread begin extension executes in a normal thread context and may
-allocate resources for the executing thread. In particular, it has access to
-thread-local storage of the executing thread.
-
-The thread begin extension is invoked in forward order with thread dispatching
-enabled. The thread switch extension may be called multiple times for this
-thread before or during the thread begin extension is invoked.
-
-.. index:: rtems_task_exitted_extension
-
-Thread Exitted Extension
-------------------------
-
-The thread exitted extension is invoked once the thread entry function returns.
-The thread exitted extension is defined as follows.
-
-.. code-block:: c
-
- typedef void ( *rtems_task_exitted_extension )(
- rtems_tcb *executing
- );
-
-The :c:data:`executing` is a pointer to the TCB of the currently executing
-thread.
-
-This extension is invoked in forward order with thread dispatching enabled.
-
-.. index:: rtems_task_terminate_extension
-
-Thread Termination Extension
-----------------------------
-
-The thread termination extension is invoked in case a termination request is
-recognized by the currently executing thread. Termination requests may result
-due to calls of :ref:`rtems_task_delete() <rtems_task_delete>`,
-:c:func:`pthread_exit`, or :c:func:`pthread_cancel`. The thread termination
-extension is defined as follows.
-
-.. code-block:: c
-
- typedef void ( *rtems_task_terminate_extension )(
- rtems_tcb *executing
- );
-
-The :c:data:`executing` is a pointer to the TCB of the currently executing
-thread.
-
-It is invoked in the context of the terminated thread right before the thread
-dispatch to the heir thread. The POSIX cleanup handlers, POSIX key destructors
-and thread-local object destructors run in this context. Depending on the
-order, the thread termination extension has access to thread-local storage and
-thread-specific data of POSIX keys.
-
-The thread terminate extension is invoked in reverse order with thread
-dispatching enabled. The thread life is protected. Thread restart and delete
-requests issued by thread terminate extensions lead to recursion.
-
-.. index:: rtems_task_delete_extension
-
-Thread Delete Extension
------------------------
-
-The thread delete extension is invoked in case a zombie thread is killed. A
-thread becomes a zombie thread after it terminated. The thread delete
-extension is defined as follows.
-
-.. code-block:: c
-
- typedef void ( *rtems_task_delete_extension )(
- rtems_tcb *executing,
- rtems_tcb *deleted
- );
-
-The :c:data:`executing` is a pointer to the TCB of the currently executing
-thread. The :c:data:`deleted` is a pointer to the TCB of the deleted thread.
-The :c:data:`executing` and :c:data:`deleted` pointers are never equal.
-
-The executing thread is the owner of the allocator mutex. Since the allocator
-mutex allows nesting the normal memory allocation routines can be used.
-
-The thread delete extension is invoked in reverse order with thread dispatching
-enabled.
-
-Please note that a thread delete extension is not immediately invoked with a
-call to :ref:`rtems_task_delete() <rtems_task_delete>` or similar. The thread
-must first terminate and this may take some time. The thread delete extension
-is invoked by :ref:`rtems_task_create() <rtems_task_create>` or similar as a
-result of a lazy garbage collection of zombie threads.
-
-.. index:: rtems_fatal_extension
-
-Fatal Error Extension
----------------------
-
-The fatal error extension is invoked during :ref:`system termination
-<Terminate>`. The fatal error extension is defined as follows.
-
-.. code-block:: c
-
- typedef void( *rtems_fatal_extension )(
- rtems_fatal_source source,
- bool always_set_to_false,
- rtems_fatal_code code
- );
-
-The :c:data:`source` parameter is the fatal source indicating the subsystem the
-fatal condition originated in. The :c:data:`always_set_to_false` parameter is
-always set to :c:data:`false` and provided only for backward compatibility
-reasons. The :c:data:`code` parameter is the fatal error code. This value
-must be interpreted with respect to the source.
-
-The fatal error extension is invoked in forward order.
-
-It is strongly advised to use initial extension sets to install a fatal error
-extension. Usually, the initial extension set of board support package
-provides a fatal error extension which resets the board. In this case, the
-dynamic fatal error extensions are not invoked.
-
-Directives
-==========
-
-This section details the user extension 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.
-
-.. raw:: latex
-
- \clearpage
-
-.. index:: create an extension set
-.. index:: rtems_extension_create
-
-.. _rtems_extension_create:
-
-EXTENSION_CREATE - Create a extension set
------------------------------------------
-
-CALLING SEQUENCE:
- .. code-block:: c
-
- rtems_status_code rtems_extension_create(
- rtems_name name,
- const rtems_extensions_table *table,
- rtems_id *id
- );
-
-DIRECTIVE STATUS CODES:
- .. list-table::
- :class: rtems-table
-
- * - ``RTEMS_SUCCESSFUL``
- - extension set created successfully
- * - ``RTEMS_INVALID_NAME``
- - invalid extension set name
- * - ``RTEMS_TOO_MANY``
- - too many extension sets created
-
-DESCRIPTION:
-
- This directive creates an extension set object and initializes it using the
- specified extension set table. The assigned extension set identifier is
- returned in :c:data:`id`. This identifier is used to access the extension
- set with other user extension manager directives. For control and
- maintenance of the extension set, RTEMS allocates an Extension Set Control
- Block (ESCB) from the local ESCB free pool and initializes it. The
- user-specified :c:data:`name` is assigned to the ESCB and may be used to
- identify the extension set via
- :ref:`rtems_extension_ident() <rtems_extension_ident>`. The extension set
- specified by :c:data:`table` is copied to the ESCB.
-
-NOTES:
-
- This directive will not cause the calling task to be preempted.
-
-.. raw:: latex
-
- \clearpage
-
-.. index:: get ID of an extension set
-.. index:: obtain ID of an extension set
-.. index:: rtems_extension_ident
-
-.. _rtems_extension_ident:
-
-EXTENSION_IDENT - Get ID of a extension set
--------------------------------------------
-
-CALLING SEQUENCE:
- .. code-block:: c
-
- rtems_status_code rtems_extension_ident(
- rtems_name name,
- rtems_id *id
- );
-
-DIRECTIVE STATUS CODES:
- .. list-table::
- :class: rtems-table
-
- * - ``RTEMS_SUCCESSFUL``
- - extension set identified successfully
- * - ``RTEMS_INVALID_NAME``
- - extension set name not found
-
-DESCRIPTION:
- This directive obtains the extension set identifier associated with the
- extension set :c:data:`name` to be acquired and returns it in :c:data:`id`.
- If the extension set name is not unique, then the extension set identifier
- will match one of the extension sets with that name. However, this
- extension set identifier is not guaranteed to correspond to the desired
- extension set. The extension set identifier is used to access this
- extension set in other extension set related directives.
-
-NOTES:
- This directive will not cause the running task to be preempted.
-
-.. raw:: latex
-
- \clearpage
-
-.. index:: delete an extension set
-.. index:: rtems_extension_delete
-
-.. _rtems_extension_delete:
-
-EXTENSION_DELETE - Delete a extension set
------------------------------------------
-
-CALLING SEQUENCE:
- .. code-block:: c
-
- rtems_status_code rtems_extension_delete(
- rtems_id id
- );
-
-DIRECTIVE STATUS CODES:
- .. list-table::
- :class: rtems-table
-
- * - ``RTEMS_SUCCESSFUL``
- - extension set deleted successfully
- * - ``RTEMS_INVALID_ID``
- - invalid extension set id
-
-DESCRIPTION:
- This directive deletes the extension set specified by :c:data:`id`. If the
- extension set is running, it is automatically canceled. The ESCB for the
- deleted extension set is reclaimed by RTEMS.
-
-NOTES:
- This directive will not cause the running task to be preempted.
-
- A extension set can be deleted by a task other than the task which created
- the extension set.