1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00

Record more profiling data.

This commit is contained in:
Daniel Collins 2023-11-26 20:38:46 +00:00
parent c16b73bce4
commit b9d25e54d3
6 changed files with 94 additions and 28 deletions

View File

@ -166,6 +166,10 @@ void coalesce_flush(coalesce_dest *cd)
{ {
log_printf(LOG_ERROR, "Error sending DOSBox IPX packet: %s", w32_error(WSAGetLastError())); log_printf(LOG_ERROR, "Error sending DOSBox IPX packet: %s", w32_error(WSAGetLastError()));
} }
else{
__atomic_add_fetch(&send_packets_udp, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&send_bytes_udp, cd->payload_used, __ATOMIC_RELAXED);
}
cd->payload_used = 0; cd->payload_used = 0;
DL_DELETE(coalesce_pending, cd); DL_DELETE(coalesce_pending, cd);
@ -220,12 +224,19 @@ DWORD coalesce_send(const void *data, size_t data_size, addr32_t dest_net, addr4
} }
} }
if(!queued && r_sendto(private_socket, (const void*)(data), data_size, 0, (struct sockaddr*)(&dosbox_server_addr), sizeof(dosbox_server_addr)) < 0) if(!queued)
{ {
DWORD error = WSAGetLastError(); if(r_sendto(private_socket, (const void*)(data), data_size, 0, (struct sockaddr*)(&dosbox_server_addr), sizeof(dosbox_server_addr)) < 0)
log_printf(LOG_ERROR, "Error sending DOSBox IPX packet: %s", w32_error(error)); {
DWORD error = WSAGetLastError();
return error; log_printf(LOG_ERROR, "Error sending DOSBox IPX packet: %s", w32_error(error));
return error;
}
else{
__atomic_add_fetch(&send_packets_udp, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&send_bytes_udp, data_size, __ATOMIC_RELAXED);
}
} }
return ERROR_SUCCESS; return ERROR_SUCCESS;

View File

