From 701e207702945705c0f8a94babf09d1fe8c2b3da Mon Sep 17 00:00:00 2001 From: wu-changsheng Date: Mon, 31 Oct 2022 17:37:08 +0800 Subject: [PATCH 4/7] add usleep when write_ring is busy --- src/lstack/core/lstack_lwip.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c index 00afc75..3a1eb81 100644 --- a/src/lstack/core/lstack_lwip.c +++ b/src/lstack/core/lstack_lwip.c @@ -282,16 +282,11 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) GAZELLE_RETURN(ENOTCONN); } - uint32_t free_count = gazelle_ring_readable_count(sock->send_ring); - if (free_count == 0) { - return 0; - } - struct pbuf *pbuf = NULL; ssize_t send_len = 0; uint32_t send_pkt = 0; - while (send_len < len && send_pkt < free_count) { + while (send_len < len) { if (sock->send_lastdata) { pbuf = sock->send_lastdata; } else { @@ -322,6 +317,10 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len) sock->wakeup->stat.app_write_cnt += send_pkt; } + if (send_len == 0) { + /* 100: give up cpu to other threads, when send_ring is full */ + usleep(100); + } return send_len; } -- 2.23.0