voidio 0.1.2

High-performance Cross-platform Low-level Socket I/O for Rust.
Documentation
use crate::*;
impl UdpServerThreadContext {
    #[cfg(unix)]
    pub(crate) fn begin_popmany_loop(&mut self) -> std::io::Result<()> {
        use std::sync::atomic::Ordering;
        let mut handler = self.datagram_handler.take().expect("No Datagram handler set for XUdpServerWorker");
        let drain_capacity = 8;
        let mut bucket = Ipv4Bucket::new(drain_capacity, 2048);
        let bucket_ref = &mut bucket;
        self.make_ready();
        while self.server_running.load(Ordering::Relaxed) {
            match self.socket.vecrecv(bucket_ref, 0) {
                Ok(count) => {
                    for i in 0..count {
                        let (addrv4, buf) = unsafe { bucket_ref.unsafe_peek(i) };
                        let addr = addrv4.to_socket_addr();
                        handler(addr, buf);
                    }
                    self.c += count;
                    if self.c % 10_000 == 0 {
                        self.processed_counter.fetch_add(self.c, Ordering::Relaxed);
                        self.c = 0;
                    }
                }
                Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock || e.kind() == std::io::ErrorKind::TimedOut => {
                    continue;
                }
                Err(e) => {
                    dprintln!(self, "Error receiving data: {e}");
                    break;
                }
            }
        }
        Ok(())
    }
}