struct VirtualSocket {
readbuf: Option<RefCell<Buffer>>,
peer_fd: OnceCell<WeakFileDescriptionRef<VirtualSocket>>,
peer_lost_data: Cell<bool>,
blocked_read_tid: RefCell<Vec<ThreadId>>,
blocked_write_tid: RefCell<Vec<ThreadId>>,
is_nonblock: Cell<bool>,
fd_type: VirtualSocketType,
delayed_readiness_updates: Rc<DelayedReadinessUpdates>,
watched: ReadinessWatched,
}Expand description
One end of a pair of connected virtual sockets.
Fields§
§readbuf: Option<RefCell<Buffer>>The buffer we are reading from, or None if this is the writing end of a pipe.
(In that case, the peer FD will be the reading end of that pipe.)
peer_fd: OnceCell<WeakFileDescriptionRef<VirtualSocket>>The VirtualSocket file descriptor that is our “peer”, and that holds the buffer we are
writing to. This is a weak reference because the other side may be closed before us; all
future writes will then trigger EPIPE.
peer_lost_data: Cell<bool>Indicates whether the peer has lost data when the file description is closed.
This flag is set to true if the peer’s readbuf is non-empty at the time
of closure.
blocked_read_tid: RefCell<Vec<ThreadId>>A list of thread ids blocked because the buffer was empty. Once another thread writes some bytes, these threads will be unblocked.
blocked_write_tid: RefCell<Vec<ThreadId>>A list of thread ids blocked because the buffer was full. Once another thread reads some bytes, these threads will be unblocked.
is_nonblock: Cell<bool>Whether this fd is non-blocking or not.
fd_type: VirtualSocketTypeDifferentiate between different virtual socket fd types.
delayed_readiness_updates: Rc<DelayedReadinessUpdates>We need to update the peer_fd readiness when we get dropped, so we keep a reference to the readiness update queue
watched: ReadinessWatchedState for being watched by epoll.
Implementations§
Source§impl VirtualSocket
impl VirtualSocket
fn peer_fd(&self) -> &WeakFileDescriptionRef<VirtualSocket>
Trait Implementations§
Source§impl Debug for VirtualSocket
impl Debug for VirtualSocket
Source§impl Drop for VirtualSocket
impl Drop for VirtualSocket
Source§impl FileDescription for VirtualSocket
impl FileDescription for VirtualSocket
fn name(&self) -> &'static str
Source§fn metadata<'tcx>(
&self,
) -> InterpResult<'tcx, Either<Result<Metadata>, &'static str>>
fn metadata<'tcx>( &self, ) -> InterpResult<'tcx, Either<Result<Metadata>, &'static str>>
libc name so we only
support that kind of metadata on Unix targets.Source§fn read<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
ptr: Pointer,
len: usize,
ecx: &mut MiriInterpCx<'tcx>,
finish: DynMachineCallback<'tcx, Result<usize, IoError>>,
) -> InterpResult<'tcx>
fn read<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, ptr: Pointer, len: usize, ecx: &mut MiriInterpCx<'tcx>, finish: DynMachineCallback<'tcx, Result<usize, IoError>>, ) -> InterpResult<'tcx>
ptr.
len indicates how many bytes we should try to read. Read moreSource§fn write<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
ptr: Pointer,
len: usize,
ecx: &mut MiriInterpCx<'tcx>,
finish: DynMachineCallback<'tcx, Result<usize, IoError>>,
) -> InterpResult<'tcx>
fn write<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, ptr: Pointer, len: usize, ecx: &mut MiriInterpCx<'tcx>, finish: DynMachineCallback<'tcx, Result<usize, IoError>>, ) -> InterpResult<'tcx>
ptr.
len indicates how many bytes we should try to write. Read moreSource§fn short_fd_operations(&self) -> bool
fn short_fd_operations(&self) -> bool
fn as_unix<'tcx>( self: FileDescriptionRef<Self>, _ecx: &MiriInterpCx<'tcx>, ) -> FileDescriptionRef<dyn UnixFileDescription>
Source§fn get_flags<'tcx>(
&self,
ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Scalar>
fn get_flags<'tcx>( &self, ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Scalar>
Source§fn set_flags<'tcx>(
&self,
flag: i32,
ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Scalar>
fn set_flags<'tcx>( &self, flag: i32, ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Scalar>
Source§fn readiness_watched(&self) -> Option<&ReadinessWatched>
fn readiness_watched(&self) -> Option<&ReadinessWatched>
ReadinessWatched of the file description.Source§fn seek<'tcx>(
&self,
_communicate_allowed: bool,
_offset: SeekFrom,
) -> InterpResult<'tcx, Result<u64>>
fn seek<'tcx>( &self, _communicate_allowed: bool, _offset: SeekFrom, ) -> InterpResult<'tcx, Result<u64>>
fn is_tty(&self, _communicate_allowed: bool) -> bool
Source§impl UnixFileDescription for VirtualSocket
impl UnixFileDescription for VirtualSocket
Source§fn ioctl<'tcx>(
&self,
op: Scalar,
arg: Option<&OpTy<'tcx>>,
ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, i32>
fn ioctl<'tcx>( &self, op: Scalar, arg: Option<&OpTy<'tcx>>, ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, i32>
op is the device-dependent operation code. It’s either a c_long or c_int, depending on
the target and whether it uses glibc or musl.
arg is the optional third argument which exists depending on the operation code. It’s either
an integer or a pointer.Source§fn as_socket<'tcx>(
self: FileDescriptionRef<Self>,
_ecx: &MiriInterpCx<'tcx>,
) -> Option<FileDescriptionRef<dyn UnixSocketFileDescription>>
fn as_socket<'tcx>( self: FileDescriptionRef<Self>, _ecx: &MiriInterpCx<'tcx>, ) -> Option<FileDescriptionRef<dyn UnixSocketFileDescription>>
Source§fn pread<'tcx>(
&self,
_communicate_allowed: bool,
_offset: u64,
_ptr: Pointer,
_len: usize,
_ecx: &mut MiriInterpCx<'tcx>,
_finish: DynMachineCallback<'tcx, Result<usize, IoError>>,
) -> InterpResult<'tcx>
fn pread<'tcx>( &self, _communicate_allowed: bool, _offset: u64, _ptr: Pointer, _len: usize, _ecx: &mut MiriInterpCx<'tcx>, _finish: DynMachineCallback<'tcx, Result<usize, IoError>>, ) -> InterpResult<'tcx>
ptr from a given offset.
len indicates how many bytes we should try to read.
dest is where the return value should be stored: number of bytes read, or -1 in case of error.Source§fn pwrite<'tcx>(
&self,
_communicate_allowed: bool,
_ptr: Pointer,
_len: usize,
_offset: u64,
_ecx: &mut MiriInterpCx<'tcx>,
_finish: DynMachineCallback<'tcx, Result<usize, IoError>>,
) -> InterpResult<'tcx>
fn pwrite<'tcx>( &self, _communicate_allowed: bool, _ptr: Pointer, _len: usize, _offset: u64, _ecx: &mut MiriInterpCx<'tcx>, _finish: DynMachineCallback<'tcx, Result<usize, IoError>>, ) -> InterpResult<'tcx>
ptr starting at a given offset.
ptr is the pointer to the user supplied read buffer.
len indicates how many bytes we should try to write.
dest is where the return value should be stored: number of bytes written, or -1 in case of error.fn flock<'tcx>( &self, _communicate_allowed: bool, _op: FlockOp, ) -> InterpResult<'tcx, Result<()>>
Source§impl UnixSocketFileDescription for VirtualSocket
impl UnixSocketFileDescription for VirtualSocket
Source§fn send<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
ptr: Pointer,
len: usize,
is_non_block: bool,
ecx: &mut MiriInterpCx<'tcx>,
finish: DynMachineCallback<'tcx, Result<usize, IoError>>,
) -> InterpResult<'tcx>
fn send<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, ptr: Pointer, len: usize, is_non_block: bool, ecx: &mut MiriInterpCx<'tcx>, finish: DynMachineCallback<'tcx, Result<usize, IoError>>, ) -> InterpResult<'tcx>
ptr into the socket.
len indicates how many bytes we should try to send.
is_non_block specifies whether the send operation is non-blocking.
After a successful send, finish should be called with the amount of bytes sent.Source§fn recv<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
ptr: Pointer,
len: usize,
is_peek: bool,
is_non_block: bool,
ecx: &mut MiriInterpCx<'tcx>,
finish: DynMachineCallback<'tcx, Result<usize, IoError>>,
) -> InterpResult<'tcx>
fn recv<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, ptr: Pointer, len: usize, is_peek: bool, is_non_block: bool, ecx: &mut MiriInterpCx<'tcx>, finish: DynMachineCallback<'tcx, Result<usize, IoError>>, ) -> InterpResult<'tcx>
ptr.
len indicates how many bytes we should try to receive.
is_peek specifies whether the receive removes the bytes from the receive buffer
(false) or leaves them in the receive buffer (true).
is_non_block specifies whether the receive operation is non-blocking.
After a successful receive, finish should be called with the amount of bytes received.Source§fn bind<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
_address: SocketAddr,
_ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Result<(), IoError>>
fn bind<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, _address: SocketAddr, _ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Result<(), IoError>>
address.Source§fn listen<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
_backlog: i32,
_ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Result<(), IoError>>
fn listen<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, _backlog: i32, _ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Result<(), IoError>>
backlog specifies how many pending incoming connections can exist at the same
time before new requests are rejected.Source§fn accept<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
_is_client_sock_non_block: bool,
_ecx: &mut MiriInterpCx<'tcx>,
_finish: DynMachineCallback<'tcx, Result<(i32, SocketAddr), IoError>>,
) -> InterpResult<'tcx>
fn accept<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, _is_client_sock_non_block: bool, _ecx: &mut MiriInterpCx<'tcx>, _finish: DynMachineCallback<'tcx, Result<(i32, SocketAddr), IoError>>, ) -> InterpResult<'tcx>
is_client_sock_non_block specifies whether the newly accepted client connection
should be non-blocking.
After a successful accept, finish should be called with a tuple containing the
file descriptor of the peer socket and it’s address.Source§fn connect<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
_address: SocketAddr,
_ecx: &mut MiriInterpCx<'tcx>,
_finish: DynMachineCallback<'tcx, Result<(), IoError>>,
) -> InterpResult<'tcx>
fn connect<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, _address: SocketAddr, _ecx: &mut MiriInterpCx<'tcx>, _finish: DynMachineCallback<'tcx, Result<(), IoError>>, ) -> InterpResult<'tcx>
address.Source§fn setsockopt<'tcx>(
self: FileDescriptionRef<Self>,
_level: i32,
_option: i32,
_value_ptr: Pointer,
_value_len: u64,
_ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Result<(), IoError>>
fn setsockopt<'tcx>( self: FileDescriptionRef<Self>, _level: i32, _option: i32, _value_ptr: Pointer, _value_len: u64, _ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Result<(), IoError>>
option on level.
value_ptr points to the new value of the socket option, and value_len contains
the amount of bytes the value uses at value_ptr.Source§fn getsockopt<'tcx>(
self: FileDescriptionRef<Self>,
_level: i32,
_option: i32,
_ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Result<MPlaceTy<'tcx>, IoError>>
fn getsockopt<'tcx>( self: FileDescriptionRef<Self>, _level: i32, _option: i32, _ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Result<MPlaceTy<'tcx>, IoError>>
option on level.Source§fn getsockname<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
_ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Result<SocketAddr, IoError>>
fn getsockname<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, _ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Result<SocketAddr, IoError>>
Source§fn getpeername<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
_ecx: &mut MiriInterpCx<'tcx>,
_finish: DynMachineCallback<'tcx, Result<SocketAddr, IoError>>,
) -> InterpResult<'tcx>
fn getpeername<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, _ecx: &mut MiriInterpCx<'tcx>, _finish: DynMachineCallback<'tcx, Result<SocketAddr, IoError>>, ) -> InterpResult<'tcx>
Source§fn shutdown<'tcx>(
self: FileDescriptionRef<Self>,
_communicate_allowed: bool,
_how: Shutdown,
_ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Result<(), IoError>>
fn shutdown<'tcx>( self: FileDescriptionRef<Self>, _communicate_allowed: bool, _how: Shutdown, _ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Result<(), IoError>>
Auto Trait Implementations§
impl !DynSend for VirtualSocket
impl !DynSync for VirtualSocket
impl !Freeze for VirtualSocket
impl !RefUnwindSafe for VirtualSocket
impl !Send for VirtualSocket
impl !Sync for VirtualSocket
impl !UnwindSafe for VirtualSocket
impl Unpin for VirtualSocket
impl UnsafeUnpin for VirtualSocket
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FileDescriptionExt for Twhere
T: FileDescription + 'static,
impl<T> FileDescriptionExt for Twhere
T: FileDescription + 'static,
fn into_rc_any(self: FileDescriptionRef<T>) -> Rc<dyn Any>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 304 bytes