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