14
14
#include <sys/timer.h>
15
15
16
16
#include "private/error.h"
17
+ #include "private/utils.h"
17
18
18
19
/* Pre-allocated node pool for reduced malloc/free overhead */
19
20
#define TIMER_NODE_POOL_SIZE 16
@@ -79,7 +80,7 @@ static timer_t *cache_lookup_timer(uint16_t id)
79
80
/* Initializes the timer subsystem's data structures. */
80
81
static int32_t timer_subsystem_init (void )
81
82
{
82
- if (timer_initialized )
83
+ if (unlikely ( timer_initialized ) )
83
84
return ERR_OK ;
84
85
85
86
NOSCHED_ENTER ();
@@ -91,10 +92,15 @@ static int32_t timer_subsystem_init(void)
91
92
all_timers_list = list_create ();
92
93
kcb -> timer_list = list_create ();
93
94
94
- if (!all_timers_list || !kcb -> timer_list ) {
95
- free (all_timers_list );
96
- free (kcb -> timer_list );
97
- kcb -> timer_list = NULL ;
95
+ if (unlikely (!all_timers_list || !kcb -> timer_list )) {
96
+ if (all_timers_list ) {
97
+ list_destroy (all_timers_list );
98
+ all_timers_list = NULL ;
99
+ }
100
+ if (kcb -> timer_list ) {
101
+ list_destroy (kcb -> timer_list );
102
+ kcb -> timer_list = NULL ;
103
+ }
98
104
NOSCHED_LEAVE ();
99
105
return ERR_FAIL ;
100
106
}
@@ -113,7 +119,7 @@ static int32_t timer_subsystem_init(void)
113
119
/* Fast removal of timer from active list by data pointer */
114
120
static void timer_remove_item_by_data (list_t * list , void * data )
115
121
{
116
- if (!list || list_is_empty (list ))
122
+ if (unlikely ( !list || list_is_empty (list ) ))
117
123
return ;
118
124
119
125
list_node_t * prev = list -> head ;
@@ -135,7 +141,7 @@ static void timer_remove_item_by_data(list_t *list, void *data)
135
141
static int32_t timer_sorted_insert (timer_t * timer )
136
142
{
137
143
list_node_t * new_node = get_timer_node ();
138
- if (!new_node )
144
+ if (unlikely ( !new_node ) )
139
145
return ERR_FAIL ;
140
146
new_node -> data = timer ;
141
147
@@ -171,7 +177,7 @@ static timer_t *timer_find_by_id_fast(uint16_t id)
171
177
if (cached && cached -> id == id )
172
178
return cached ;
173
179
174
- if (!all_timers_list || list_is_empty (all_timers_list ))
180
+ if (unlikely ( !all_timers_list || list_is_empty (all_timers_list ) ))
175
181
return NULL ;
176
182
177
183
/* Linear search for now - could be optimized to binary search if needed */
@@ -193,7 +199,7 @@ static timer_t *timer_find_by_id_fast(uint16_t id)
193
199
/* Find timer node for removal operations */
194
200
static list_node_t * timer_find_node_by_id (uint16_t id )
195
201
{
196
- if (!all_timers_list )
202
+ if (unlikely ( !all_timers_list ) )
197
203
return NULL ;
198
204
199
205
list_node_t * node = all_timers_list -> head -> next ;
@@ -210,7 +216,8 @@ static list_node_t *timer_find_node_by_id(uint16_t id)
210
216
211
217
void _timer_tick_handler (void )
212
218
{
213
- if (!timer_initialized || list_is_empty (kcb -> timer_list ))
219
+ if (unlikely (!timer_initialized || !kcb -> timer_list ||
220
+ list_is_empty (kcb -> timer_list )))
214
221
return ;
215
222
216
223
uint32_t now = mo_ticks ();
@@ -236,7 +243,7 @@ void _timer_tick_handler(void)
236
243
timer_t * t = expired_timers [i ];
237
244
238
245
/* Execute callback */
239
- if (t -> callback )
246
+ if (likely ( t -> callback ) )
240
247
t -> callback (t -> arg );
241
248
242
249
/* Handle auto-reload timers */
@@ -253,7 +260,7 @@ void _timer_tick_handler(void)
253
260
static int32_t timer_insert_sorted_by_id (timer_t * timer )
254
261
{
255
262
list_node_t * new_node = get_timer_node ();
256
- if (!new_node )
263
+ if (unlikely ( !new_node ) )
257
264
return ERR_FAIL ;
258
265
new_node -> data = timer ;
259
266
@@ -278,13 +285,13 @@ int32_t mo_timer_create(void *(*callback)(void *arg),
278
285
{
279
286
static uint16_t next_id = 0x6000 ;
280
287
281
- if (!callback || period_ms == 0 )
288
+ if (unlikely ( !callback || ! period_ms ) )
282
289
return ERR_FAIL ;
283
- if (timer_subsystem_init () != ERR_OK )
290
+ if (unlikely ( timer_subsystem_init () != ERR_OK ) )
284
291
return ERR_FAIL ;
285
292
286
293
timer_t * t = malloc (sizeof (timer_t ));
287
- if (! t )
294
+ if (unlikely (! t ) )
288
295
return ERR_FAIL ;
289
296
290
297
NOSCHED_ENTER ();
@@ -296,9 +303,10 @@ int32_t mo_timer_create(void *(*callback)(void *arg),
296
303
t -> period_ms = period_ms ;
297
304
t -> deadline_ticks = 0 ;
298
305
t -> mode = TIMER_DISABLED ;
306
+ t -> _reserved = 0 ;
299
307
300
308
/* Insert into sorted all_timers_list */
301
- if (timer_insert_sorted_by_id (t ) != ERR_OK ) {
309
+ if (unlikely ( timer_insert_sorted_by_id (t ) != ERR_OK ) ) {
302
310
NOSCHED_LEAVE ();
303
311
free (t );
304
312
return ERR_FAIL ;
@@ -313,13 +321,13 @@ int32_t mo_timer_create(void *(*callback)(void *arg),
313
321
314
322
int32_t mo_timer_destroy (uint16_t id )
315
323
{
316
- if (!timer_initialized )
324
+ if (unlikely ( !timer_initialized ) )
317
325
return ERR_FAIL ;
318
326
319
327
NOSCHED_ENTER ();
320
328
321
329
list_node_t * node = timer_find_node_by_id (id );
322
- if (!node ) {
330
+ if (unlikely ( !node ) ) {
323
331
NOSCHED_LEAVE ();
324
332
return ERR_FAIL ;
325
333
}
@@ -349,15 +357,15 @@ int32_t mo_timer_destroy(uint16_t id)
349
357
350
358
int32_t mo_timer_start (uint16_t id , uint8_t mode )
351
359
{
352
- if (mode != TIMER_ONESHOT && mode != TIMER_AUTORELOAD )
360
+ if (unlikely ( mode != TIMER_ONESHOT && mode != TIMER_AUTORELOAD ) )
353
361
return ERR_FAIL ;
354
- if (!timer_initialized )
362
+ if (unlikely ( !timer_initialized ) )
355
363
return ERR_FAIL ;
356
364
357
365
NOSCHED_ENTER ();
358
366
359
367
timer_t * t = timer_find_by_id_fast (id );
360
- if (! t ) {
368
+ if (unlikely (! t ) ) {
361
369
NOSCHED_LEAVE ();
362
370
return ERR_FAIL ;
363
371
}
@@ -370,7 +378,7 @@ int32_t mo_timer_start(uint16_t id, uint8_t mode)
370
378
t -> mode = mode ;
371
379
t -> deadline_ticks = mo_ticks () + MS_TO_TICKS (t -> period_ms );
372
380
373
- if (timer_sorted_insert (t ) != ERR_OK ) {
381
+ if (unlikely ( timer_sorted_insert (t ) != ERR_OK ) ) {
374
382
t -> mode = TIMER_DISABLED ;
375
383
NOSCHED_LEAVE ();
376
384
return ERR_FAIL ;
@@ -382,13 +390,13 @@ int32_t mo_timer_start(uint16_t id, uint8_t mode)
382
390
383
391
int32_t mo_timer_cancel (uint16_t id )
384
392
{
385
- if (!timer_initialized )
393
+ if (unlikely ( !timer_initialized ) )
386
394
return ERR_FAIL ;
387
395
388
396
NOSCHED_ENTER ();
389
397
390
398
timer_t * t = timer_find_by_id_fast (id );
391
- if (!t || t -> mode == TIMER_DISABLED ) {
399
+ if (unlikely ( !t || t -> mode == TIMER_DISABLED ) ) {
392
400
NOSCHED_LEAVE ();
393
401
return ERR_FAIL ;
394
402
}
0 commit comments