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,
}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: VirtualSocketTypeImplementations§
Source§impl VirtualSocket
impl VirtualSocket
fn peer_fd(&self) -> &WeakFileDescriptionRef<VirtualSocket>
Trait Implementations§
Source§impl Debug for VirtualSocket
impl Debug 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 destroy<'tcx>(
self,
_self_id: FdId,
_communicate_allowed: bool,
ecx: &mut MiriInterpCx<'tcx>,
) -> InterpResult<'tcx, Result<()>>
fn destroy<'tcx>( self, _self_id: FdId, _communicate_allowed: bool, ecx: &mut MiriInterpCx<'tcx>, ) -> InterpResult<'tcx, Result<()>>
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, _ecx: &MiriInterpCx<'tcx>) -> &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 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 epoll_active_events<'tcx>(&self) -> InterpResult<'tcx, EpollEvents>
fn epoll_active_events<'tcx>(&self) -> InterpResult<'tcx, EpollEvents>
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§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.Auto Trait Implementations§
impl !Freeze for VirtualSocket
impl !RefUnwindSafe for VirtualSocket
impl !Send for VirtualSocket
impl !Sync for VirtualSocket
impl Unpin for VirtualSocket
impl UnsafeUnpin for VirtualSocket
impl !UnwindSafe 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>
Source§fn close_ref<'tcx>(
self: FileDescriptionRef<T>,
communicate_allowed: bool,
ecx: &mut InterpCx<'tcx, MiriMachine<'tcx>>,
) -> InterpResult<'tcx, Result<(), Error>>
fn close_ref<'tcx>( self: FileDescriptionRef<T>, communicate_allowed: bool, ecx: &mut InterpCx<'tcx, MiriMachine<'tcx>>, ) -> InterpResult<'tcx, Result<(), Error>>
close function generically, so both handle Rc::into_inner
and epoll interest management.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: 192 bytes