Skip to content

Commit 2140ea5

Browse files
committed
refactor read/pread/recvmsg syscall
1 parent 8584ae7 commit 2140ea5

File tree

10 files changed

+271
-333
lines changed

10 files changed

+271
-333
lines changed

open-coroutine-core/src/syscall/facade.rs

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,6 @@ cfg_if::cfg_if! {
2121
}
2222
}
2323

24-
/// read
25-
26-
#[must_use]
27-
pub extern "C" fn read(
28-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t) -> ssize_t>,
29-
fd: c_int,
30-
buf: *mut c_void,
31-
count: size_t,
32-
) -> ssize_t {
33-
CHAIN.read(fn_ptr, fd, buf, count)
34-
}
35-
36-
#[must_use]
37-
pub extern "C" fn pread(
38-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t, off_t) -> ssize_t>,
39-
fd: c_int,
40-
buf: *mut c_void,
41-
count: size_t,
42-
offset: off_t,
43-
) -> ssize_t {
44-
CHAIN.pread(fn_ptr, fd, buf, count, offset)
45-
}
46-
47-
#[must_use]
48-
pub extern "C" fn recvmsg(
49-
fn_ptr: Option<&extern "C" fn(c_int, *mut msghdr, c_int) -> ssize_t>,
50-
fd: c_int,
51-
msg: *mut msghdr,
52-
flags: c_int,
53-
) -> ssize_t {
54-
CHAIN.recvmsg(fn_ptr, fd, msg, flags)
55-
}
56-
5724
/// write
5825
5926
#[must_use]

open-coroutine-core/src/syscall/io_uring.rs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -25,37 +25,6 @@ macro_rules! impl_io_uring {
2525
}
2626

