-
Notifications
You must be signed in to change notification settings - Fork 687
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Add preallocated buffer version of sendmsg #2498
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi, thanks for the patch!
Besides that 2 comments, I hope we can also:
-
Have a test for
sendmsg_pre_alloc()
, you can use the test here, and do some assertions after thesendmsg_pre_alloc()
call. We should add this test intest/sys/test_socket.rs
. -
Document that one can use
sendmsg_pre_alloc()
in the doc ofsendmsg()
:-/// Allocates if cmsgs is nonempty. +/// Allocates if cmsgs is nonempty, use [`sendmsg_pre_alloc()`] if you want to use a pre-allocated buffer.
-
Add a changelog entry for this PR, please take a look at CONTRIBUTING.md on how to do this.
src/sys/socket/mod.rs
Outdated
/// Send data in scatter-gather vectors to a socket, possibly accompanied | ||
/// by ancillary data. Optionally direct the message at the given address, | ||
/// as with sendto. | ||
/// sendmsg_pre_alloc is the same as sendmsg but it accepts a preallocated | ||
/// cmsg buffer vector. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's emphasize that pre_alloc
part and link the original API:
/// Send data in scatter-gather vectors to a socket, possibly accompanied | |
/// by ancillary data. Optionally direct the message at the given address, | |
/// as with sendto. | |
/// sendmsg_pre_alloc is the same as sendmsg but it accepts a preallocated | |
/// cmsg buffer vector. | |
/// `sendmsg_pre_alloc()` is the same as [`sendmsg()`] but it accepts a preallocated | |
/// `cmsg` buffer vector. | |
/// | |
/// Send data in scatter-gather vectors to a socket, possibly accompanied | |
/// by ancillary data. Optionally direct the message at the given address, | |
/// as with sendto. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
btw can I rename the new API as sendmsg_prealloc()
, I feel the underscore there is a little bit of redundant
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
btw can I rename the new API as sendmsg_prealloc()
Sure
flags: MsgFlags, addr: Option<&S>, cmsg_buffer: &mut Vec<u8>) -> Result<usize> | ||
where S: SockaddrLike | ||
{ | ||
let mhdr = pack_mhdr_to_send(&mut cmsg_buffer[..], iov, cmsgs, addr); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need to ensure that cmsg_buffer
has enough length to accommodate cmsgs
before passing it to pack_mhdr_to_send()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The current impl of pack_mhdr_to_send()
requires that cmsg_buffer.len()
equals the length needed by control messages, which may not be true with the pre-alloc API, we need to change this:
Line 2044 in 7d75bbc
(*p).msg_controllen = capacity as _; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we can add a if-condition in sendmsg_pre_alloc()
which will panic if cmsg_buffer.len() != cmsgs .len()
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I kinda think that would be too limited? There should be no issue if cmsg_buffer.len()
> cmsg.len()
, my preferred way is to: check if cmsg_buffer.len()
is greater than or equal to cmsg.len()
, if not, return Err(Errno::ENOBUFS)
. For the pack_mhdr_to_send()
function, we can add another cmsg_len
argument, and document that cmsg_buffer.len()
could be greater than cmsg_len
due to the this sendmsg_pralloc()
function.
For the CI failure, you can allow the lint if necessary:
|
d7696eb
to
7aee29b
Compare
7aee29b
to
1eed9f4
Compare
closes #2457