Struct glommio::io::DmaStreamReader
source · [−]pub struct DmaStreamReader { /* private fields */ }
Expand description
Provides linear access to a DmaFile
. The DmaFile
is a convenient way
to manage a file through Direct I/O, but its interface is conductive to
random access, as a position must always be specified.
In situations where the file must be scanned linearly - either because a large chunk is to be read or because we are scanning the whole file, it may be more convenient to use a linear scan API.
The DmaStreamReader
implements AsyncRead
, which can offer the user
with a convenient way of issuing reads. However note that this mandates a
copy between the Dma Buffer used to read the file contents and the
user-specified buffer.
To avoid that copy the DmaStreamReader
provides the
get_buffer_aligned
method which exposes the buffer as a byte slice.
Different situations will call for different APIs to be used.
Implementations
sourceimpl DmaStreamReader
impl DmaStreamReader
sourcepub async fn close(self) -> Result<(), ()>
pub async fn close(self) -> Result<(), ()>
Closes this DmaStreamReader
.
It is illegal to close the DmaStreamReader
more than once.
Examples
use glommio::{
io::{DmaFile, DmaStreamReaderBuilder},
LocalExecutor,
};
let ex = LocalExecutor::default();
ex.run(async {
let file = DmaFile::open("myfile.txt").await.unwrap();
let mut reader = DmaStreamReaderBuilder::new(file).build();
reader.close().await.unwrap();
});
sourcepub fn skip(&mut self, bytes: u64)
pub fn skip(&mut self, bytes: u64)
Skip reading bytes from this DmaStreamReader
.
The file cursor is advanced by the provided bytes. As this is a linear access API, once those bytes are skipped they are gone. If you need to read those bytes, just not now, it is better to read them and save them in some temporary buffer.
Examples
use glommio::{
io::{DmaFile, DmaStreamReaderBuilder},
LocalExecutor,
};
let ex = LocalExecutor::default();
ex.run(async {
let file = DmaFile::open("myfile.txt").await.unwrap();
let mut reader = DmaStreamReaderBuilder::new(file).build();
assert_eq!(reader.current_pos(), 0);
reader.skip(8);
assert_eq!(reader.current_pos(), 8);
reader.close().await.unwrap();
});
sourcepub fn current_pos(&self) -> u64
pub fn current_pos(&self) -> u64
Acquires the current position of this DmaStreamReader
.
Examples
use glommio::{
io::{DmaFile, DmaStreamReaderBuilder},
LocalExecutor,
};
let ex = LocalExecutor::default();
ex.run(async {
let file = DmaFile::open("myfile.txt").await.unwrap();
let mut reader = DmaStreamReaderBuilder::new(file).build();
assert_eq!(reader.current_pos(), 0);
reader.skip(8);
assert_eq!(reader.current_pos(), 8);
reader.close().await.unwrap();
});
sourcepub async fn get_buffer_aligned(&mut self, len: u64) -> Result<ReadResult, ()>
pub async fn get_buffer_aligned(&mut self, len: u64) -> Result<ReadResult, ()>
Allows access to the buffer that holds the current position with no extra copy.
This function returns a ReadResult
. It contains all the bytes read,
which can be less than the requested amount. Users are expected to call
this in a loop like they would AsyncRead::poll_read
.
The buffer is not released until the returned ReadResult
goes
out of scope. So if you plan to keep this alive for a long time this
is probably the wrong API.
If EOF is hit while reading with this method, the number of bytes in the returned buffer will be less than number requested and the remaining bytes will be 0.
Examples
use glommio::{
io::{DmaFile, DmaStreamReaderBuilder},
LocalExecutor,
};
let ex = LocalExecutor::default();
ex.run(async {
let file = DmaFile::open("myfile.txt").await.unwrap();
let mut reader = DmaStreamReaderBuilder::new(file).build();
assert_eq!(reader.current_pos(), 0);
let result = reader.get_buffer_aligned(512).await.unwrap();
assert_eq!(result.len(), 512);
println!("First 512 bytes: {:?}", &*result);
reader.close().await.unwrap();
});
sourcepub fn poll_get_buffer_aligned(
&mut self,
cx: &mut Context<'_>,
len: u64
) -> Poll<Result<ReadResult, ()>>
pub fn poll_get_buffer_aligned(
&mut self,
cx: &mut Context<'_>,
len: u64
) -> Poll<Result<ReadResult, ()>>
A variant of get_buffer_aligned
that can be called from a poll
function context.
Trait Implementations
Auto Trait Implementations
impl !RefUnwindSafe for DmaStreamReader
impl !Send for DmaStreamReader
impl !Sync for DmaStreamReader
impl Unpin for DmaStreamReader
impl !UnwindSafe for DmaStreamReader
Blanket Implementations
sourceimpl<R> AsyncReadExt for R where
R: AsyncRead + ?Sized,
impl<R> AsyncReadExt for R where
R: AsyncRead + ?Sized,
sourcefn read(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self> where
Self: Unpin,
fn read(&'a mut self, buf: &'a mut [u8]) -> ReadFuture<'a, Self> where
Self: Unpin,
Reads some bytes from the byte stream. Read more
sourcefn read_vectored(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>]
) -> ReadVectoredFuture<'a, Self> where
Self: Unpin,
fn read_vectored(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>]
) -> ReadVectoredFuture<'a, Self> where
Self: Unpin,
sourcefn read_to_end(
&'a mut self,
buf: &'a mut Vec<u8, Global>
) -> ReadToEndFuture<'a, Self> where
Self: Unpin,
fn read_to_end(
&'a mut self,
buf: &'a mut Vec<u8, Global>
) -> ReadToEndFuture<'a, Self> where
Self: Unpin,
sourcefn read_to_string(
&'a mut self,
buf: &'a mut String
) -> ReadToStringFuture<'a, Self> where
Self: Unpin,
fn read_to_string(
&'a mut self,
buf: &'a mut String
) -> ReadToStringFuture<'a, Self> where
Self: Unpin,
sourcefn read_exact(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self> where
Self: Unpin,
fn read_exact(&'a mut self, buf: &'a mut [u8]) -> ReadExactFuture<'a, Self> where
Self: Unpin,
Reads the exact number of bytes required to fill buf
. Read more
sourcefn take(self, limit: u64) -> Take<Self>
fn take(self, limit: u64) -> Take<Self>
Creates an adapter which will read at most limit
bytes from it. Read more
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcepub fn borrow_mut(&mut self) -> &mut T
pub fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
impl<T> Pointable for T
impl<T> Pointable for T
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more