加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0083-fix-close-can-t-exit.patch 5.05 KB
一键复制 编辑 原始数据 按行查看 历史
yinbin6 提交于 2023-12-16 15:16 . sync fix EPOLLIN event error
From f4abd3b3fd5004405cb186981b93f5d40e4648db Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Sun, 10 Dec 2023 17:47:56 +0800
Subject: [PATCH] fix close can't exit
---
src/lstack/core/lstack_lwip.c | 12 ++++++++----
src/lstack/core/lstack_protocol_stack.c | 25 +++++++++++++++----------
src/lstack/core/lstack_thread_rpc.c | 6 +++---
src/lstack/include/lstack_lwip.h | 4 ++--
4 files changed, 28 insertions(+), 19 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index c4b1ebc..73a6f12 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -646,14 +646,18 @@ bool do_lwip_replenish_sendring(struct protocol_stack *stack, struct lwip_sock *
return replenish_again;
}
-bool do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock,
- size_t len, int32_t flags)
+int do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock,
+ size_t len, int32_t flags)
{
+ ssize_t ret;
/* send all send_ring, so len set lwip send max. */
if (NETCONN_IS_UDP(sock)) {
- (void)lwip_send(fd, sock, len, flags);
+ ret = lwip_send(fd, sock, len, flags);
} else {
- (void)lwip_send(fd, sock, UINT16_MAX, flags);
+ ret = lwip_send(fd, sock, UINT16_MAX, flags);
+ }
+ if (ret < 0 && (errno == ENOTCONN || errno == ECONNRESET || errno == ECONNABORTED)) {
+ return -1;
}
return do_lwip_replenish_sendring(stack, sock);
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index f61e7a8..8dbd9ad 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -699,10 +699,10 @@ void stack_close(struct rpc_msg *msg)
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
struct lwip_sock *sock = get_socket(fd);
- if (sock && NETCONN_IS_DATAOUT(sock)) {
+ if (sock && __atomic_load_n(&sock->call_num, __ATOMIC_ACQUIRE) > 0) {
msg->recall_flag = 1;
rpc_call(&stack->rpc_queue, msg); /* until stack_send recall finish */
- return;
+ return;
}
msg->result = lwip_close(fd);
@@ -860,27 +860,32 @@ void stack_send(struct rpc_msg *msg)
int32_t fd = msg->args[MSG_ARG_0].i;
size_t len = msg->args[MSG_ARG_1].size;
struct protocol_stack *stack = (struct protocol_stack *)msg->args[MSG_ARG_3].p;
- bool replenish_again;
+ int replenish_again;
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
msg->result = -1;
LSTACK_LOG(ERR, LSTACK, "get sock error! fd=%d, len=%ld\n", fd, len);
- rpc_msg_free(msg);
+ __sync_fetch_and_sub(&sock->call_num, 1);
return;
}
replenish_again = do_lwip_send(stack, sock->conn->socket, sock, len, 0);
- __sync_fetch_and_sub(&sock->call_num, 1);
- if (!NETCONN_IS_DATAOUT(sock) && !replenish_again) {
+ if (replenish_again < 0) {
+ __sync_fetch_and_sub(&sock->call_num, 1);
return;
- } else {
- if (__atomic_load_n(&sock->call_num, __ATOMIC_ACQUIRE) == 0) {
- msg->recall_flag = 1;
+ }
+
+ if (NETCONN_IS_DATAOUT(sock) || replenish_again > 0) {
+ if (__atomic_load_n(&sock->call_num, __ATOMIC_ACQUIRE) == 1) {
+ msg->recall_flag = 1;
rpc_call(&stack->rpc_queue, msg);
- __sync_fetch_and_add(&sock->call_num, 1);
+ return;
}
}
+
+ __sync_fetch_and_sub(&sock->call_num, 1);
+ return;
}
/* any protocol stack thread receives arp packet and sync it to other threads so that it can have the arp table */
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 4aceee6..0b2a62a 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -109,14 +109,14 @@ void poll_rpc_msg(struct protocol_stack *stack, uint32_t max_num)
}
if (!msg->recall_flag) {
- if (msg->sync_flag) {
+ if (msg->sync_flag) {
pthread_spin_unlock(&msg->lock);
} else {
rpc_msg_free(msg);
}
} else {
- msg->recall_flag = 0;
- }
+ msg->recall_flag = 0;
+ }
}
}
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index 4a13204..a11489c 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -50,8 +50,8 @@ ssize_t do_lwip_read_from_stack(int32_t fd, void *buf, size_t len, int32_t flags
void do_lwip_read_recvlist(struct protocol_stack *stack, uint32_t max_num);
void do_lwip_add_recvlist(int32_t fd);
-bool do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock,
- size_t len, int32_t flags);
+int do_lwip_send(struct protocol_stack *stack, int32_t fd, struct lwip_sock *sock,
+ size_t len, int32_t flags);
uint32_t do_lwip_get_conntable(struct gazelle_stat_lstack_conn_info *conn, uint32_t max_num);
uint32_t do_lwip_get_connnum(void);
--
2.27.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化