34 lines
		
	
	
		
			988 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			988 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use core::task::Waker;
 | |
| 
 | |
| use super::WakerRegistration;
 | |
| 
 | |
| /// Utility struct to register and wake multiple wakers.
 | |
| pub struct MultiWakerRegistration<const N: usize> {
 | |
|     wakers: [WakerRegistration; N],
 | |
| }
 | |
| 
 | |
| impl<const N: usize> MultiWakerRegistration<N> {
 | |
|     /// Create a new empty instance
 | |
|     pub const fn new() -> Self {
 | |
|         const WAKER: WakerRegistration = WakerRegistration::new();
 | |
|         Self { wakers: [WAKER; N] }
 | |
|     }
 | |
| 
 | |
|     /// Register a waker. If the buffer is full the function returns it in the error
 | |
|     pub fn register<'a>(&mut self, w: &'a Waker) -> Result<(), &'a Waker> {
 | |
|         if let Some(waker_slot) = self.wakers.iter_mut().find(|waker_slot| !waker_slot.occupied()) {
 | |
|             waker_slot.register(w);
 | |
|             Ok(())
 | |
|         } else {
 | |
|             Err(w)
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /// Wake all registered wakers. This clears the buffer
 | |
|     pub fn wake(&mut self) {
 | |
|         for waker_slot in self.wakers.iter_mut() {
 | |
|             waker_slot.wake()
 | |
|         }
 | |
|     }
 | |
| }
 |