mirror of
https://github.com/solemnwarning/ipxwrapper
synced 2024-12-30 16:45:37 +01:00
Add option to enable/disable profiling.
This commit is contained in:
parent
09b235024d
commit
53bfadc0e5
13
mkstubs.pl
13
mkstubs.pl
@ -112,6 +112,10 @@ END
|
||||
|
||||
print CODE <<"END";
|
||||
section .data
|
||||
|
||||
global _stubs_enable_profile
|
||||
_stubs_enable_profile: db 0
|
||||
|
||||
END
|
||||
|
||||
foreach my $func(@stubs)
|
||||
@ -167,6 +171,11 @@ foreach my $func(@stubs)
|
||||
|
||||
$func->{name}_go:
|
||||
|
||||
; Bypass the profiling code and jump straight into the taget
|
||||
; function when not profiling.
|
||||
cmp byte [_stubs_enable_profile], 0
|
||||
je $func->{name}_skip
|
||||
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
|
||||
@ -203,7 +212,6 @@ END
|
||||
}
|
||||
|
||||
print CODE <<"END";
|
||||
|
||||
; Call target function
|
||||
call [$func->{name}_addr]
|
||||
|
||||
@ -236,6 +244,9 @@ END
|
||||
pop ebp ; Restore caller's ebp
|
||||
|
||||
ret $func->{params}
|
||||
|
||||
$func->{name}_skip:
|
||||
jmp [$func->{name}_addr]
|
||||
END
|
||||
}
|
||||
else{
|
||||
|
@ -44,6 +44,7 @@ extern enum ipx_log_level min_log_level;
|
||||
extern struct FuncStats stub_fstats[];
|
||||
extern const unsigned int NUM_STUBS;
|
||||
extern const char *STUBS_DLL_NAME;
|
||||
extern unsigned char stubs_enable_profile;
|
||||
|
||||
const char *w32_error(DWORD errnum);
|
||||
|
||||
|
@ -33,6 +33,7 @@ main_config_t get_main_config(void)
|
||||
config.encap_type = ENCAP_TYPE_IPXWRAPPER;
|
||||
config.frame_type = FRAME_TYPE_ETH_II;
|
||||
config.log_level = LOG_INFO;
|
||||
config.profile = false;
|
||||
|
||||
config.dosbox_server_addr = NULL;
|
||||
config.dosbox_server_port = 213;
|
||||
@ -59,6 +60,7 @@ main_config_t get_main_config(void)
|
||||
config.encap_type = reg_get_dword(reg, "use_pcap", config.encap_type);
|
||||
config.frame_type = reg_get_dword(reg, "frame_type", config.frame_type);
|
||||
config.log_level = reg_get_dword(reg, "log_level", config.log_level);
|
||||
config.profile = reg_get_dword(reg, "profile", config.profile);
|
||||
|
||||
config.dosbox_server_addr = reg_get_string(reg, "dosbox_server_addr", "");
|
||||
config.dosbox_server_port = reg_get_dword(reg, "dosbox_server_port", config.dosbox_server_port);
|
||||
@ -91,6 +93,7 @@ bool set_main_config(const main_config_t *config)
|
||||
&& reg_set_dword(reg, "use_pcap", config->encap_type)
|
||||
&& reg_set_dword(reg, "frame_type", config->frame_type)
|
||||
&& reg_set_dword(reg, "log_level", config->log_level)
|
||||
&& reg_set_dword(reg, "profile", config->profile)
|
||||
|
||||
&& reg_set_string(reg, "dosbox_server_addr", config->dosbox_server_addr)
|
||||
&& reg_set_dword(reg, "dosbox_server_port", config->dosbox_server_port);
|
||||
|
@ -52,6 +52,7 @@ typedef struct main_config {
|
||||
uint16_t dosbox_server_port;
|
||||
|
||||
enum ipx_log_level log_level;
|
||||
bool profile;
|
||||
} main_config_t;
|
||||
|
||||
struct v1_global_config {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* IPXWrapper - Configuration tool
|
||||
* Copyright (C) 2011-2022 Daniel Collins <solemnwarning@solemnwarning.net>
|
||||
* Copyright (C) 2011-2023 Daniel Collins <solemnwarning@solemnwarning.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
@ -41,6 +41,7 @@ enum {
|
||||
ID_OPT_W95 = 22,
|
||||
ID_OPT_LOG_DEBUG = 25,
|
||||
ID_OPT_LOG_TRACE = 26,
|
||||
ID_OPT_PROFILE = 27,
|
||||
|
||||
ID_OK = 31,
|
||||
ID_CANCEL = 32,
|
||||
@ -142,6 +143,7 @@ static struct {
|
||||
HWND opt_w95;
|
||||
HWND opt_log_debug;
|
||||
HWND opt_log_trace;
|
||||
HWND opt_profile;
|
||||
|
||||
HWND ok_btn;
|
||||
HWND can_btn;
|
||||
@ -588,6 +590,8 @@ static bool save_config()
|
||||
}
|
||||
}
|
||||
|
||||
main_config.profile = get_checkbox(wh.opt_profile);
|
||||
|
||||
if(main_config.encap_type == ENCAP_TYPE_IPXWRAPPER || main_config.encap_type == ENCAP_TYPE_PCAP)
|
||||
{
|
||||
for(auto i = nics.begin(); i != nics.end(); i++)
|
||||
@ -796,6 +800,7 @@ static void main_window_init()
|
||||
* | □ Enable Windows 95 SO_BROADCAST bug |
|
||||
* | □ Log debugging messages |
|
||||
* | □ Log WinSock API calls |
|
||||
* | □ Log profiling counters |
|
||||
* +---------------------------------------------------------+
|
||||
*/
|
||||
|
||||
@ -805,10 +810,12 @@ static void main_window_init()
|
||||
wh.opt_w95 = create_checkbox(wh.box_options, "Enable Windows 95 SO_BROADCAST bug", ID_OPT_W95);
|
||||
wh.opt_log_debug = create_checkbox(wh.box_options, "Log debugging messages", ID_OPT_LOG_DEBUG);
|
||||
wh.opt_log_trace = create_checkbox(wh.box_options, "Log WinSock API calls", ID_OPT_LOG_TRACE);
|
||||
wh.opt_profile = create_checkbox(wh.box_options, "Log profiling counters", ID_OPT_PROFILE);
|
||||
|
||||
set_checkbox(wh.opt_w95, main_config.w95_bug);
|
||||
set_checkbox(wh.opt_log_debug, main_config.log_level <= LOG_DEBUG);
|
||||
set_checkbox(wh.opt_log_trace, main_config.log_level <= LOG_CALL);
|
||||
set_checkbox(wh.opt_profile, main_config.profile);
|
||||
}
|
||||
|
||||
wh.ok_btn = create_child(wh.main, "BUTTON", "OK", BS_PUSHBUTTON | WS_TABSTOP, 0, ID_OK);
|
||||
@ -982,6 +989,9 @@ static void main_window_init()
|
||||
MoveWindow(wh.opt_log_trace, BOX_SIDE_PAD, box_options_y, BOX_INNER_WIDTH, text_h, TRUE);
|
||||
box_options_y += text_h + 2;
|
||||
|
||||
MoveWindow(wh.opt_profile, BOX_SIDE_PAD, box_options_y, BOX_INNER_WIDTH, text_h, TRUE);
|
||||
box_options_y += text_h + 2;
|
||||
|
||||
int box_options_h = box_options_y + BOX_BOTTOM_PAD;
|
||||
|
||||
MoveWindow(wh.box_options, BOX_SIDE_MARGIN, 0, BOX_WIDTH, box_options_h, TRUE);
|
||||
|
@ -133,29 +133,34 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||
|
||||
router_init();
|
||||
|
||||
prof_thread_exit = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if(prof_thread_exit != NULL)
|
||||
if(main_config.profile)
|
||||
{
|
||||
prof_thread_handle = CreateThread(
|
||||
NULL, /* lpThreadAttributes */
|
||||
0, /* dwStackSize */
|
||||
&prof_thread_main, /* lpStartAddress */
|
||||
NULL, /* lpParameter */
|
||||
0, /* dwCreationFlags */
|
||||
NULL); /* lpThreadId */
|
||||
stubs_enable_profile = true;
|
||||
|
||||
if(prof_thread_handle == NULL)
|
||||
prof_thread_exit = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if(prof_thread_exit != NULL)
|
||||
{
|
||||
prof_thread_handle = CreateThread(
|
||||
NULL, /* lpThreadAttributes */
|
||||
0, /* dwStackSize */
|
||||
&prof_thread_main, /* lpStartAddress */
|
||||
NULL, /* lpParameter */
|
||||
0, /* dwCreationFlags */
|
||||
NULL); /* lpThreadId */
|
||||
|
||||
if(prof_thread_handle == NULL)
|
||||
{
|
||||
log_printf(LOG_ERROR,
|
||||
"Unable to create prof_thread_main thread: %s",
|
||||
w32_error(GetLastError()));
|
||||
}
|
||||
}
|
||||
else{
|
||||
log_printf(LOG_ERROR,
|
||||
"Unable to create prof_thread_main thread: %s",
|
||||
"Unable to create prof_thread_exit event object: %s",
|
||||
w32_error(GetLastError()));
|
||||
}
|
||||
}
|
||||
else{
|
||||
log_printf(LOG_ERROR,
|
||||
"Unable to create prof_thread_exit event object: %s",
|
||||
w32_error(GetLastError()));
|
||||
}
|
||||
}
|
||||
else if(fdwReason == DLL_PROCESS_DETACH)
|
||||
{
|
||||
@ -197,8 +202,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||
|
||||
unload_dlls();
|
||||
|
||||
fprof_report(STUBS_DLL_NAME, stub_fstats, NUM_STUBS);
|
||||
fprof_report("ipxwrapper.dll", ipxwrapper_fstats, ipxwrapper_fstats_size);
|
||||
if(main_config.profile)
|
||||
{
|
||||
fprof_report(STUBS_DLL_NAME, stub_fstats, NUM_STUBS);
|
||||
fprof_report("ipxwrapper.dll", ipxwrapper_fstats, ipxwrapper_fstats_size);
|
||||
}
|
||||
|
||||
log_close();
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* IPXWrapper - Stub DLL functions
|
||||
* Copyright (C) 2008-2019 Daniel Collins <solemnwarning@solemnwarning.net>
|
||||
* Copyright (C) 2008-2023 Daniel Collins <solemnwarning@solemnwarning.net>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
@ -35,31 +35,38 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
|
||||
|
||||
log_open("ipxwrapper.log");
|
||||
|
||||
min_log_level = get_main_config().log_level;
|
||||
main_config_t config = get_main_config();
|
||||
|
||||
prof_thread_exit = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if(prof_thread_exit != NULL)
|
||||
min_log_level = config.log_level;
|
||||
|
||||
if(config.profile)
|
||||
{
|
||||
prof_thread_handle = CreateThread(
|
||||
NULL, /* lpThreadAttributes */
|
||||
0, /* dwStackSize */
|
||||
&prof_thread_main, /* lpStartAddress */
|
||||
NULL, /* lpParameter */
|
||||
0, /* dwCreationFlags */
|
||||
NULL); /* lpThreadId */
|
||||
stubs_enable_profile = true;
|
||||
|
||||
if(prof_thread_handle == NULL)
|
||||
prof_thread_exit = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
if(prof_thread_exit != NULL)
|
||||
{
|
||||
prof_thread_handle = CreateThread(
|
||||
NULL, /* lpThreadAttributes */
|
||||
0, /* dwStackSize */
|
||||
&prof_thread_main, /* lpStartAddress */
|
||||
NULL, /* lpParameter */
|
||||
0, /* dwCreationFlags */
|
||||
NULL); /* lpThreadId */
|
||||
|
||||
if(prof_thread_handle == NULL)
|
||||
{
|
||||
log_printf(LOG_ERROR,
|
||||
"Unable to create prof_thread_main thread: %s",
|
||||
w32_error(GetLastError()));
|
||||
}
|
||||
}
|
||||
else{
|
||||
log_printf(LOG_ERROR,
|
||||
"Unable to create prof_thread_main thread: %s",
|
||||
"Unable to create prof_thread_exit event object: %s",
|
||||
w32_error(GetLastError()));
|
||||
}
|
||||
}
|
||||
else{
|
||||
log_printf(LOG_ERROR,
|
||||
"Unable to create prof_thread_exit event object: %s",
|
||||
w32_error(GetLastError()));
|
||||
}
|
||||
}
|
||||
else if(fdwReason == DLL_PROCESS_DETACH)
|
||||
{
|
||||
@ -91,7 +98,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
|
||||
|
||||
unload_dlls();
|
||||
|
||||
fprof_report(STUBS_DLL_NAME, stub_fstats, NUM_STUBS);
|
||||
if(stubs_enable_profile)
|
||||
{
|
||||
fprof_report(STUBS_DLL_NAME, stub_fstats, NUM_STUBS);
|
||||
}
|
||||
|
||||
log_close();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user