Skip to content

Commit 004d08a

Browse files
committed
Fix Co-Socket->errCode is not set correctly when using thread context
1 parent 7097eae commit 004d08a

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

include/swoole_coroutine_socket.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,14 @@ class Socket {
430430
inline bool init_sock();
431431
bool init_reactor_socket(int fd);
432432

433+
void check_return_value(ssize_t retval) {
434+
if (retval >= 0) {
435+
set_err(0);
436+
} else if (errCode == 0) {
437+
set_err(errno);
438+
}
439+
}
440+
433441
inline void init_options() {
434442
if (type == SW_SOCK_TCP || type == SW_SOCK_TCP6) {
435443
set_option(IPPROTO_TCP, TCP_NODELAY, 1);

src/coroutine/socket.cc

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,7 @@ bool Socket::check_liveness() {
758758

759759
ssize_t Socket::peek(void *__buf, size_t __n) {
760760
ssize_t retval = socket->peek(__buf, __n, 0);
761-
set_err(retval < 0 ? errno : 0);
761+
check_return_value(retval);
762762
return retval;
763763
}
764764

@@ -783,7 +783,7 @@ ssize_t Socket::recv(void *__buf, size_t __n) {
783783
do {
784784
retval = socket->recv(__buf, __n, 0);
785785
} while (retval < 0 && socket->catch_error(errno) == SW_WAIT && timer.start() && wait_event(SW_EVENT_READ));
786-
set_err(retval < 0 ? errno : 0);
786+
check_return_value(retval);
787787
return retval;
788788
}
789789

@@ -797,7 +797,7 @@ ssize_t Socket::send(const void *__buf, size_t __n) {
797797
retval = socket->send(__buf, __n, 0);
798798
} while (retval < 0 && socket->catch_error(errno) == SW_WAIT && timer.start() &&
799799
wait_event(SW_EVENT_WRITE, &__buf, __n));
800-
set_err(retval < 0 ? errno : 0);
800+
check_return_value(retval);
801801
return retval;
802802
}
803803

@@ -810,7 +810,7 @@ ssize_t Socket::read(void *__buf, size_t __n) {
810810
do {
811811
retval = socket->read(__buf, __n);
812812
} while (retval < 0 && socket->catch_error(errno) == SW_WAIT && timer.start() && wait_event(SW_EVENT_READ));
813-
set_err(retval < 0 ? errno : 0);
813+
check_return_value(retval);
814814
return retval;
815815
}
816816

@@ -860,7 +860,7 @@ ssize_t Socket::write(const void *__buf, size_t __n) {
860860
retval = socket->write((void *) __buf, __n);
861861
} while (retval < 0 && socket->catch_error(errno) == SW_WAIT && timer.start() &&
862862
wait_event(SW_EVENT_WRITE, &__buf, __n));
863-
set_err(retval < 0 ? errno : 0);
863+
check_return_value(retval);
864864
return retval;
865865
}
866866

@@ -873,7 +873,7 @@ ssize_t Socket::readv(network::IOVector *io_vector) {
873873
do {
874874
retval = socket->readv(io_vector);
875875
} while (retval < 0 && socket->catch_error(errno) == SW_WAIT && timer.start() && wait_event(SW_EVENT_READ));
876-
set_err(retval < 0 ? errno : 0);
876+
check_return_value(retval);
877877

878878
return retval;
879879
}
@@ -919,7 +919,7 @@ ssize_t Socket::readv_all(network::IOVector *io_vector) {
919919

920920
recv_barrier = &barrier;
921921
if (timer.start() && wait_event(SW_EVENT_READ)) {
922-
set_err(retval < 0 ? errno : 0);
922+
check_return_value(retval);
923923
}
924924
recv_barrier = nullptr;
925925

@@ -935,7 +935,7 @@ ssize_t Socket::writev(network::IOVector *io_vector) {
935935
do {
936936
retval = socket->writev(io_vector);
937937
} while (retval < 0 && socket->catch_error(errno) == SW_WAIT && timer.start() && wait_event(SW_EVENT_WRITE));
938-
set_err(retval < 0 ? errno : 0);
938+
check_return_value(retval);
939939

940940
return retval;
941941
}
@@ -981,7 +981,7 @@ ssize_t Socket::writev_all(network::IOVector *io_vector) {
981981

982982
send_barrier = &barrier;
983983
if (timer.start() && wait_event(SW_EVENT_WRITE)) {
984-
set_err(retval < 0 ? errno : 0);
984+
check_return_value(retval);
985985
}
986986
send_barrier = nullptr;
987987

@@ -1016,7 +1016,7 @@ ssize_t Socket::recv_all(void *__buf, size_t __n) {
10161016

10171017
recv_barrier = &barrier;
10181018
if (timer.start() && wait_event(SW_EVENT_READ)) {
1019-
set_err(retval < 0 ? errno : 0);
1019+
check_return_value(retval);
10201020
}
10211021
recv_barrier = nullptr;
10221022

@@ -1051,7 +1051,7 @@ ssize_t Socket::send_all(const void *__buf, size_t __n) {
10511051

10521052
send_barrier = &barrier;
10531053
if (timer.start() && wait_event(SW_EVENT_WRITE)) {
1054-
set_err(retval < 0 ? errno : 0);
1054+
check_return_value(retval);
10551055
}
10561056
send_barrier = nullptr;
10571057

@@ -1067,7 +1067,7 @@ ssize_t Socket::recvmsg(struct msghdr *msg, int flags) {
10671067
do {
10681068
retval = ::recvmsg(sock_fd, msg, flags);
10691069
} while (retval < 0 && socket->catch_error(errno) == SW_WAIT && timer.start() && wait_event(SW_EVENT_READ));
1070-
set_err(retval < 0 ? errno : 0);
1070+
check_return_value(retval);
10711071
return retval;
10721072
}
10731073

@@ -1083,7 +1083,7 @@ ssize_t Socket::sendmsg(const struct msghdr *msg, int flags) {
10831083
do {
10841084
retval = ::sendmsg(sock_fd, msg, flags);
10851085
} while (retval < 0 && socket->catch_error(errno) == SW_WAIT && timer.start() && wait_event(SW_EVENT_WRITE));
1086-
set_err(retval < 0 ? errno : 0);
1086+
check_return_value(retval);
10871087
return retval;
10881088
}
10891089

@@ -1391,7 +1391,7 @@ ssize_t Socket::sendto(const std::string &host, int port, const void *__buf, siz
13911391
swTraceLog(SW_TRACE_SOCKET, "sendto %ld/%ld bytes, errno=%d", retval, __n, errno);
13921392
} while (retval < 0 && (errno == EINTR || (socket->catch_error(errno) == SW_WAIT && timer.start() &&
13931393
wait_event(SW_EVENT_WRITE, &__buf, __n))));
1394-
set_err(retval < 0 ? errno : 0);
1394+
check_return_value(retval);
13951395
}
13961396

13971397
return retval;
@@ -1416,7 +1416,7 @@ ssize_t Socket::recvfrom(void *__buf, size_t __n, struct sockaddr *_addr, sockle
14161416
swTraceLog(SW_TRACE_SOCKET, "recvfrom %ld/%ld bytes, errno=%d", retval, __n, errno);
14171417
} while (retval < 0 && ((errno == EINTR) ||
14181418
(socket->catch_error(errno) == SW_WAIT && timer.start() && wait_event(SW_EVENT_READ))));
1419-
set_err(retval < 0 ? errno : 0);
1419+
check_return_value(retval);
14201420
return retval;
14211421
}
14221422

0 commit comments

Comments
 (0)