vfs/lwip: notify I/O progress on sent packets
Incoming ACK packets for sent data packets may be the only unblocker for suspended write/send loops. This patch informs VFS users about I/O of VFS handle on successfully sent packets.
This commit is contained in:
parent
a62fce8dc5
commit
504539ad1e
|
@ -107,7 +107,7 @@ extern "C" {
|
||||||
struct pbuf *p, err_t err);
|
struct pbuf *p, err_t err);
|
||||||
static err_t tcp_delayed_recv_callback(void *arg, struct tcp_pcb *tpcb,
|
static err_t tcp_delayed_recv_callback(void *arg, struct tcp_pcb *tpcb,
|
||||||
struct pbuf *p, err_t err);
|
struct pbuf *p, err_t err);
|
||||||
/* static err_t tcp_sent_callback(void *arg, struct tcp_pcb *tpcb, u16_t len); */
|
static err_t tcp_sent_callback(void *arg, struct tcp_pcb *tpcb, u16_t len);
|
||||||
static void tcp_err_callback(void *arg, err_t err);
|
static void tcp_err_callback(void *arg, err_t err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -486,9 +486,13 @@ Lwip::Read_result Lwip::Lwip_file_handle::read(char *dst, file_size count,
|
||||||
Lwip::Write_result Lwip::Lwip_file_handle::write(char const *src, file_size count,
|
Lwip::Write_result Lwip::Lwip_file_handle::write(char const *src, file_size count,
|
||||||
file_size &out_count)
|
file_size &out_count)
|
||||||
{
|
{
|
||||||
return (socket)
|
Write_result result = Write_result::WRITE_ERR_INVALID;
|
||||||
? socket->write(*this, src, count, out_count)
|
if (socket) {
|
||||||
: Write_result::WRITE_ERR_INVALID;
|
result = socket->write(*this, src, count, out_count);
|
||||||
|
if (result == Write_result::WRITE_ERR_WOULD_BLOCK && !_io_progress_waiter.enqueued())
|
||||||
|
socket->io_progress_queue.enqueue(_io_progress_waiter);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Lwip::Lwip_file_handle::notify_read_ready()
|
bool Lwip::Lwip_file_handle::notify_read_ready()
|
||||||
|
@ -1142,10 +1146,7 @@ class Lwip::Tcp_socket_dir final :
|
||||||
tcp_arg(_pcb, this);
|
tcp_arg(_pcb, this);
|
||||||
|
|
||||||
tcp_recv(_pcb, tcp_recv_callback);
|
tcp_recv(_pcb, tcp_recv_callback);
|
||||||
|
tcp_sent(_pcb, tcp_sent_callback);
|
||||||
/* Disabled, do not track acknowledgements */
|
|
||||||
/* tcp_sent(_pcb, tcp_sent_callback); */
|
|
||||||
|
|
||||||
tcp_err(_pcb, tcp_err_callback);
|
tcp_err(_pcb, tcp_err_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1648,9 +1649,9 @@ err_t tcp_delayed_recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *buf
|
||||||
/**
|
/**
|
||||||
* This would be the ACK callback, we could defer sync completion
|
* This would be the ACK callback, we could defer sync completion
|
||||||
* until then, but performance is expected to be unacceptable.
|
* until then, but performance is expected to be unacceptable.
|
||||||
*
|
*/
|
||||||
static
|
static
|
||||||
err_t tcp_sent_callback(void *arg, struct tcp_pcb*, u16_t len)
|
err_t tcp_sent_callback(void *arg, struct tcp_pcb *pcb, u16_t)
|
||||||
{
|
{
|
||||||
if (!arg) {
|
if (!arg) {
|
||||||
tcp_abort(pcb);
|
tcp_abort(pcb);
|
||||||
|
@ -1658,12 +1659,9 @@ err_t tcp_sent_callback(void *arg, struct tcp_pcb*, u16_t len)
|
||||||
}
|
}
|
||||||
|
|
||||||
Lwip::Tcp_socket_dir *socket_dir = static_cast<Lwip::Tcp_socket_dir *>(arg);
|
Lwip::Tcp_socket_dir *socket_dir = static_cast<Lwip::Tcp_socket_dir *>(arg);
|
||||||
socket_dir->pending_ack -= len;
|
|
||||||
socket_dir->process_io();
|
socket_dir->process_io();
|
||||||
socket_dir->process_write_ready();
|
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
|
|
Loading…
Reference in New Issue
Block a user