xref: /btstack/port/stm32-wb55xx-nucleo-freertos/Middlewares/STM32_WPAN/utilities/stm_list.c (revision 0561b2d8d5dba972c7daa57d5e677f7a1327edfd)
1 /**
2  ******************************************************************************
3   * @file    stm_list.c
4   * @author  MCD Application Team
5   * @brief   TCircular Linked List Implementation.
6   ******************************************************************************
7    * @attention
8   *
9   * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
10   * All rights reserved.</center></h2>
11   *
12   * This software component is licensed by ST under BSD 3-Clause license,
13   * the "License"; You may not use this file except in compliance with the
14   * License. You may obtain a copy of the License at:
15   *                        opensource.org/licenses/BSD-3-Clause
16   *
17   ******************************************************************************
18  */
19 
20 
21 /******************************************************************************
22  * Include Files
23  ******************************************************************************/
24 #include "utilities_common.h"
25 
26 #include "stm_list.h"
27 
28 /******************************************************************************
29  * Function Definitions
30  ******************************************************************************/
LST_init_head(tListNode * listHead)31 void LST_init_head (tListNode * listHead)
32 {
33   listHead->next = listHead;
34   listHead->prev = listHead;
35 }
36 
LST_is_empty(tListNode * listHead)37 uint8_t LST_is_empty (tListNode * listHead)
38 {
39   uint32_t primask_bit;
40   uint8_t return_value;
41 
42   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
43   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
44   if(listHead->next == listHead)
45   {
46     return_value = TRUE;
47   }
48   else
49   {
50     return_value = FALSE;
51   }
52   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
53 
54   return return_value;
55 }
56 
LST_insert_head(tListNode * listHead,tListNode * node)57 void LST_insert_head (tListNode * listHead, tListNode * node)
58 {
59   uint32_t primask_bit;
60 
61   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
62   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
63 
64   node->next = listHead->next;
65   node->prev = listHead;
66   listHead->next = node;
67   (node->next)->prev = node;
68 
69   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
70 }
71 
72 
LST_insert_tail(tListNode * listHead,tListNode * node)73 void LST_insert_tail (tListNode * listHead, tListNode * node)
74 {
75   uint32_t primask_bit;
76 
77   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
78   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
79 
80   node->next = listHead;
81   node->prev = listHead->prev;
82   listHead->prev = node;
83   (node->prev)->next = node;
84 
85   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
86 }
87 
88 
LST_remove_node(tListNode * node)89 void LST_remove_node (tListNode * node)
90 {
91   uint32_t primask_bit;
92 
93   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
94   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
95 
96   (node->prev)->next = node->next;
97   (node->next)->prev = node->prev;
98 
99   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
100 }
101 
102 
LST_remove_head(tListNode * listHead,tListNode ** node)103 void LST_remove_head (tListNode * listHead, tListNode ** node )
104 {
105   uint32_t primask_bit;
106 
107   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
108   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
109 
110   *node = listHead->next;
111   LST_remove_node (listHead->next);
112 
113   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
114 }
115 
116 
LST_remove_tail(tListNode * listHead,tListNode ** node)117 void LST_remove_tail (tListNode * listHead, tListNode ** node )
118 {
119   uint32_t primask_bit;
120 
121   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
122   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
123 
124   *node = listHead->prev;
125   LST_remove_node (listHead->prev);
126 
127   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
128 }
129 
130 
LST_insert_node_after(tListNode * node,tListNode * ref_node)131 void LST_insert_node_after (tListNode * node, tListNode * ref_node)
132 {
133   uint32_t primask_bit;
134 
135   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
136   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
137 
138   node->next = ref_node->next;
139   node->prev = ref_node;
140   ref_node->next = node;
141   (node->next)->prev = node;
142 
143   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
144 }
145 
146 
LST_insert_node_before(tListNode * node,tListNode * ref_node)147 void LST_insert_node_before (tListNode * node, tListNode * ref_node)
148 {
149   uint32_t primask_bit;
150 
151   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
152   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
153 
154   node->next = ref_node;
155   node->prev = ref_node->prev;
156   ref_node->prev = node;
157   (node->prev)->next = node;
158 
159   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
160 }
161 
162 
LST_get_size(tListNode * listHead)163 int LST_get_size (tListNode * listHead)
164 {
165   int size = 0;
166   tListNode * temp;
167   uint32_t primask_bit;
168 
169   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
170   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
171 
172   temp = listHead->next;
173   while (temp != listHead)
174   {
175     size++;
176     temp = temp->next;
177   }
178 
179   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
180 
181   return (size);
182 }
183 
LST_get_next_node(tListNode * ref_node,tListNode ** node)184 void LST_get_next_node (tListNode * ref_node, tListNode ** node)
185 {
186   uint32_t primask_bit;
187 
188   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
189   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
190 
191   *node = ref_node->next;
192 
193   __set_PRIMASK(primask_bit);     /**< Restore PRIMASK bit*/
194 }
195 
196 
LST_get_prev_node(tListNode * ref_node,tListNode ** node)197 void LST_get_prev_node (tListNode * ref_node, tListNode ** node)
198 {
199   uint32_t primask_bit;
200 
201   primask_bit = __get_PRIMASK();  /**< backup PRIMASK bit */
202   __disable_irq();                  /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
203 
204   *node = ref_node->prev;
205 
206   __set_PRIMASK(primask_bit);      /**< Restore PRIMASK bit*/
207 }
208 
209