1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11
12 /**************************************************************************/
13 /**************************************************************************/
14 /** */
15 /** ThreadX Component */
16 /** */
17 /** Module Manager */
18 /** */
19 /**************************************************************************/
20 /**************************************************************************/
21
22 #define TX_SOURCE_CODE
23
24 #include "tx_api.h"
25 #include "tx_queue.h"
26 #include "tx_thread.h"
27 #include "txm_module.h"
28
29
30 /**************************************************************************/
31 /* */
32 /* FUNCTION RELEASE */
33 /* */
34 /* _txm_module_manager_callback_request PORTABLE C */
35 /* 6.1 */
36 /* AUTHOR */
37 /* */
38 /* Scott Larson, Microsoft Corporation */
39 /* */
40 /* DESCRIPTION */
41 /* */
42 /* This function sends a notification callback function request to */
43 /* the associated module. */
44 /* */
45 /* INPUT */
46 /* */
47 /* module_callback_queue Module callback request queue */
48 /* callback_request Callback request */
49 /* */
50 /* OUTPUT */
51 /* */
52 /* None */
53 /* */
54 /* CALLS */
55 /* */
56 /* tx_queue_send Send module callback request */
57 /* */
58 /* CALLED BY */
59 /* */
60 /* ThreadX */
61 /* */
62 /* RELEASE HISTORY */
63 /* */
64 /* DATE NAME DESCRIPTION */
65 /* */
66 /* 09-30-2020 Scott Larson Initial Version 6.1 */
67 /* */
68 /**************************************************************************/
_txm_module_manager_callback_request(TX_QUEUE * module_callback_queue,TXM_MODULE_CALLBACK_MESSAGE * callback_message)69 VOID _txm_module_manager_callback_request(TX_QUEUE *module_callback_queue, TXM_MODULE_CALLBACK_MESSAGE *callback_message)
70 {
71
72 TX_INTERRUPT_SAVE_AREA
73
74 TXM_MODULE_CALLBACK_MESSAGE *queued_message;
75 UINT enqueued;
76 UINT found;
77 UINT status;
78
79
80 /* Lockout interrupts. */
81 TX_DISABLE
82
83 /* Determine if the queue is valid. */
84 if ((module_callback_queue) && (module_callback_queue -> tx_queue_id == TX_QUEUE_ID))
85 {
86
87 /* Yes, the queue is valid. */
88
89 /* Pickup the current callback request in the queue. */
90 queued_message = (TXM_MODULE_CALLBACK_MESSAGE *) module_callback_queue -> tx_queue_read;
91
92 /* Pickup the number of items enqueued. */
93 enqueued = module_callback_queue -> tx_queue_enqueued;
94
95 /* Set the found flag to false. */
96 found = TX_FALSE;
97
98 /* Loop to look for duplicates in the queue. */
99 while (enqueued != 0)
100 {
101
102 /* Does this entry match the new callback message? */
103 if ((queued_message -> txm_module_callback_message_application_function == callback_message -> txm_module_callback_message_application_function) &&
104 (queued_message -> txm_module_callback_message_param_1 == callback_message -> txm_module_callback_message_param_1) &&
105 (queued_message -> txm_module_callback_message_param_2 == callback_message -> txm_module_callback_message_param_2) &&
106 (queued_message -> txm_module_callback_message_param_3 == callback_message -> txm_module_callback_message_param_3) &&
107 (queued_message -> txm_module_callback_message_param_4 == callback_message -> txm_module_callback_message_param_4) &&
108 (queued_message -> txm_module_callback_message_param_5 == callback_message -> txm_module_callback_message_param_5) &&
109 (queued_message -> txm_module_callback_message_param_6 == callback_message -> txm_module_callback_message_param_6) &&
110 (queued_message -> txm_module_callback_message_param_7 == callback_message -> txm_module_callback_message_param_7) &&
111 (queued_message -> txm_module_callback_message_param_8 == callback_message -> txm_module_callback_message_param_8) &&
112 (queued_message -> txm_module_callback_message_reserved1 == callback_message -> txm_module_callback_message_reserved1) &&
113 (queued_message -> txm_module_callback_message_reserved2 == callback_message -> txm_module_callback_message_reserved2))
114 {
115
116 /* Update the activation count in the queued request. */
117 queued_message -> txm_module_callback_message_activation_count++;
118
119 /* Set the found flag to true. */
120 found = TX_TRUE;
121
122 /* Get out of the loop. */
123 break;
124 }
125
126 /* Decrease the number of messages to examine. */
127 enqueued--;
128
129 /* Move the callback message to the next message. */
130 queued_message++;
131
132 /* Check for wrap? */
133 if (((ULONG *) queued_message) >= module_callback_queue -> tx_queue_end)
134 {
135
136 /* Yes, set the queued message to the beginning of the queue. */
137 queued_message = (TXM_MODULE_CALLBACK_MESSAGE *) module_callback_queue -> tx_queue_start;
138 }
139 }
140
141 /* Restore interrupts. */
142 TX_RESTORE
143
144 /* Determine if we need to send the new callback request. */
145 if (found == TX_FALSE)
146 {
147
148 /* Yes, send the message. */
149 status = _tx_queue_send(module_callback_queue, (VOID *) callback_message, TX_NO_WAIT);
150
151 /* Determine if an error was detected. */
152 if (status != TX_SUCCESS)
153 {
154
155 /* Error, increment the error counter and return. */
156 _txm_module_manager_callback_error_count++;
157 }
158 }
159
160 /* Increment the total number of callbacks. */
161 _txm_module_manager_callback_total_count++;
162 }
163 else
164 {
165
166 /* Module instance is not valid. */
167
168 /* Error, increment the error counter and return. */
169 _txm_module_manager_callback_error_count++;
170
171 /* Restore interrupts. */
172 TX_RESTORE
173 }
174 }
175
176