Hello World works
This commit is contained in:
@@ -10,9 +10,10 @@ homepage = "https://git.lbfalvy.com/Orchid/orchid"
|
||||
[dev-dependencies]
|
||||
futures = "0.3.31"
|
||||
itertools = "0.14.0"
|
||||
rand = "0.9.2"
|
||||
rand_chacha = "0.9.0"
|
||||
rand = "0.10.1"
|
||||
rand_chacha = "0.10.0"
|
||||
test_executors = "0.4.1"
|
||||
orchid-async-utils = { version = "0.1.0", path = "../orchid-async-utils" }
|
||||
|
||||
[dependencies]
|
||||
futures-io = "0.3.31"
|
||||
|
||||
@@ -145,16 +145,9 @@ impl AsyncRingbuffer {
|
||||
self.write_waker = Trigger::new(waker.clone());
|
||||
Poll::Pending
|
||||
}
|
||||
fn reader_wait(&mut self, waker: &Waker) -> Poll<io::Result<usize>> {
|
||||
if self.writer_dropped {
|
||||
return Poll::Ready(Err(io::Error::new(
|
||||
io::ErrorKind::BrokenPipe,
|
||||
"Pipe already closed from writer end.",
|
||||
)));
|
||||
}
|
||||
fn reader_wait(&mut self, waker: &Waker) {
|
||||
self.read_waker.drop();
|
||||
self.read_waker = Trigger::new(waker.clone());
|
||||
Poll::Pending
|
||||
}
|
||||
unsafe fn non_wrapping_write_unchecked(&mut self, buf: &[u8]) {
|
||||
let write_ptr = unsafe { self.start.add(self.write_idx) };
|
||||
@@ -326,12 +319,22 @@ impl AsyncRead for Reader {
|
||||
buf: &mut [u8],
|
||||
) -> Poll<io::Result<usize>> {
|
||||
let data = unsafe { self.0.as_mut().expect("Cannot be null") };
|
||||
if !buf.is_empty() && data.is_full() {
|
||||
if buf.is_empty() {
|
||||
return Poll::Ready(Ok(0));
|
||||
}
|
||||
if data.is_full() {
|
||||
// may be blocked so wake
|
||||
data.wake_writer();
|
||||
}
|
||||
let poll = if !buf.is_empty() && data.is_empty() {
|
||||
let poll = if data.is_empty() {
|
||||
// Nothing to read, waiting...
|
||||
data.reader_wait(cx.waker())
|
||||
data.wake_writer();
|
||||
if !data.writer_dropped {
|
||||
data.reader_wait(cx.waker());
|
||||
Poll::Pending
|
||||
} else {
|
||||
Poll::Ready(Ok(0))
|
||||
}
|
||||
} else {
|
||||
Poll::Ready(Ok(data.wrapping_read(buf)))
|
||||
};
|
||||
@@ -358,9 +361,9 @@ mod tests {
|
||||
use futures::future::join;
|
||||
use futures::{AsyncReadExt, AsyncWriteExt};
|
||||
use itertools::Itertools;
|
||||
use rand::{Rng, SeedableRng};
|
||||
use orchid_async_utils::debug::spin_on;
|
||||
use rand::{RngExt, SeedableRng};
|
||||
use rand_chacha::ChaCha8Rng;
|
||||
use test_executors::spin_on;
|
||||
|
||||
use super::*;
|
||||
|
||||
@@ -410,4 +413,16 @@ mod tests {
|
||||
join(write_fut, read_fut).await;
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn read_to_end() {
|
||||
let (mut write, mut read) = pipe(1024);
|
||||
spin_on(async {
|
||||
write.write_all(&[0, 1, 2, 3, 4]).await.unwrap();
|
||||
std::mem::drop(write);
|
||||
let mut dest = Vec::new();
|
||||
read.read_to_end(&mut dest).await.unwrap();
|
||||
assert_eq!(dest, [0, 1, 2, 3, 4]);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user