use crate::features::Gso;
use core::ops::ControlFlow;
#[derive(Debug)]
pub struct TxEvents {
count: usize,
is_blocked: bool,
gso: Gso,
}
impl TxEvents {
#[inline]
pub fn new(gso: Gso) -> Self {
Self {
count: 0,
is_blocked: false,
gso,
}
}
#[inline]
pub fn is_blocked(&self) -> bool {
self.is_blocked
}
#[inline]
pub fn take_blocked(&mut self) -> bool {
core::mem::take(&mut self.is_blocked)
}
#[inline]
pub fn blocked(&mut self) {
self.is_blocked = true;
}
#[inline]
pub fn take_count(&mut self) -> usize {
core::mem::take(&mut self.count)
}
}
impl crate::syscall::SocketEvents for TxEvents {
#[inline]
fn on_complete(&mut self, count: usize) -> ControlFlow<(), ()> {
self.count += count;
self.is_blocked = false;
ControlFlow::Continue(())
}
#[inline]
fn on_error(&mut self, error: ::std::io::Error) -> ControlFlow<(), ()> {
use std::io::ErrorKind::*;
match error.kind() {
WouldBlock => {
self.is_blocked = true;
ControlFlow::Break(())
}
Interrupted => {
ControlFlow::Break(())
}
_ => {
let _ = self.gso.handle_socket_error(&error);
self.count += 1;
ControlFlow::Continue(())
}
}
}
}
#[derive(Debug, Default)]
pub struct RxEvents {
count: usize,
is_blocked: bool,
}
impl RxEvents {
#[inline]
pub fn is_blocked(&self) -> bool {
self.is_blocked
}
#[inline]
pub fn take_blocked(&mut self) -> bool {
core::mem::take(&mut self.is_blocked)
}
#[inline]
pub fn blocked(&mut self) {
self.is_blocked = true;
}
#[inline]
pub fn take_count(&mut self) -> usize {
core::mem::take(&mut self.count)
}
}
impl crate::syscall::SocketEvents for RxEvents {
#[inline]
fn on_complete(&mut self, count: usize) -> ControlFlow<(), ()> {
self.count += count;
self.is_blocked = false;
ControlFlow::Continue(())
}
#[inline]
fn on_error(&mut self, error: ::std::io::Error) -> ControlFlow<(), ()> {
use std::io::ErrorKind::*;
match error.kind() {
WouldBlock => {
self.is_blocked = true;
ControlFlow::Break(())
}
Interrupted => {
ControlFlow::Break(())
}
_ => {
ControlFlow::Break(())
}
}
}
}