mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-21 16:33:24 +00:00
Protect socket states with PreemptDisabled
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
39a5e88baf
commit
1207161afe
@ -3,7 +3,7 @@
|
|||||||
use core::sync::atomic::{AtomicBool, Ordering};
|
use core::sync::atomic::{AtomicBool, Ordering};
|
||||||
|
|
||||||
use aster_bigtcp::wire::IpEndpoint;
|
use aster_bigtcp::wire::IpEndpoint;
|
||||||
use ostd::sync::WriteIrqDisabled;
|
use ostd::sync::PreemptDisabled;
|
||||||
use takeable::Takeable;
|
use takeable::Takeable;
|
||||||
|
|
||||||
use self::{bound::BoundDatagram, unbound::UnboundDatagram};
|
use self::{bound::BoundDatagram, unbound::UnboundDatagram};
|
||||||
@ -49,7 +49,7 @@ impl OptionSet {
|
|||||||
|
|
||||||
pub struct DatagramSocket {
|
pub struct DatagramSocket {
|
||||||
options: RwLock<OptionSet>,
|
options: RwLock<OptionSet>,
|
||||||
inner: RwLock<Takeable<Inner>, WriteIrqDisabled>,
|
inner: RwLock<Takeable<Inner>, PreemptDisabled>,
|
||||||
nonblocking: AtomicBool,
|
nonblocking: AtomicBool,
|
||||||
pollee: Pollee,
|
pollee: Pollee,
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
use aster_bigtcp::{
|
use aster_bigtcp::{
|
||||||
errors::tcp::ListenError, iface::BindPortConfig, socket::UnboundTcpSocket, wire::IpEndpoint,
|
errors::tcp::ListenError, iface::BindPortConfig, socket::UnboundTcpSocket, wire::IpEndpoint,
|
||||||
};
|
};
|
||||||
use ostd::sync::WriteIrqDisabled;
|
use ostd::sync::PreemptDisabled;
|
||||||
|
|
||||||
use super::{connected::ConnectedStream, StreamObserver};
|
use super::{connected::ConnectedStream, StreamObserver};
|
||||||
use crate::{
|
use crate::{
|
||||||
@ -18,7 +18,7 @@ pub struct ListenStream {
|
|||||||
/// A bound socket held to ensure the TCP port cannot be released
|
/// A bound socket held to ensure the TCP port cannot be released
|
||||||
bound_socket: BoundTcpSocket,
|
bound_socket: BoundTcpSocket,
|
||||||
/// Backlog sockets listening at the local endpoint
|
/// Backlog sockets listening at the local endpoint
|
||||||
backlog_sockets: RwLock<Vec<BacklogSocket>, WriteIrqDisabled>,
|
backlog_sockets: RwLock<Vec<BacklogSocket>, PreemptDisabled>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ListenStream {
|
impl ListenStream {
|
||||||
|
@ -8,7 +8,7 @@ use connecting::{ConnResult, ConnectingStream};
|
|||||||
use init::InitStream;
|
use init::InitStream;
|
||||||
use listen::ListenStream;
|
use listen::ListenStream;
|
||||||
use options::{Congestion, MaxSegment, NoDelay, WindowClamp};
|
use options::{Congestion, MaxSegment, NoDelay, WindowClamp};
|
||||||
use ostd::sync::{PreemptDisabled, RwLockReadGuard, RwLockWriteGuard, WriteIrqDisabled};
|
use ostd::sync::{PreemptDisabled, RwLockReadGuard, RwLockWriteGuard};
|
||||||
use takeable::Takeable;
|
use takeable::Takeable;
|
||||||
use util::TcpOptionSet;
|
use util::TcpOptionSet;
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ pub use self::util::CongestionControl;
|
|||||||
|
|
||||||
pub struct StreamSocket {
|
pub struct StreamSocket {
|
||||||
options: RwLock<OptionSet>,
|
options: RwLock<OptionSet>,
|
||||||
state: RwLock<Takeable<State>, WriteIrqDisabled>,
|
state: RwLock<Takeable<State>, PreemptDisabled>,
|
||||||
is_nonblocking: AtomicBool,
|
is_nonblocking: AtomicBool,
|
||||||
pollee: Pollee,
|
pollee: Pollee,
|
||||||
}
|
}
|
||||||
@ -109,7 +109,7 @@ impl StreamSocket {
|
|||||||
/// Ensures that the socket state is up to date and obtains a read lock on it.
|
/// Ensures that the socket state is up to date and obtains a read lock on it.
|
||||||
///
|
///
|
||||||
/// For a description of what "up-to-date" means, see [`Self::update_connecting`].
|
/// For a description of what "up-to-date" means, see [`Self::update_connecting`].
|
||||||
fn read_updated_state(&self) -> RwLockReadGuard<Takeable<State>, WriteIrqDisabled> {
|
fn read_updated_state(&self) -> RwLockReadGuard<Takeable<State>, PreemptDisabled> {
|
||||||
loop {
|
loop {
|
||||||
let state = self.state.read();
|
let state = self.state.read();
|
||||||
match state.as_ref() {
|
match state.as_ref() {
|
||||||
@ -125,7 +125,7 @@ impl StreamSocket {
|
|||||||
/// Ensures that the socket state is up to date and obtains a write lock on it.
|
/// Ensures that the socket state is up to date and obtains a write lock on it.
|
||||||
///
|
///
|
||||||
/// For a description of what "up-to-date" means, see [`Self::update_connecting`].
|
/// For a description of what "up-to-date" means, see [`Self::update_connecting`].
|
||||||
fn write_updated_state(&self) -> RwLockWriteGuard<Takeable<State>, WriteIrqDisabled> {
|
fn write_updated_state(&self) -> RwLockWriteGuard<Takeable<State>, PreemptDisabled> {
|
||||||
self.update_connecting().1
|
self.update_connecting().1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ impl StreamSocket {
|
|||||||
&self,
|
&self,
|
||||||
) -> (
|
) -> (
|
||||||
RwLockWriteGuard<OptionSet, PreemptDisabled>,
|
RwLockWriteGuard<OptionSet, PreemptDisabled>,
|
||||||
RwLockWriteGuard<Takeable<State>, WriteIrqDisabled>,
|
RwLockWriteGuard<Takeable<State>, PreemptDisabled>,
|
||||||
) {
|
) {
|
||||||
// Hold the lock in advance to avoid race conditions.
|
// Hold the lock in advance to avoid race conditions.
|
||||||
let mut options = self.options.write();
|
let mut options = self.options.write();
|
||||||
|
Reference in New Issue
Block a user