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

Record more profiling info.

This commit is contained in:
Daniel Collins 2023-11-21 20:18:19 +00:00
parent 53bfadc0e5
commit 822b307dec
6 changed files with 46 additions and 1 deletions

View File

@ -108,10 +108,11 @@ void fprof_report(const char *dll_name, struct FuncStats *fstats, size_t n_fstat
if(total_time > 0.0) if(total_time > 0.0)
{ {
log_printf(LOG_INFO, log_printf(LOG_INFO,
"%s:%s was called %u times duration min %fus max %fus avg %fus", "%s:%s was called %u times duration total %fus min %fus max %fus avg %fus",
dll_name, dll_name,
fstats[i].func_name, fstats[i].func_name,
n_calls, n_calls,
(total_time / TICKS_PER_USEC),
(min_time / TICKS_PER_USEC), (min_time / TICKS_PER_USEC),
(max_time / TICKS_PER_USEC), (max_time / TICKS_PER_USEC),
((total_time / (float)(n_calls)) / TICKS_PER_USEC)); ((total_time / (float)(n_calls)) / TICKS_PER_USEC));

View File

@ -59,6 +59,9 @@ struct FuncStats ipxwrapper_fstats[] = {
const unsigned int ipxwrapper_fstats_size = sizeof(ipxwrapper_fstats) / sizeof(*ipxwrapper_fstats); const unsigned int ipxwrapper_fstats_size = sizeof(ipxwrapper_fstats) / sizeof(*ipxwrapper_fstats);
unsigned int send_packets = 0, send_bytes = 0; /* Sent from emulated socket */
unsigned int recv_packets = 0, recv_bytes = 0; /* Forwarded to emulated socket */
static void init_cs(CRITICAL_SECTION *cs) static void init_cs(CRITICAL_SECTION *cs)
{ {
if(!InitializeCriticalSectionAndSpinCount(cs, 0x80000000)) if(!InitializeCriticalSectionAndSpinCount(cs, 0x80000000))
@ -71,6 +74,18 @@ static void init_cs(CRITICAL_SECTION *cs)
static HANDLE prof_thread_handle = NULL; static HANDLE prof_thread_handle = NULL;
static HANDLE prof_thread_exit = NULL; static HANDLE prof_thread_exit = NULL;
static void report_packet_stats(void)
{
unsigned int my_send_packets = __atomic_exchange_n(&send_packets, 0, __ATOMIC_RELAXED);
unsigned int my_send_bytes = __atomic_exchange_n(&send_bytes, 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);
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);
}
static DWORD WINAPI prof_thread_main(LPVOID lpParameter) static DWORD WINAPI prof_thread_main(LPVOID lpParameter)
{ {
static const int PROF_INTERVAL_MS = 10000; static const int PROF_INTERVAL_MS = 10000;
@ -79,6 +94,7 @@ static DWORD WINAPI prof_thread_main(LPVOID lpParameter)
{ {
fprof_report(STUBS_DLL_NAME, stub_fstats, NUM_STUBS); fprof_report(STUBS_DLL_NAME, stub_fstats, NUM_STUBS);
fprof_report("ipxwrapper.dll", ipxwrapper_fstats, ipxwrapper_fstats_size); fprof_report("ipxwrapper.dll", ipxwrapper_fstats, ipxwrapper_fstats_size);
report_packet_stats();
} }
return 0; return 0;
@ -206,6 +222,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{ {
fprof_report(STUBS_DLL_NAME, stub_fstats, NUM_STUBS); fprof_report(STUBS_DLL_NAME, stub_fstats, NUM_STUBS);
fprof_report("ipxwrapper.dll", ipxwrapper_fstats, ipxwrapper_fstats_size); fprof_report("ipxwrapper.dll", ipxwrapper_fstats, ipxwrapper_fstats_size);
report_packet_stats();
} }
log_close(); log_close();

View File

@ -197,6 +197,9 @@ enum {
#undef FPROF_DECL #undef FPROF_DECL
}; };
extern unsigned int send_packets, send_bytes; /* Sent from emulated socket */
extern unsigned int recv_packets, recv_bytes; /* Forwarded to emulated socket */
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

@ -1,3 +1,5 @@
FPROF_DECL(_deliver_packet) FPROF_DECL(_deliver_packet)
FPROF_DECL(_handle_udp_recv) FPROF_DECL(_handle_udp_recv)
FPROF_DECL(_handle_dosbox_recv)
FPROF_DECL(_handle_pcap_frame)
FPROF_DECL(lock_sockets) FPROF_DECL(lock_sockets)

View File

@ -347,6 +347,10 @@ static void _deliver_packet(
{ {
log_printf(LOG_ERROR, "Error relaying packet: %s", w32_error(WSAGetLastError())); log_printf(LOG_ERROR, "Error relaying packet: %s", w32_error(WSAGetLastError()));
} }
else{
__atomic_add_fetch(&recv_packets, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&recv_bytes, data_size, __ATOMIC_RELAXED);
}
free(packet); free(packet);
} }
@ -541,6 +545,8 @@ static void _handle_dosbox_registration_response(novell_ipx_packet *packet, size
static void _handle_dosbox_recv(novell_ipx_packet *packet, size_t packet_size) static void _handle_dosbox_recv(novell_ipx_packet *packet, size_t packet_size)
{ {
FPROF_RECORD_SCOPE(&(ipxwrapper_fstats[IPXWRAPPER_FSTATS__handle_dosbox_recv]));
if(packet_size < sizeof(novell_ipx_packet) || ntohs(packet->length) != packet_size) if(packet_size < sizeof(novell_ipx_packet) || ntohs(packet->length) != packet_size)
{ {
/* Doesn't look valid. */ /* Doesn't look valid. */
@ -622,6 +628,8 @@ static bool _do_udp_recv(int fd)
static void _handle_pcap_frame(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data) static void _handle_pcap_frame(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
{ {
FPROF_RECORD_SCOPE(&(ipxwrapper_fstats[IPXWRAPPER_FSTATS__handle_pcap_frame]));
ipx_interface_t *iface = (ipx_interface_t*)(user); ipx_interface_t *iface = (ipx_interface_t*)(user);
const novell_ipx_packet *ipx; const novell_ipx_packet *ipx;

View File

@ -1475,6 +1475,9 @@ static DWORD ipx_send_packet(
if(pcap_sendpacket(iface->pcap, (void*)(frame), frame_size) == 0) if(pcap_sendpacket(iface->pcap, (void*)(frame), frame_size) == 0)
{ {
__atomic_add_fetch(&send_packets, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&send_bytes, data_size, __ATOMIC_RELAXED);
free(frame); free(frame);
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
@ -1531,6 +1534,10 @@ static DWORD ipx_send_packet(
error = WSAGetLastError(); error = WSAGetLastError();
log_printf(LOG_ERROR, "Error sending DOSBox IPX packet: %s", w32_error(error)); log_printf(LOG_ERROR, "Error sending DOSBox IPX packet: %s", w32_error(error));
} }
else{
__atomic_add_fetch(&send_packets, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&send_bytes, data_size, __ATOMIC_RELAXED);
}
free(packet); free(packet);
@ -1635,6 +1642,12 @@ static DWORD ipx_send_packet(
free(packet); free(packet);
if(send_ok)
{
__atomic_add_fetch(&send_packets, 1, __ATOMIC_RELAXED);
__atomic_add_fetch(&send_bytes, data_size, __ATOMIC_RELAXED);
}
return send_ok return send_ok
? ERROR_SUCCESS ? ERROR_SUCCESS
: send_error; : send_error;