So I got this function (from here):
pub fn poll_recv(&mut self, cx: &mut Context<'_>, buf: &mut [u8]) -> Poll<KcpResult<usize>> {
loop {
// Consumes all data in buffer
if self.recv_buffer_pos < self.recv_buffer_cap {
let remaining = self.recv_buffer_cap - self.recv_buffer_pos;
let copy_length = remaining.min(buf.len());
buf[..copy_length]
.copy_from_slice(&self.recv_buffer[self.recv_buffer_pos..self.recv_buffer_pos + copy_length]);
self.recv_buffer_pos += copy_length;
return Ok(copy_length).into();
}
// Mutex doesn't have poll_lock, spinning on it.
let mut kcp = self.session.kcp_socket().lock();
// Try to read from KCP
// 1. Read directly with user provided `buf`
let peek_size = kcp.peek_size().unwrap_or(0);
// 1.1. User's provided buffer is larger than available buffer's size
if peek_size > 0 && peek_size <= buf.len() {
match ready!(kcp.poll_recv(cx, buf)) {
Ok(n) => {
trace!("[CLIENT] recv directly {} bytes", n);
return Ok(n).into();
}
Err(KcpError::UserBufTooSmall) => {}
Err(err) => return Err(err).into(),
}
}
// 2. User `buf` too small, read to recv_buffer
let required_size = peek_size;
if self.recv_buffer.len() < required_size {
self.recv_buffer.resize(required_size, 0);
}
match ready!(kcp.poll_recv(cx, &mut self.recv_buffer)) {
Ok(0) => return Ok(0).into(),
Ok(n) => {
trace!("[CLIENT] recv buffered {} bytes", n);
self.recv_buffer_pos = 0;
self.recv_buffer_cap = n;
}
Err(err) => return Err(err).into(),
}
}
}
I tried to debug the code and apprently the match
on match ready!(kcp.poll_recv(cx, &mut self.recv_buffer))
does not go no any of the branch.
In fact, there is a loop
there, and for whatever reason, the macro ready!
return; i.e break the loop.
So what does that macro actually do, and what is the point of having that match
branch with the ready!
macro?
Thank you.