Skip to content

Commit 4b9a125

Browse files
authored
pass part echo CI in windows (#248)
* try fix echo_server * try fix echo_server * polish code * polish code * test WSASend * pass part CI * fix clippy * fix clippy
1 parent cdc4f52 commit 4b9a125

File tree

9 files changed

+65
-53
lines changed

9 files changed

+65
-53
lines changed

monoio/src/buf/io_vec_buf.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ unsafe impl IoVecBuf for VecBuf {
6161
}
6262

6363
#[cfg(unix)]
64-
6564
unsafe impl IoVecBuf for Vec<libc::iovec> {
6665
fn read_iovec_ptr(&self) -> *const libc::iovec {
6766
self.as_ptr()

monoio/src/buf/vec_wrapper.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,6 @@ impl<'t, T: IoBufMut> From<&'t mut T> for IoVecMeta {
244244
}
245245
}
246246

247-
#[cfg(unix)]
248247
#[cfg(test)]
249248
mod tests {
250249
use super::*;
@@ -256,9 +255,18 @@ mod tests {
256255
let meta = read_vec_meta(&iovec);
257256
assert_eq!(meta.len(), 60);
258257
assert_eq!(meta.data.len(), 3);
259-
assert_eq!(meta.data[0].iov_len, 10);
260-
assert_eq!(meta.data[1].iov_len, 20);
261-
assert_eq!(meta.data[2].iov_len, 30);
258+
#[cfg(unix)]
259+
{
260+
assert_eq!(meta.data[0].iov_len, 10);
261+
assert_eq!(meta.data[1].iov_len, 20);
262+
assert_eq!(meta.data[2].iov_len, 30);
263+
}
264+
#[cfg(windows)]
265+
{
266+
assert_eq!(meta.data[0].len, 10);
267+
assert_eq!(meta.data[1].len, 20);
268+
assert_eq!(meta.data[2].len, 30);
269+
}
262270
}
263271

264272
#[test]
@@ -267,8 +275,17 @@ mod tests {
267275
let meta = write_vec_meta(&mut iovec);
268276
assert_eq!(meta.len(), 60);
269277
assert_eq!(meta.data.len(), 3);
270-
assert_eq!(meta.data[0].iov_len, 10);
271-
assert_eq!(meta.data[1].iov_len, 20);
272-
assert_eq!(meta.data[2].iov_len, 30);
278+
#[cfg(unix)]
279+
{
280+
assert_eq!(meta.data[0].iov_len, 10);
281+
assert_eq!(meta.data[1].iov_len, 20);
282+
assert_eq!(meta.data[2].iov_len, 30);
283+
}
284+
#[cfg(windows)]
285+
{
286+
assert_eq!(meta.data[0].len, 10);
287+
assert_eq!(meta.data[1].len, 20);
288+
assert_eq!(meta.data[2].len, 30);
289+
}
273290
}
274291
}

monoio/src/driver/op/read.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use {
99
std::ffi::c_void,
1010
windows_sys::Win32::{
1111
Foundation::TRUE,
12-
Networking::WinSock::{WSAGetLastError, WSARecv, SOCKET_ERROR},
12+
Networking::WinSock::{WSAGetLastError, WSARecv, WSAESHUTDOWN},
1313
Storage::FileSystem::{ReadFile, SetFilePointer, FILE_CURRENT, INVALID_SET_FILE_POINTER},
1414
},
1515
};
@@ -155,9 +155,7 @@ impl<T: IoVecBufMut> Op<ReadVec<T>> {
155155

156156
if let Ok(n) = res {
157157
// Safety: the kernel wrote `n` bytes to the buffer.
158-
unsafe {
159-
buf_vec.set_init(n);
160-
}
158+
unsafe { buf_vec.set_init(n) };
161159
}
162160
(res, buf_vec)
163161
}
@@ -188,26 +186,29 @@ impl<T: IoVecBufMut> OpAble for ReadVec<T> {
188186

189187
#[cfg(all(any(feature = "legacy", feature = "poll-io"), windows))]
190188
fn legacy_call(&mut self) -> io::Result<u32> {
191-
let mut bytes_recved = 0;
189+
let mut nread = 0;
190+
let mut flags = 0;
192191
let ret = unsafe {
193192
WSARecv(
194193
self.fd.raw_socket() as _,
195194
self.buf_vec.write_wsabuf_ptr(),
196-
self.buf_vec.write_wsabuf_len() as _,
197-
&mut bytes_recved,
198-
std::ptr::null_mut(),
195+
self.buf_vec.write_wsabuf_len().min(u32::MAX as usize) as _,
196+
&mut nread,
197+
&mut flags,
199198
std::ptr::null_mut(),
200199
None,
201200
)
202201
};
203202
match ret {
204-
0 => return Err(std::io::ErrorKind::WouldBlock.into()),
205-
SOCKET_ERROR => {
203+
0 => Ok(nread),
204+
_ => {
206205
let error = unsafe { WSAGetLastError() };
207-
return Err(std::io::Error::from_raw_os_error(error));
206+
if error == WSAESHUTDOWN {
207+
Ok(0)
208+
} else {
209+
Err(io::Error::from_raw_os_error(error))
210+
}
208211
}
209-
_ => (),
210212
}
211-
Ok(bytes_recved)
212213
}
213214
}

monoio/src/driver/op/recv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ impl<T: IoBufMut> OpAble for Recv<T> {
114114
recv(
115115
fd as _,
116116
self.buf.write_ptr(),
117-
self.buf.bytes_total() as _,
117+
self.buf.bytes_total().min(i32::MAX as usize) as _,
118118
0
119119
),
120120
PartialOrd::lt,

monoio/src/driver/op/write.rs

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
use std::io;
2+
#[cfg(all(unix, any(feature = "legacy", feature = "poll-io")))]
3+
use std::os::unix::prelude::AsRawFd;
24

35
#[cfg(all(target_os = "linux", feature = "iouring"))]
46
use io_uring::{opcode, types};
57
#[cfg(all(windows, any(feature = "legacy", feature = "poll-io")))]
68
use windows_sys::Win32::{
79
Foundation::TRUE,
8-
Networking::WinSock::{WSAGetLastError, WSASend, SOCKET_ERROR},
10+
Networking::WinSock::WSASend,
911
Storage::FileSystem::{SetFilePointer, WriteFile, FILE_CURRENT, INVALID_SET_FILE_POINTER},
1012
};
11-
#[cfg(all(unix, any(feature = "legacy", feature = "poll-io")))]
12-
use {crate::syscall_u32, std::os::unix::prelude::AsRawFd};
1313

1414
use super::{super::shared_fd::SharedFd, Op, OpAble};
1515
#[cfg(any(feature = "legacy", feature = "poll-io"))]
1616
use crate::driver::ready::Direction;
1717
use crate::{
1818
buf::{IoBuf, IoVecBuf},
19-
BufResult,
19+
syscall_u32, BufResult,
2020
};
2121

2222
pub(crate) struct Write<T> {
@@ -176,25 +176,15 @@ impl<T: IoVecBuf> OpAble for WriteVec<T> {
176176
#[cfg(all(any(feature = "legacy", feature = "poll-io"), windows))]
177177
fn legacy_call(&mut self) -> io::Result<u32> {
178178
let mut bytes_sent = 0;
179-
let ret = unsafe {
180-
WSASend(
181-
self.fd.raw_socket() as _,
182-
self.buf_vec.read_wsabuf_ptr(),
183-
self.buf_vec.read_wsabuf_len() as _,
184-
&mut bytes_sent,
185-
0,
186-
std::ptr::null_mut(),
187-
None,
188-
)
189-
};
190-
match ret {
191-
0 => return Err(std::io::ErrorKind::WouldBlock.into()),
192-
SOCKET_ERROR => {
193-
let error = unsafe { WSAGetLastError() };
194-
return Err(std::io::Error::from_raw_os_error(error));
195-
}
196-
_ => (),
197-
}
198-
Ok(bytes_sent)
179+
syscall_u32!(WSASend(
180+
self.fd.raw_socket() as _,
181+
self.buf_vec.read_wsabuf_ptr(),
182+
self.buf_vec.read_wsabuf_len() as _,
183+
&mut bytes_sent,
184+
0,
185+
std::ptr::null_mut(),
186+
None,
187+
))
188+
.map(|_| bytes_sent)
199189
}
200190
}

monoio/src/driver/scheduled_io.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ impl ScheduledIo {
8181
match slot {
8282
Some(existing) => {
8383
if !existing.will_wake(cx.waker()) {
84-
*existing = cx.waker().clone();
84+
existing.clone_from(cx.waker());
8585
}
8686
}
8787
None => {

monoio/src/driver/shared_fd.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ impl Inner {
495495
}
496496
UringState::Waiting(Some(waker)) => {
497497
if !waker.will_wake(cx.waker()) {
498-
*waker = cx.waker().clone();
498+
waker.clone_from(cx.waker());
499499
}
500500

501501
Poll::Pending

monoio/src/driver/util.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ macro_rules! syscall {
5959
#[macro_export]
6060
macro_rules! syscall_u32 {
6161
($fn: ident ( $($arg: expr),* $(,)* ) ) => {{
62+
#[cfg(windows)]
63+
let res = unsafe { $fn($($arg, )*) };
64+
#[cfg(unix)]
6265
let res = unsafe { libc::$fn($($arg, )*) };
6366
if res < 0 {
6467
Err(std::io::Error::last_os_error())

monoio/tests/tcp_echo.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ use monoio::{
33
net::{TcpListener, TcpStream},
44
};
55

6-
// todo fix these CI in windows
7-
#[cfg(not(windows))]
86
#[monoio::test_all]
97
async fn echo_server() {
108
const ITER: usize = 1024;
@@ -58,10 +56,14 @@ async fn echo_server() {
5856
let (stream, _) = srv.accept().await.unwrap();
5957
let (mut rd, mut wr) = stream.into_split();
6058

61-
let n = io::copy(&mut rd, &mut wr).await.unwrap();
62-
assert_eq!(n, (ITER * (msg.len() + iov_msg.len())) as u64);
59+
// todo fix these CI in windows
60+
#[cfg(not(windows))]
61+
{
62+
let n = io::copy(&mut rd, &mut wr).await.unwrap();
63+
assert_eq!(n, (ITER * (msg.len() + iov_msg.len())) as u64);
6364

64-
assert!(rx.await.is_ok());
65+
assert!(rx.await.is_ok());
66+
}
6567
}
6668

6769
#[monoio::test_all(timer_enabled = true)]

0 commit comments

Comments
 (0)