mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Use edge trigger on listen socket in TCP_Server.
This may or may not improve things.
This commit is contained in:
parent
085f90432f
commit
972e6a9ac5
@ -878,26 +878,27 @@ static int confirm_TCP_connection(TCP_Server *TCP_server, TCP_Secure_Connection
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return 1 on success
|
/* return index on success
|
||||||
* return 0 on failure
|
* return -1 on failure
|
||||||
*/
|
*/
|
||||||
static int accept_connection(TCP_Server *TCP_server, sock_t sock)
|
static int accept_connection(TCP_Server *TCP_server, sock_t sock)
|
||||||
{
|
{
|
||||||
if (!sock_valid(sock))
|
if (!sock_valid(sock))
|
||||||
return 0;
|
return -1;
|
||||||
|
|
||||||
if (!set_socket_nonblock(sock)) {
|
if (!set_socket_nonblock(sock)) {
|
||||||
kill_sock(sock);
|
kill_sock(sock);
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!set_socket_nosigpipe(sock)) {
|
if (!set_socket_nosigpipe(sock)) {
|
||||||
kill_sock(sock);
|
kill_sock(sock);
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TCP_Secure_Connection *conn =
|
uint16_t index = TCP_server->incomming_connection_queue_index % MAX_INCOMMING_CONNECTIONS;
|
||||||
&TCP_server->incomming_connection_queue[TCP_server->incomming_connection_queue_index % MAX_INCOMMING_CONNECTIONS];
|
|
||||||
|
TCP_Secure_Connection *conn = &TCP_server->incomming_connection_queue[index];
|
||||||
|
|
||||||
if (conn->status != TCP_STATUS_NO_STATUS)
|
if (conn->status != TCP_STATUS_NO_STATUS)
|
||||||
kill_TCP_connection(conn);
|
kill_TCP_connection(conn);
|
||||||
@ -907,7 +908,7 @@ static int accept_connection(TCP_Server *TCP_server, sock_t sock)
|
|||||||
conn->next_packet_length = 0;
|
conn->next_packet_length = 0;
|
||||||
|
|
||||||
++TCP_server->incomming_connection_queue_index;
|
++TCP_server->incomming_connection_queue_index;
|
||||||
return 1;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
static sock_t new_listening_TCP_socket(int family, uint16_t port)
|
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)
|
|||||||
return ~0;
|
return ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TCP_SERVER_USE_EPOLL
|
|
||||||
int ok = set_socket_nonblock(sock);
|
int ok = set_socket_nonblock(sock);
|
||||||
#else
|
|
||||||
int ok = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ok && family == AF_INET6) {
|
if (ok && family == AF_INET6) {
|
||||||
ok = set_socket_dualstack(sock);
|
ok = set_socket_dualstack(sock);
|
||||||
@ -989,7 +986,7 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin
|
|||||||
|
|
||||||
if (sock_valid(sock)) {
|
if (sock_valid(sock)) {
|
||||||
#ifdef TCP_SERVER_USE_EPOLL
|
#ifdef TCP_SERVER_USE_EPOLL
|
||||||
ev.events = EPOLLIN;
|
ev.events = EPOLLIN | EPOLLET;
|
||||||
ev.data.u64 = sock | ((uint64_t)TCP_SOCKET_LISTENING << 32);
|
ev.data.u64 = sock | ((uint64_t)TCP_SOCKET_LISTENING << 32);
|
||||||
|
|
||||||
if (epoll_ctl(temp->efd, EPOLL_CTL_ADD, sock, &ev) == -1) {
|
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)
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
sock = accept(TCP_server->socks_listening[i], (struct sockaddr *)&addr, &addrlen);
|
sock = accept(TCP_server->socks_listening[i], (struct sockaddr *)&addr, &addrlen);
|
||||||
} while (accept_connection(TCP_server, sock));
|
} while (accept_connection(TCP_server, sock) != -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1228,24 +1225,29 @@ static void do_TCP_epoll(TCP_Server *TCP_server)
|
|||||||
//socket is from socks_listening, accept connection
|
//socket is from socks_listening, accept connection
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage addr;
|
||||||
unsigned int addrlen = sizeof(addr);
|
unsigned int addrlen = sizeof(addr);
|
||||||
sock_t sock_new;
|
|
||||||
|
|
||||||
sock_new = accept(sock, (struct sockaddr *)&addr, &addrlen);
|
while (1) {
|
||||||
|
sock_t sock_new = accept(sock, (struct sockaddr *)&addr, &addrlen);
|
||||||
|
|
||||||
int index_new = TCP_server->incomming_connection_queue_index % MAX_INCOMMING_CONNECTIONS;
|
if (!sock_valid(sock_new)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!accept_connection(TCP_server, sock_new)) {
|
int index_new = accept_connection(TCP_server, sock_new);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct epoll_event ev = {
|
if (index_new == -1) {
|
||||||
.events = EPOLLIN | EPOLLET | EPOLLRDHUP,
|
continue;
|
||||||
.data.u64 = sock_new | ((uint64_t)TCP_SOCKET_INCOMING << 32) | ((uint64_t)index_new << 48)
|
}
|
||||||
};
|
|
||||||
|
|
||||||
if (epoll_ctl(TCP_server->efd, EPOLL_CTL_ADD, sock_new, &ev) == -1) {
|
struct epoll_event ev = {
|
||||||
kill_TCP_connection(&TCP_server->incomming_connection_queue[index_new]);
|
.events = EPOLLIN | EPOLLET | EPOLLRDHUP,
|
||||||
break;
|
.data.u64 = sock_new | ((uint64_t)TCP_SOCKET_INCOMING << 32) | ((uint64_t)index_new << 48)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (epoll_ctl(TCP_server->efd, EPOLL_CTL_ADD, sock_new, &ev) == -1) {
|
||||||
|
kill_TCP_connection(&TCP_server->incomming_connection_queue[index_new]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user