()
| 225 | } |
| 226 | |
| 227 | async fn alarm_task() { |
| 228 | loop { |
| 229 | let guard = ALARM_LIST.lock(); |
| 230 | let Some(entry) = guard.peek() else { |
| 231 | drop(guard); |
| 232 | listener!(EVENT_NEW_TIMER => listener); |
| 233 | |
| 234 | if !ALARM_LIST.lock().is_empty() { |
| 235 | continue; |
| 236 | } |
| 237 | listener.await; |
| 238 | |
| 239 | continue; |
| 240 | }; |
| 241 | |
| 242 | let now = wall_time(); |
| 243 | if entry.deadline <= now { |
| 244 | let entry_deadline = entry.deadline; |
| 245 | if let Some(task) = entry.task.upgrade() { |
| 246 | drop(guard); |
| 247 | poll_timer(&task); |
| 248 | } else { |
| 249 | drop(guard); |
| 250 | } |
| 251 | let mut guard = ALARM_LIST.lock(); |
| 252 | assert!(guard.pop().is_some_and(|it| it.deadline == entry_deadline)); |
| 253 | } else { |
| 254 | let deadline = entry.deadline; |
| 255 | drop(guard); |
| 256 | listener!(EVENT_NEW_TIMER => listener); |
| 257 | if ALARM_LIST |
| 258 | .lock() |
| 259 | .peek() |
| 260 | .is_none_or(|it| it.deadline != deadline) |
| 261 | { |
| 262 | continue; |
| 263 | } |
| 264 | let _ = timeout_at(Some(deadline), listener).await; |
| 265 | } |
| 266 | } |
| 267 | } |
| 268 | |
| 269 | /// Spawns the alarm task. |
| 270 | pub fn spawn_alarm_task() { |
no test coverage detected