2727
impl<I: UnixSyscall> UnixSyscall for IoUringLinuxSyscall<I> {
28-
extern "C" fn read(
29-
&self,
30-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t) -> ssize_t>,
31-
fd: c_int,
32-
buf: *mut c_void,
33-
count: size_t,
34-
) -> ssize_t {
35-
impl_io_uring!(self, read, fn_ptr, fd, buf, count)
36-
}
37-
38-
extern "C" fn pread(
39-
&self,
40-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t, off_t) -> ssize_t>,
41-
fd: c_int,
42-
buf: *mut c_void,
43-
count: size_t,
44-
offset: off_t,
45-
) -> ssize_t {
46-
impl_io_uring!(self, pread, fn_ptr, fd, buf, count, offset)
47-
}
48-
49-
extern "C" fn recvmsg(
50-
&self,
51-
fn_ptr: Option<&extern "C" fn(c_int, *mut msghdr, c_int) -> ssize_t>,
52-
fd: c_int,
53-
msg: *mut msghdr,
54-
flags: c_int,
55-
) -> ssize_t {
56-
impl_io_uring!(self, recvmsg, fn_ptr, fd, msg, flags)
57-
}
58-
5928
extern "C" fn sendto(
6029
&self,
6130
fn_ptr: Option<

open-coroutine-core/src/syscall/mod.rs

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -28,33 +28,6 @@ pub use facade::*;
2828

2929
#[cfg(unix)]
3030
pub trait UnixSyscall {
31-
/// read
32-
33-
extern "C" fn read(
34-
&self,
35-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t) -> ssize_t>,
36-
fd: c_int,
37-
buf: *mut c_void,
38-
count: size_t,
39-
) -> ssize_t;
40-
41-
extern "C" fn pread(
42-
&self,
43-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t, off_t) -> ssize_t>,
44-
fd: c_int,
45-
buf: *mut c_void,
46-
count: size_t,
47-
offset: off_t,
48-
) -> ssize_t;
49-
50-
extern "C" fn recvmsg(
51-
&self,
52-
fn_ptr: Option<&extern "C" fn(c_int, *mut msghdr, c_int) -> ssize_t>,
53-
fd: c_int,
54-
msg: *mut msghdr,
55-
flags: c_int,
56-
) -> ssize_t;
57-
5831
/// write
5932
6033
extern "C" fn sendto(

open-coroutine-core/src/syscall/nio.rs

Lines changed: 0 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -14,53 +14,6 @@ pub struct NioLinuxSyscall<I: UnixSyscall> {
1414
inner: I,
1515
}
1616

17-
macro_rules! impl_expected_read_hook {
18-
( $invoker: expr, $syscall: ident, $fn_ptr: expr, $socket:expr, $buffer:expr, $length:expr, $($arg: expr),* $(,)* ) => {{
19-
let socket = $socket;
20-
let blocking = $crate::syscall::common::is_blocking(socket);
21-
if blocking {
22-
$crate::syscall::common::set_non_blocking(socket);
23-
}
24-
let mut received = 0;
25-
let mut r = 0;
26-
while received < $length {
27-
r = $invoker.$syscall(
28-
$fn_ptr,
29-
$socket,
30-
($buffer as usize + received) as *mut c_void,
31-
$length - received,
32-
$($arg, )*
33-
);
34-
if r != -1 {
35-
$crate::syscall::common::reset_errno();
36-
received += r as size_t;
37-
if received >= $length || r == 0 {
38-
r = received as ssize_t;
39-
break;
40-
}
41-
}
42-
let error_kind = std::io::Error::last_os_error().kind();
43-
if error_kind == std::io::ErrorKind::WouldBlock {
44-
//wait read event
45-
if $crate::net::event_loop::EventLoops::wait_read_event(
46-
socket,
47-
Some(std::time::Duration::from_millis(10)),
48-
)
49-
.is_err()
50-
{
51-
break;
52-
}
53-
} else if error_kind != std::io::ErrorKind::Interrupted {
54-
break;
55-
}
56-
}
57-
if blocking {
58-
$crate::syscall::common::set_blocking(socket);
59-
}
60-
r
61-
}};
62-
}
63-
6417
macro_rules! impl_expected_write_hook {
6518
( $invoker: expr, $syscall: ident, $fn_ptr: expr, $socket:expr, $buffer:expr, $length:expr, $($arg: expr),* $(,)* ) => {{
6619
let socket = $socket;
@@ -109,125 +62,6 @@ macro_rules! impl_expected_write_hook {
10962
}
11063

11164
impl<I: UnixSyscall> UnixSyscall for NioLinuxSyscall<I> {
112-
extern "C" fn read(
113-
&self,
114-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t) -> ssize_t>,
115-
fd: c_int,
116-
buf: *mut c_void,
117-
count: size_t,
118-
) -> ssize_t {
119-
impl_expected_read_hook!(self.inner, read, fn_ptr, fd, buf, count,)
120-
}
121-
122-
extern "C" fn pread(
123-
&self,
124-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t, off_t) -> ssize_t>,
125-
fd: c_int,
126-
buf: *mut c_void,
127-
count: size_t,
128-
offset: off_t,
129-
) -> ssize_t {
130-
impl_expected_read_hook!(self.inner, pread, fn_ptr, fd, buf, count, offset)
131-
}
132-
133-
extern "C" fn recvmsg(
134-
&self,
135-
fn_ptr: Option<&extern "C" fn(c_int, *mut msghdr, c_int) -> ssize_t>,
136-
fd: c_int,
137-
msg: *mut msghdr,
138-
flags: c_int,
139-
) -> ssize_t {
140-
let blocking = is_blocking(fd);
141-
if blocking {
142-
set_non_blocking(fd);
143-
}
144-
let msghdr = unsafe { *msg };
145-
let mut vec = std::collections::VecDeque::from(unsafe {
146-
Vec::from_raw_parts(
147-
msghdr.msg_iov,
148-
msghdr.msg_iovlen as usize,
149-
msghdr.msg_iovlen as usize,
150-
)
151-
});
152-
let mut length = 0;
153-
let mut pices = std::collections::VecDeque::new();
154-
for iovec in &vec {
155-
length += iovec.iov_len;
156-
pices.push_back(length);
157-
}
158-
let mut received = 0;
159-
let mut r = 0;
160-
while received < length {
161-
// find from-index
162-
let mut from_index = 0;
163-
for (i, v) in pices.iter().enumerate() {
164-
if received < *v {
165-
from_index = i;
166-
break;
167-
}
168-
}
169-
// calculate offset
170-
let current_received_offset = if from_index > 0 {
171-
received.saturating_sub(pices[from_index.saturating_sub(1)])
172-
} else {
173-
received
174-
};
175-
// remove already received
176-
for _ in 0..from_index {
177-
_ = vec.pop_front();
178-
_ = pices.pop_front();
179-
}
180-
// build syscall args
181-
vec[0] = iovec {
182-
iov_base: (vec[0].iov_base as usize + current_received_offset) as *mut c_void,
183-
iov_len: vec[0].iov_len - current_received_offset,
184-
};
185-
cfg_if::cfg_if! {
186-
if #[cfg(any(
187-
target_os = "linux",
188-
target_os = "l4re",
189-
target_os = "android",
190-
target_os = "emscripten"
191-
))] {
192-
let len = vec.len();
193-
} else {
194-
let len = c_int::try_from(vec.len()).unwrap();
195-
}
196-
}
197-
let mut new_msg = msghdr {
198-
msg_name: msghdr.msg_name,
199-
msg_namelen: msghdr.msg_namelen,
200-
msg_iov: vec.get_mut(0).unwrap(),
201-
msg_iovlen: len,
202-
msg_control: msghdr.msg_control,
203-
msg_controllen: msghdr.msg_controllen,
204-
msg_flags: msghdr.msg_flags,
205-
};
206-
r = self.inner.recvmsg(fn_ptr, fd, &mut new_msg, flags);
207-
if r != -1 {
208-
reset_errno();
209-
received += r as usize;
210-
if received >= length || r == 0 {
211-
r = received as ssize_t;
212-
break;
213-
}
214-
}
215-
let error_kind = std::io::Error::last_os_error().kind();
216-
if error_kind == std::io::ErrorKind::WouldBlock {
217-
//wait read event
218-
if EventLoops::wait_read_event(fd, Some(Duration::from_millis(10))).is_err() {
219-
break;
220-
}
221-
} else if error_kind != std::io::ErrorKind::Interrupted {
222-
break;
223-
}
224-
}
225-
if blocking {
226-
set_blocking(fd);
227-
}
228-
r
229-
}
230-
23165
extern "C" fn sendto(
23266
&self,
23367
fn_ptr: Option<

open-coroutine-core/src/syscall/raw.rs

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,51 +10,6 @@ use std::ffi::{c_int, c_void};
1010
pub struct RawLinuxSyscall {}
1111

1212
impl UnixSyscall for RawLinuxSyscall {
13-
/// read
14-
15-
extern "C" fn read(
16-
&self,
17-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t) -> ssize_t>,
18-
fd: c_int,
19-
buf: *mut c_void,
20-
count: size_t,
21-
) -> ssize_t {
22-
if let Some(f) = fn_ptr {
23-
(f)(fd, buf, count)
24-
} else {
25-
unsafe { libc::read(fd, buf, count) }
26-
}
27-
}
28-
29-
extern "C" fn pread(
30-
&self,
31-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t, off_t) -> ssize_t>,
32-
fd: c_int,
33-
buf: *mut c_void,
34-
count: size_t,
35-
offset: off_t,
36-
) -> ssize_t {
37-
if let Some(f) = fn_ptr {
38-
(f)(fd, buf, count, offset)
39-
} else {
40-
unsafe { libc::pread(fd, buf, count, offset) }
41-
}
42-
}
43-
44-
extern "C" fn recvmsg(
45-
&self,
46-
fn_ptr: Option<&extern "C" fn(c_int, *mut msghdr, c_int) -> ssize_t>,
47-
fd: c_int,
48-
msg: *mut msghdr,
49-
flags: c_int,
50-
) -> ssize_t {
51-
if let Some(f) = fn_ptr {
52-
(f)(fd, msg, flags)
53-
} else {
54-
unsafe { libc::recvmsg(fd, msg, flags) }
55-
}
56-
}
57-
5813
/// write
5914
6015
extern "C" fn sendto(

open-coroutine-core/src/syscall/state.rs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -35,37 +35,6 @@ macro_rules! syscall_state {
3535
}
3636

3737
impl<I: UnixSyscall> UnixSyscall for StateLinuxSyscall<I> {
38-
extern "C" fn read(
39-
&self,
40-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t) -> ssize_t>,
41-
fd: c_int,
42-
buf: *mut c_void,
43-
count: size_t,
44-
) -> ssize_t {
45-
syscall_state!(self, read, fn_ptr, fd, buf, count)
46-
}
47-
48-
extern "C" fn pread(
49-
&self,
50-
fn_ptr: Option<&extern "C" fn(c_int, *mut c_void, size_t, off_t) -> ssize_t>,
51-
fd: c_int,
52-
buf: *mut c_void,
53-
count: size_t,
54-
offset: off_t,
55-
) -> ssize_t {
56-
syscall_state!(self, pread, fn_ptr, fd, buf, count, offset)
57-
}
58-
59-
extern "C" fn recvmsg(
60-
&self,
61-
fn_ptr: Option<&extern "C" fn(c_int, *mut msghdr, c_int) -> ssize_t>,
62-
fd: c_int,
63-
msg: *mut msghdr,
64-
flags: c_int,
65-
) -> ssize_t {
66-
syscall_state!(self, recvmsg, fn_ptr, fd, msg, flags)
67-
}
68-
6938
extern "C" fn sendto(
7039
&self,
7140
fn_ptr: Option<

0 commit comments

Comments
 (0)