summaryrefslogtreecommitdiff
path: root/common_modules/module_manager/src/txm_module_manager_callback_request.c
diff options
context:
space:
mode:
authorScott Larson <[email protected]>2020-08-07 16:56:45 -0700
committerScott Larson <[email protected]>2020-08-07 16:56:45 -0700
commit6f61053f2ac6cfa01a33b910401a61e63bca0972 (patch)
tree7ba850077c3fb4d024c8f6d59609e94c6c627707 /common_modules/module_manager/src/txm_module_manager_callback_request.c
parent49e3c27f3f140cd76147d85ccbb1eea31e09ee16 (diff)
add SMP, Modules, and more processor/tools releases
Diffstat (limited to 'common_modules/module_manager/src/txm_module_manager_callback_request.c')
-rw-r--r--common_modules/module_manager/src/txm_module_manager_callback_request.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/common_modules/module_manager/src/txm_module_manager_callback_request.c b/common_modules/module_manager/src/txm_module_manager_callback_request.c
new file mode 100644
index 00000000..ae7e8f15
--- /dev/null
+++ b/common_modules/module_manager/src/txm_module_manager_callback_request.c
@@ -0,0 +1,176 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** Module Manager */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
+#define TX_SOURCE_CODE
+
+#include "tx_api.h"
+#include "tx_queue.h"
+#include "tx_thread.h"
+#include "txm_module.h"
+
+
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* _txm_module_manager_callback_request PORTABLE C */
+/* 6.0.1 */
+/* AUTHOR */
+/* */
+/* Scott Larson, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This function sends a notification callback function request to */
+/* the associated module. */
+/* */
+/* INPUT */
+/* */
+/* module_callback_queue Module callback request queue */
+/* callback_request Callback request */
+/* */
+/* OUTPUT */
+/* */
+/* None */
+/* */
+/* CALLS */
+/* */
+/* tx_queue_send Send module callback request */
+/* */
+/* CALLED BY */
+/* */
+/* ThreadX */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 06-30-2020 Scott Larson Initial Version 6.0.1 */
+/* */
+/**************************************************************************/
+VOID _txm_module_manager_callback_request(TX_QUEUE *module_callback_queue, TXM_MODULE_CALLBACK_MESSAGE *callback_message)
+{
+
+TX_INTERRUPT_SAVE_AREA
+
+TXM_MODULE_CALLBACK_MESSAGE *queued_message;
+UINT enqueued;
+UINT found;
+UINT status;
+
+
+ /* Lockout interrupts. */
+ TX_DISABLE
+
+ /* Determine if the queue is valid. */
+ if ((module_callback_queue) && (module_callback_queue -> tx_queue_id == TX_QUEUE_ID))
+ {
+
+ /* Yes, the queue is valid. */
+
+ /* Pickup the current callback request in the queue. */
+ queued_message = (TXM_MODULE_CALLBACK_MESSAGE *) module_callback_queue -> tx_queue_read;
+
+ /* Pickup the number of items enqueued. */
+ enqueued = module_callback_queue -> tx_queue_enqueued;
+
+ /* Set the found flag to false. */
+ found = TX_FALSE;
+
+ /* Loop to look for duplicates in the queue. */
+ while (enqueued != 0)
+ {
+
+ /* Does this entry match the new callback message? */
+ if ((queued_message -> txm_module_callback_message_application_function == callback_message -> txm_module_callback_message_application_function) &&
+ (queued_message -> txm_module_callback_message_param_1 == callback_message -> txm_module_callback_message_param_1) &&
+ (queued_message -> txm_module_callback_message_param_2 == callback_message -> txm_module_callback_message_param_2) &&
+ (queued_message -> txm_module_callback_message_param_3 == callback_message -> txm_module_callback_message_param_3) &&
+ (queued_message -> txm_module_callback_message_param_4 == callback_message -> txm_module_callback_message_param_4) &&
+ (queued_message -> txm_module_callback_message_param_5 == callback_message -> txm_module_callback_message_param_5) &&
+ (queued_message -> txm_module_callback_message_param_6 == callback_message -> txm_module_callback_message_param_6) &&
+ (queued_message -> txm_module_callback_message_param_7 == callback_message -> txm_module_callback_message_param_7) &&
+ (queued_message -> txm_module_callback_message_param_8 == callback_message -> txm_module_callback_message_param_8) &&
+ (queued_message -> txm_module_callback_message_reserved1 == callback_message -> txm_module_callback_message_reserved1) &&
+ (queued_message -> txm_module_callback_message_reserved2 == callback_message -> txm_module_callback_message_reserved2))
+ {
+
+ /* Update the activation count in the queued request. */
+ queued_message -> txm_module_callback_message_activation_count++;
+
+ /* Set the found flag to true. */
+ found = TX_TRUE;
+
+ /* Get out of the loop. */
+ break;
+ }
+
+ /* Decrease the number of messages to examine. */
+ enqueued--;
+
+ /* Move the callback message to the next message. */
+ queued_message++;
+
+ /* Check for wrap? */
+ if (((ULONG *) queued_message) >= module_callback_queue -> tx_queue_end)
+ {
+
+ /* Yes, set the queued message to the beginning of the queue. */
+ queued_message = (TXM_MODULE_CALLBACK_MESSAGE *) module_callback_queue -> tx_queue_start;
+ }
+ }
+
+ /* Restore interrupts. */
+ TX_RESTORE
+
+ /* Determine if we need to send the new callback request. */
+ if (found == TX_FALSE)
+ {
+
+ /* Yes, send the message. */
+ status = _tx_queue_send(module_callback_queue, (VOID *) callback_message, TX_NO_WAIT);
+
+ /* Determine if an error was detected. */
+ if (status != TX_SUCCESS)
+ {
+
+ /* Error, increment the error counter and return. */
+ _txm_module_manager_callback_error_count++;
+ }
+ }
+
+ /* Increment the total number of callbacks. */
+ _txm_module_manager_callback_total_count++;
+ }
+ else
+ {
+
+ /* Module instance is not valid. */
+
+ /* Error, increment the error counter and return. */
+ _txm_module_manager_callback_error_count++;
+
+ /* Restore interrupts. */
+ TX_RESTORE
+ }
+}
+