summaryrefslogtreecommitdiff
path: root/toxcore/TCP_server.c
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2015-02-23 14:46:38 -0500
committerirungentoo <irungentoo@gmail.com>2015-02-23 14:46:38 -0500
commit972e6a9ac5ec398c145e13491fee490de5245342 (patch)
tree26ba2fe0d29223444f40235f5bf0dbe876b7f72f /toxcore/TCP_server.c
parent085f90432f352ce2dfb31e0a7fbb83efa6b2f5db (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.c56
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 */
884static int accept_connection(TCP_Server *TCP_server, sock_t sock) 884static 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
913static sock_t new_listening_TCP_socket(int family, uint16_t port) 914static 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;