diff options
author | irungentoo <irungentoo@gmail.com> | 2015-02-23 14:46:38 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2015-02-23 14:46:38 -0500 |
commit | 972e6a9ac5ec398c145e13491fee490de5245342 (patch) | |
tree | 26ba2fe0d29223444f40235f5bf0dbe876b7f72f /toxcore/TCP_server.c | |
parent | 085f90432f352ce2dfb31e0a7fbb83efa6b2f5db (diff) |
Use edge trigger on listen socket in TCP_Server.
This may or may not improve things.
Diffstat (limited to 'toxcore/TCP_server.c')
-rw-r--r-- | toxcore/TCP_server.c | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/toxcore/TCP_server.c b/toxcore/TCP_server.c index e5a154ce..e85a506d 100644 --- a/toxcore/TCP_server.c +++ b/toxcore/TCP_server.c | |||
@@ -878,26 +878,27 @@ static int confirm_TCP_connection(TCP_Server *TCP_server, TCP_Secure_Connection | |||
878 | return index; | 878 | return index; |
879 | } | 879 | } |
880 | 880 | ||
881 | /* return 1 on success | 881 | /* return index on success |
882 | * return 0 on failure | 882 | * return -1 on failure |
883 | */ | 883 | */ |
884 | static int accept_connection(TCP_Server *TCP_server, sock_t sock) | 884 | static int accept_connection(TCP_Server *TCP_server, sock_t sock) |
885 | { | 885 | { |
886 | if (!sock_valid(sock)) | 886 | if (!sock_valid(sock)) |
887 | return 0; | 887 | return -1; |
888 | 888 | ||
889 | if (!set_socket_nonblock(sock)) { | 889 | if (!set_socket_nonblock(sock)) { |
890 | kill_sock(sock); | 890 | kill_sock(sock); |
891 | return 0; | 891 | return -1; |
892 | } | 892 | } |
893 | 893 | ||
894 | if (!set_socket_nosigpipe(sock)) { | 894 | if (!set_socket_nosigpipe(sock)) { |
895 | kill_sock(sock); | 895 | kill_sock(sock); |
896 | return 0; | 896 | return -1; |
897 | } | 897 | } |
898 | 898 | ||
899 | TCP_Secure_Connection *conn = | 899 | uint16_t index = TCP_server->incomming_connection_queue_index % MAX_INCOMMING_CONNECTIONS; |
900 | &TCP_server->incomming_connection_queue[TCP_server->incomming_connection_queue_index % MAX_INCOMMING_CONNECTIONS]; | 900 | |
901 | TCP_Secure_Connection *conn = &TCP_server->incomming_connection_queue[index]; | ||
901 | 902 | ||
902 | if (conn->status != TCP_STATUS_NO_STATUS) | 903 | if (conn->status != TCP_STATUS_NO_STATUS) |
903 | kill_TCP_connection(conn); | 904 | kill_TCP_connection(conn); |
@@ -907,7 +908,7 @@ static int accept_connection(TCP_Server *TCP_server, sock_t sock) | |||
907 | conn->next_packet_length = 0; | 908 | conn->next_packet_length = 0; |
908 | 909 | ||
909 | ++TCP_server->incomming_connection_queue_index; | 910 | ++TCP_server->incomming_connection_queue_index; |
910 | return 1; | 911 | return index; |
911 | } | 912 | } |
912 | 913 | ||
913 | static sock_t new_listening_TCP_socket(int family, uint16_t port) | 914 | static sock_t new_listening_TCP_socket(int family, uint16_t port) |
@@ -918,11 +919,7 @@ static sock_t new_listening_TCP_socket(int family, uint16_t port) | |||
918 | return ~0; | 919 | return ~0; |
919 | } | 920 | } |
920 | 921 | ||
921 | #ifndef TCP_SERVER_USE_EPOLL | ||
922 | int ok = set_socket_nonblock(sock); | 922 | int ok = set_socket_nonblock(sock); |
923 | #else | ||
924 | int ok = 1; | ||
925 | #endif | ||
926 | 923 | ||
927 | if (ok && family == AF_INET6) { | 924 | if (ok && family == AF_INET6) { |
928 | ok = set_socket_dualstack(sock); | 925 | ok = set_socket_dualstack(sock); |
@@ -989,7 +986,7 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin | |||
989 | 986 | ||
990 | if (sock_valid(sock)) { | 987 | if (sock_valid(sock)) { |
991 | #ifdef TCP_SERVER_USE_EPOLL | 988 | #ifdef TCP_SERVER_USE_EPOLL |
992 | ev.events = EPOLLIN; | 989 | ev.events = EPOLLIN | EPOLLET; |
993 | ev.data.u64 = sock | ((uint64_t)TCP_SOCKET_LISTENING << 32); | 990 | ev.data.u64 = sock | ((uint64_t)TCP_SOCKET_LISTENING << 32); |
994 | 991 | ||
995 | if (epoll_ctl(temp->efd, EPOLL_CTL_ADD, sock, &ev) == -1) { | 992 | if (epoll_ctl(temp->efd, EPOLL_CTL_ADD, sock, &ev) == -1) { |
@@ -1033,7 +1030,7 @@ static void do_TCP_accept_new(TCP_Server *TCP_server) | |||
1033 | 1030 | ||
1034 | do { | 1031 | do { |
1035 | sock = accept(TCP_server->socks_listening[i], (struct sockaddr *)&addr, &addrlen); | 1032 | sock = accept(TCP_server->socks_listening[i], (struct sockaddr *)&addr, &addrlen); |
1036 | } while (accept_connection(TCP_server, sock)); | 1033 | } while (accept_connection(TCP_server, sock) != -1); |
1037 | } | 1034 | } |
1038 | } | 1035 | } |
1039 | 1036 | ||
@@ -1228,24 +1225,29 @@ static void do_TCP_epoll(TCP_Server *TCP_server) | |||
1228 | //socket is from socks_listening, accept connection | 1225 | //socket is from socks_listening, accept connection |
1229 | struct sockaddr_storage addr; | 1226 | struct sockaddr_storage addr; |
1230 | unsigned int addrlen = sizeof(addr); | 1227 | unsigned int addrlen = sizeof(addr); |
1231 | sock_t sock_new; | ||
1232 | 1228 | ||
1233 | sock_new = accept(sock, (struct sockaddr *)&addr, &addrlen); | 1229 | while (1) { |
1230 | sock_t sock_new = accept(sock, (struct sockaddr *)&addr, &addrlen); | ||
1234 | 1231 | ||
1235 | int index_new = TCP_server->incomming_connection_queue_index % MAX_INCOMMING_CONNECTIONS; | 1232 | if (!sock_valid(sock_new)) { |
1233 | break; | ||
1234 | } | ||
1236 | 1235 | ||
1237 | if (!accept_connection(TCP_server, sock_new)) { | 1236 | int index_new = accept_connection(TCP_server, sock_new); |
1238 | break; | ||
1239 | } | ||
1240 | 1237 | ||
1241 | struct epoll_event ev = { | 1238 | if (index_new == -1) { |
1242 | .events = EPOLLIN | EPOLLET | EPOLLRDHUP, | 1239 | continue; |
1243 | .data.u64 = sock_new | ((uint64_t)TCP_SOCKET_INCOMING << 32) | ((uint64_t)index_new << 48) | 1240 | } |
1244 | }; | ||
1245 | 1241 | ||
1246 | if (epoll_ctl(TCP_server->efd, EPOLL_CTL_ADD, sock_new, &ev) == -1) { | 1242 | struct epoll_event ev = { |
1247 | kill_TCP_connection(&TCP_server->incomming_connection_queue[index_new]); | 1243 | .events = EPOLLIN | EPOLLET | EPOLLRDHUP, |
1248 | break; | 1244 | .data.u64 = sock_new | ((uint64_t)TCP_SOCKET_INCOMING << 32) | ((uint64_t)index_new << 48) |
1245 | }; | ||
1246 | |||
1247 | if (epoll_ctl(TCP_server->efd, EPOLL_CTL_ADD, sock_new, &ev) == -1) { | ||
1248 | kill_TCP_connection(&TCP_server->incomming_connection_queue[index_new]); | ||
1249 | continue; | ||
1250 | } | ||
1249 | } | 1251 | } |
1250 | 1252 | ||
1251 | break; | 1253 | break; |