Files
c-toxcore/toxcore/ev_test_util.cc
T
iphydf 2f87ac67b0 feat: Add Event Loop abstraction (Ev).
- `Ev` interface in `toxcore/ev.h` and `toxcore/ev.c`.
- System-specific event loop backends (epoll, poll, win32) in
  `toxcore/os_event.c`.

Performance Benchmarks (epoll backend):

| Sockets (N) | Active (M) | Time (ns) | Time/Active (ns) |
|------------:|-----------:|----------:|-----------------:|
|           8 |          1 |       438 |              438 |
|          64 |          1 |       438 |              438 |
|         512 |          1 |       443 |              443 |
|        1024 |          1 |       442 |              442 |
|        1024 |         10 |       947 |               95 |
|        1024 |        100 |     6,268 |               63 |
|        1024 |       1024 |    61,875 |               60 |
2026-01-19 17:49:39 +00:00

107 lines
2.4 KiB
C++

/* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright © 2026 The TokTok team.
*/
#include "ev_test_util.hh"
#include "net.h"
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <unistd.h>
#endif
#ifdef _WIN32
int create_pair(Socket *rs, Socket *ws)
{
SOCKET listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == INVALID_SOCKET)
return -1;
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = 0;
if (bind(listener, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
closesocket(listener);
return -1;
}
if (listen(listener, 1) != 0) {
closesocket(listener);
return -1;
}
socklen_t len = sizeof(addr);
if (getsockname(listener, (struct sockaddr *)&addr, &len) != 0) {
closesocket(listener);
return -1;
}
SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (client == INVALID_SOCKET) {
closesocket(listener);
return -1;
}
if (connect(client, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
closesocket(client);
closesocket(listener);
return -1;
}
SOCKET server = accept(listener, nullptr, nullptr);
if (server == INVALID_SOCKET) {
closesocket(client);
closesocket(listener);
return -1;
}
closesocket(listener);
*rs = net_socket_from_native((int)client);
*ws = net_socket_from_native((int)server);
return 0;
}
void close_socket(Socket s) { closesocket(net_socket_to_native(s)); }
void close_pair(Socket s1, Socket s2)
{
closesocket(net_socket_to_native(s1));
closesocket(net_socket_to_native(s2));
}
int write_socket(Socket s, const void *buf, size_t count)
{
return send(net_socket_to_native(s), (const char *)buf, (int)count, 0);
}
#else
int create_pair(Socket *rs, Socket *ws)
{
int pipefds[2];
if (pipe(pipefds) != 0)
return -1;
*rs = net_socket_from_native(pipefds[0]);
*ws = net_socket_from_native(pipefds[1]);
return 0;
}
void close_socket(Socket s) { close(net_socket_to_native(s)); }
void close_pair(Socket s1, Socket s2)
{
close(net_socket_to_native(s1));
close(net_socket_to_native(s2));
}
int write_socket(Socket s, const void *buf, size_t count)
{
return write(net_socket_to_native(s), buf, count);
}
#endif