@@ -111,32 +111,29 @@ static void _sleep_timeout(void *parameter)
111
111
rt_completion_done (& timer -> completion );
112
112
}
113
113
114
- static void _set_next_timeout ( void );
114
+ static void _set_next_timeout_n_unlock ( rt_base_t level );
115
115
static void _timeout_callback (void * parameter )
116
116
{
117
117
rt_ktime_hrtimer_t timer ;
118
118
timer = (rt_ktime_hrtimer_t )parameter ;
119
119
rt_base_t level ;
120
120
121
+ level = rt_spin_lock_irqsave (& _spinlock );
122
+ _nowtimer = RT_NULL ;
123
+ rt_list_remove (& (timer -> row ));
124
+
121
125
if (timer -> parent .flag & RT_TIMER_FLAG_ACTIVATED )
122
126
{
123
127
timer -> timeout_func (timer -> parameter );
124
128
}
125
129
126
- level = rt_spin_lock_irqsave (& _spinlock );
127
- _nowtimer = RT_NULL ;
128
- rt_list_remove (& (timer -> row ));
129
- rt_spin_unlock_irqrestore (& _spinlock , level );
130
-
131
- _set_next_timeout ();
130
+ _set_next_timeout_n_unlock (level );
132
131
}
133
132
134
- static void _set_next_timeout ( void )
133
+ static void _set_next_timeout_n_unlock ( rt_base_t level )
135
134
{
136
135
rt_ktime_hrtimer_t t ;
137
- rt_base_t level ;
138
136
139
- level = rt_spin_lock_irqsave (& _spinlock );
140
137
if (& _timer_list != _timer_list .prev )
141
138
{
142
139
t = rt_list_entry ((& _timer_list )-> next , struct rt_ktime_hrtimer , row );
@@ -202,9 +199,6 @@ rt_err_t rt_ktime_hrtimer_start(rt_ktime_hrtimer_t timer)
202
199
/* parameter check */
203
200
RT_ASSERT (timer != RT_NULL );
204
201
205
- /* notify the timer stop event */
206
- rt_completion_wakeup_by_errno (& timer -> completion , RT_ERROR );
207
-
208
202
level = rt_spin_lock_irqsave (& _spinlock );
209
203
rt_list_remove (& timer -> row ); /* remove timer from list */
210
204
/* change status of timer */
@@ -228,9 +222,8 @@ rt_err_t rt_ktime_hrtimer_start(rt_ktime_hrtimer_t timer)
228
222
}
229
223
rt_list_insert_after (timer_list , & (timer -> row ));
230
224
timer -> parent .flag |= RT_TIMER_FLAG_ACTIVATED ;
231
- rt_spin_unlock_irqrestore (& _spinlock , level );
232
225
233
- _set_next_timeout ( );
226
+ _set_next_timeout_n_unlock ( level );
234
227
235
228
return RT_EOK ;
236
229
}
@@ -250,9 +243,8 @@ rt_err_t rt_ktime_hrtimer_stop(rt_ktime_hrtimer_t timer)
250
243
_nowtimer = RT_NULL ;
251
244
rt_list_remove (& timer -> row );
252
245
timer -> parent .flag &= ~RT_TIMER_FLAG_ACTIVATED ; /* change status */
253
- rt_spin_unlock_irqrestore (& _spinlock , level );
254
246
255
- _set_next_timeout ( );
247
+ _set_next_timeout_n_unlock ( level );
256
248
257
249
return RT_EOK ;
258
250
}
@@ -344,8 +336,7 @@ rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer)
344
336
{
345
337
_nowtimer = RT_NULL ;
346
338
rt_list_remove (& timer -> row );
347
- rt_spin_unlock_irqrestore (& _spinlock , level );
348
- _set_next_timeout ();
339
+ _set_next_timeout_n_unlock (level );
349
340
}
350
341
else
351
342
{
0 commit comments