report write error

This commit is contained in:
Cloud Wu
2021-02-24 17:02:23 +08:00
parent 6a8ca29d99
commit 4bb883b989

View File

@@ -677,12 +677,18 @@ _failed_getaddrinfo:
return SOCKET_ERR; return SOCKET_ERR;
} }
static void static int
close_write(struct socket_server *ss, struct socket *s, struct socket_lock *l, struct socket_message *result) { close_write(struct socket_server *ss, struct socket *s, struct socket_lock *l, struct socket_message *result) {
if (s->closing) { if (s->closing) {
force_close(ss,s,l,result); force_close(ss,s,l,result);
return SOCKET_CLOSE;
} else { } else {
ATOM_STORE(&s->type, SOCKET_TYPE_HALFCLOSE_WRITE); 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: case AGAIN_WOULDBLOCK:
return -1; return -1;
} }
close_write(ss, s, l, result); return close_write(ss, s, l, result);
return -1;
} }
stat_write(ss,s,(int)sz); stat_write(ss,s,(int)sz);
s->wb_size -= 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) { send_buffer_(struct socket_server *ss, struct socket *s, struct socket_lock *l, struct socket_message *result) {
assert(!list_uncomplete(&s->low)); assert(!list_uncomplete(&s->low));
// step 1 // step 1
if (send_list(ss,s,&s->high,l,result) == SOCKET_CLOSE) { int ret = send_list(ss,s,&s->high,l,result);
return SOCKET_CLOSE; if (ret != -1) {
if (ret == SOCKET_ERR) {
// HALFCLOSE_WRITE
return SOCKET_ERR;
} }
if (ATOM_LOAD(&s->type) == SOCKET_TYPE_HALFCLOSE_WRITE) { // SOCKET_CLOSE
return -1; return -1;
} }
if (s->high.head == NULL) { if (s->high.head == NULL) {
// step 2 // step 2
if (s->low.head != NULL) { if (s->low.head != NULL) {
if (send_list(ss,s,&s->low,l,result) == SOCKET_CLOSE) { int ret = send_list(ss,s,&s->high,l,result);
return SOCKET_CLOSE; if (ret != -1) {
if (ret == SOCKET_ERR) {
// HALFCLOSE_WRITE
return SOCKET_ERR;
} }
if (ATOM_LOAD(&s->type) == SOCKET_TYPE_HALFCLOSE_WRITE) {
return -1; return -1;
} }
// step 3 // step 3