@ -64,6 +64,9 @@ const unsigned int ipxwrapper_fstats_size = sizeof(ipxwrapper_fstats) / sizeof(*
unsigned int send_packets = 0, send_bytes = 0; /* Sent from emulated socket */ unsigned int send_packets = 0, send_bytes = 0; /* Sent from emulated socket */
unsigned int recv_packets = 0, recv_bytes = 0; /* Forwarded to emulated socket */ unsigned int recv_packets = 0, recv_bytes = 0; /* Forwarded to emulated socket */
unsigned int send_packets_udp = 0, send_bytes_udp = 0; /* Sent over UDP transport */
unsigned int recv_packets_udp = 0, recv_bytes_udp = 0; /* Received over UDP transport */
static void init_cs(CRITICAL_SECTION *cs) static void init_cs(CRITICAL_SECTION *cs)
{ {
if(!InitializeCriticalSectionAndSpinCount(cs, 0x80000000)) if(!InitializeCriticalSectionAndSpinCount(cs, 0x80000000))
@ -84,8 +87,17 @@ static void report_packet_stats(void)
unsigned int my_recv_packets = __atomic_exchange_n(&recv_packets, 0, __ATOMIC_RELAXED); unsigned int my_recv_packets = __atomic_exchange_n(&recv_packets, 0, __ATOMIC_RELAXED);
unsigned int my_recv_bytes = __atomic_exchange_n(&recv_bytes, 0, __ATOMIC_RELAXED); unsigned int my_recv_bytes = __atomic_exchange_n(&recv_bytes, 0, __ATOMIC_RELAXED);
unsigned int my_send_packets_udp = __atomic_exchange_n(&send_packets_udp, 0, __ATOMIC_RELAXED);
unsigned int my_send_bytes_udp = __atomic_exchange_n(&send_bytes_udp, 0, __ATOMIC_RELAXED);
unsigned int my_recv_packets_udp = __atomic_exchange_n(&recv_packets_udp, 0, __ATOMIC_RELAXED);
unsigned int my_recv_bytes_udp = __atomic_exchange_n(&recv_bytes_udp, 0, __ATOMIC_RELAXED);
log_printf(LOG_INFO, "IPX sockets sent %u packets (%u bytes)", my_send_packets, my_send_bytes); log_printf(LOG_INFO, "IPX sockets sent %u packets (%u bytes)", my_send_packets, my_send_bytes);
log_printf(LOG_INFO, "IPX sockets received %u packets (%u bytes)", my_recv_packets, my_recv_bytes); log_printf(LOG_INFO, "IPX sockets received %u packets (%u bytes)", my_recv_packets, my_recv_bytes);
log_printf(LOG_INFO, "UDP sockets sent %u packets (%u bytes)", my_send_packets_udp, my_send_bytes_udp);
log_printf(LOG_INFO, "UDP sockets received %u packets (%u bytes)", my_recv_packets_udp, my_recv_bytes_udp);
} }
static DWORD WINAPI prof_thread_main(LPVOID lpParameter) static DWORD WINAPI prof_thread_main(LPVOID lpParameter)

View File

@ -201,6 +201,9 @@ enum {
extern unsigned int send_packets, send_bytes; /* Sent from emulated socket */ extern unsigned int send_packets, send_bytes; /* Sent from emulated socket */
extern unsigned int recv_packets, recv_bytes; /* Forwarded to emulated socket */ extern unsigned int recv_packets, recv_bytes; /* Forwarded to emulated socket */
extern unsigned int send_packets_udp, send_bytes_udp; /* Sent over UDP transport */
extern unsigned int recv_packets_udp, recv_bytes_udp; /* Received over UDP transport */
ipx_socket *get_socket(SOCKET sockfd); ipx_socket *get_socket(SOCKET sockfd);
ipx_socket *get_socket_wait_for_ready(SOCKET sockfd, int timeout_ms); ipx_socket *get_socket_wait_for_ready(SOCKET sockfd, int timeout_ms);
void lock_sockets(void); void lock_sockets(void);

View File

@ -3,3 +3,9 @@ FPROF_DECL(_handle_udp_recv)
FPROF_DECL(_handle_dosbox_recv) FPROF_DECL(_handle_dosbox_recv)
FPROF_DECL(_handle_pcap_frame) FPROF_DECL(_handle_pcap_frame)
FPROF_DECL(lock_sockets) FPROF_DECL(lock_sockets)
FPROF_DECL(ioctlsocket_recv_pump)
FPROF_DECL(ioctlsocket_accumulate)
FPROF_DECL(recv_pump_select)
FPROF_DECL(recv_pump_find_slot)
FPROF_DECL(recv_pump_recv)
FPROF_DECL(recv_pump_reclaim_socket)

View File

@ -655,6 +655,9 @@ static bool _do_udp_recv(int fd)
return false; return false;
} }
__atomic_add_fetch(&recv_packets_udp, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&recv_bytes_udp, len, __ATOMIC_RELAXED);
if(ipx_encap_type == ENCAP_TYPE_DOSBOX) if(ipx_encap_type == ENCAP_TYPE_DOSBOX)
{ {
if(addr.sin_family != dosbox_server_addr.sin_family if(addr.sin_family != dosbox_server_addr.sin_family

View File

@ -774,6 +774,8 @@ static int recv_pump(ipx_socket *sockptr, BOOL block)
if(!block) if(!block)
{ {
FPROF_RECORD_SCOPE(&(ipxwrapper_fstats[IPXWRAPPER_FSTATS_recv_pump_select]));
fd_set read_fds; fd_set read_fds;
FD_ZERO(&read_fds); FD_ZERO(&read_fds);
@ -798,15 +800,19 @@ static int recv_pump(ipx_socket *sockptr, BOOL block)
int recv_slot = -1; int recv_slot = -1;
for(int i = 0; i < RECV_QUEUE_MAX_PACKETS; ++i)
{ {
if(queue->sizes[i] == IPX_RECV_QUEUE_FREE) FPROF_RECORD_SCOPE(&(ipxwrapper_fstats[IPXWRAPPER_FSTATS_recv_pump_find_slot]));
for(int i = 0; i < RECV_QUEUE_MAX_PACKETS; ++i)
{ {
queue->sizes[i] = IPX_RECV_QUEUE_LOCKED; if(queue->sizes[i] == IPX_RECV_QUEUE_FREE)
recv_queue_adjust_refcount(queue, 1); {
queue->sizes[i] = IPX_RECV_QUEUE_LOCKED;
recv_slot = i; recv_queue_adjust_refcount(queue, 1);
break;
recv_slot = i;
break;
}
} }
} }
@ -818,9 +824,19 @@ static int recv_pump(ipx_socket *sockptr, BOOL block)
unlock_sockets(); unlock_sockets();
int r = r_recv(fd, (char*)(queue->data[recv_slot]), MAX_PKT_SIZE, 0); int r;
{
FPROF_RECORD_SCOPE(&(ipxwrapper_fstats[IPXWRAPPER_FSTATS_recv_pump_recv]));
r = r_recv(fd, (char*)(queue->data[recv_slot]), MAX_PKT_SIZE, 0);
}
if(!reclaim_socket(sockptr, fd)) bool ok;
{
FPROF_RECORD_SCOPE(&(ipxwrapper_fstats[IPXWRAPPER_FSTATS_recv_pump_reclaim_socket]));
ok = reclaim_socket(sockptr, fd);
}
if(!ok)
{ {
/* The application closed the socket while we were in the recv() call. /* The application closed the socket while we were in the recv() call.
* Just discard our handle, let the queue be destroyed. * Just discard our handle, let the queue be destroyed.
@ -1376,7 +1392,14 @@ static int send_packet(const ipx_packet *packet, int len, struct sockaddr *addr,
log_printf(LOG_DEBUG, "Sending packet from %s to %s (%s:%hu)", src_addr, dest_addr, inet_ntoa(v4->sin_addr), ntohs(v4->sin_port)); log_printf(LOG_DEBUG, "Sending packet from %s to %s (%s:%hu)", src_addr, dest_addr, inet_ntoa(v4->sin_addr), ntohs(v4->sin_port));
} }
return (r_sendto(private_socket, (char*)packet, len, 0, addr, addrlen) == len); int r = r_sendto(private_socket, (char*)packet, len, 0, addr, addrlen);
if(r == len)
{
__atomic_add_fetch(&send_packets_udp, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&send_bytes_udp, len, __ATOMIC_RELAXED);
}
return r;
} }
static DWORD ipx_send_packet( static DWORD ipx_send_packet(
@ -1806,28 +1829,36 @@ int PASCAL ioctlsocket(SOCKET fd, long cmd, u_long *argp)
if(cmd == FIONREAD && !(sock->flags & IPX_IS_SPX)) if(cmd == FIONREAD && !(sock->flags & IPX_IS_SPX))
{ {
while(1)
{ {
int r = recv_pump(sock, FALSE); FPROF_RECORD_SCOPE(&(ipxwrapper_fstats[IPXWRAPPER_FSTATS_ioctlsocket_recv_pump]));
if(r < 0)
{
/* Error in recv_pump() */
return -1;
}
if(r == 0) while(1)
{ {
/* No more packets ready to read from underlying socket. */ int r = recv_pump(sock, FALSE);
break; if(r < 0)
{
/* Error in recv_pump() */
return -1;
}
if(r == 0)
{
/* No more packets ready to read from underlying socket. */
break;
}
} }
} }
unsigned long accumulated_packet_data = 0; unsigned long accumulated_packet_data = 0;
for(int i = 0; i < sock->recv_queue->n_ready; ++i)
{ {
const ipx_packet *packet = (const ipx_packet*)(sock->recv_queue->data[ sock->recv_queue->ready[i] ]); FPROF_RECORD_SCOPE(&(ipxwrapper_fstats[IPXWRAPPER_FSTATS_ioctlsocket_accumulate]));
accumulated_packet_data += packet->size;
for(int i = 0; i < sock->recv_queue->n_ready; ++i)
{
const ipx_packet *packet = (const ipx_packet*)(sock->recv_queue->data[ sock->recv_queue->ready[i] ]);
accumulated_packet_data += packet->size;
}
} }
unlock_sockets(); unlock_sockets();