From 4bb883b989bd5dda7efb3c8061bb46e932bc64d0 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 24 Feb 2021 17:02:23 +0800 Subject: [PATCH] report write error --- skynet-src/socket_server.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index 07db9d8b..17e4116f 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -677,12 +677,18 @@ _failed_getaddrinfo: return SOCKET_ERR; } -static void +static int close_write(struct socket_server *ss, struct socket *s, struct socket_lock *l, struct socket_message *result) { if (s->closing) { force_close(ss,s,l,result); + return SOCKET_CLOSE; } else { ATOM_STORE(&s->type, SOCKET_TYPE_HALFCLOSE_WRITE); + result->id = s->id; + result->ud = 0; + result->opaque = s->opaque; + result->data = strerror(errno); + return SOCKET_ERR; } } @@ -699,8 +705,7 @@ send_list_tcp(struct socket_server *ss, struct socket *s, struct wb_list *list, case AGAIN_WOULDBLOCK: return -1; } - close_write(ss, s, l, result); - return -1; + return close_write(ss, s, l, result); } stat_write(ss,s,(int)sz); s->wb_size -= sz; @@ -836,19 +841,24 @@ static int send_buffer_(struct socket_server *ss, struct socket *s, struct socket_lock *l, struct socket_message *result) { assert(!list_uncomplete(&s->low)); // step 1 - if (send_list(ss,s,&s->high,l,result) == SOCKET_CLOSE) { - return SOCKET_CLOSE; - } - if (ATOM_LOAD(&s->type) == SOCKET_TYPE_HALFCLOSE_WRITE) { + int ret = send_list(ss,s,&s->high,l,result); + if (ret != -1) { + if (ret == SOCKET_ERR) { + // HALFCLOSE_WRITE + return SOCKET_ERR; + } + // SOCKET_CLOSE return -1; } if (s->high.head == NULL) { // step 2 if (s->low.head != NULL) { - if (send_list(ss,s,&s->low,l,result) == SOCKET_CLOSE) { - return SOCKET_CLOSE; - } - if (ATOM_LOAD(&s->type) == SOCKET_TYPE_HALFCLOSE_WRITE) { + int ret = send_list(ss,s,&s->high,l,result); + if (ret != -1) { + if (ret == SOCKET_ERR) { + // HALFCLOSE_WRITE + return SOCKET_ERR; + } return -1; } // step 3