Hello World works

This commit is contained in:
2026-04-24 22:32:41 +00:00
parent 759497ee70
commit 883d56143f
23 changed files with 447 additions and 487 deletions

View File

@@ -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"

View File

@@ -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]);
})
}
}