mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-25 10:23:23 +00:00
Repeat iface polling if necessary
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
12ed40578d
commit
4df7654034
@ -147,22 +147,30 @@ impl IfaceCommon {
|
|||||||
|
|
||||||
pub(super) fn poll<D: Device + ?Sized>(&self, device: &mut D) {
|
pub(super) fn poll<D: Device + ?Sized>(&self, device: &mut D) {
|
||||||
let mut interface = self.interface.lock_irq_disabled();
|
let mut interface = self.interface.lock_irq_disabled();
|
||||||
let timestamp = get_network_timestamp();
|
let mut sockets = self.sockets.lock_irq_disabled();
|
||||||
let has_events = {
|
|
||||||
let mut sockets = self.sockets.lock_irq_disabled();
|
|
||||||
interface.poll(timestamp, device, &mut sockets)
|
|
||||||
// drop sockets here to avoid deadlock
|
|
||||||
};
|
|
||||||
if has_events {
|
|
||||||
self.bound_sockets.read().iter().for_each(|bound_socket| {
|
|
||||||
if let Some(bound_socket) = bound_socket.upgrade() {
|
|
||||||
bound_socket.on_iface_events();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let sockets = self.sockets.lock_irq_disabled();
|
let timestamp = get_network_timestamp();
|
||||||
if let Some(instant) = interface.poll_at(timestamp, &sockets) {
|
let (has_events, poll_at) = {
|
||||||
|
let mut has_events = false;
|
||||||
|
let mut poll_at;
|
||||||
|
loop {
|
||||||
|
has_events |= interface.poll(timestamp, device, &mut sockets);
|
||||||
|
poll_at = interface.poll_at(timestamp, &sockets);
|
||||||
|
let Some(instant) = poll_at else {
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
if instant > timestamp {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(has_events, poll_at)
|
||||||
|
};
|
||||||
|
|
||||||
|
// drop sockets here to avoid deadlock
|
||||||
|
drop(sockets);
|
||||||
|
drop(interface);
|
||||||
|
|
||||||
|
if let Some(instant) = poll_at {
|
||||||
let old_instant = self.next_poll_at_ms.load(Ordering::Acquire);
|
let old_instant = self.next_poll_at_ms.load(Ordering::Acquire);
|
||||||
let new_instant = instant.total_millis() as u64;
|
let new_instant = instant.total_millis() as u64;
|
||||||
self.next_poll_at_ms.store(new_instant, Ordering::Relaxed);
|
self.next_poll_at_ms.store(new_instant, Ordering::Relaxed);
|
||||||
@ -173,6 +181,14 @@ impl IfaceCommon {
|
|||||||
} else {
|
} else {
|
||||||
self.next_poll_at_ms.store(0, Ordering::Relaxed);
|
self.next_poll_at_ms.store(0, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if has_events {
|
||||||
|
self.bound_sockets.read().iter().for_each(|bound_socket| {
|
||||||
|
if let Some(bound_socket) = bound_socket.upgrade() {
|
||||||
|
bound_socket.on_iface_events();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn next_poll_at_ms(&self) -> Option<u64> {
|
pub(super) fn next_poll_at_ms(&self) -> Option<u64> {
|
||||||
|
Reference in New Issue
Block a user