Sfoglia il codice sorgente

libobs: Move SymRefreshModuleList to crash handler

There's no need to refresh the actual module list for the crash handler
until a crash has occurred.  Reduces startup time for this function call
from 400ms to 40ms.
jp9000 10 anni fa
parent
commit
3c0a309ac5
2 ha cambiato i file con 13 aggiunte e 10 eliminazioni
  1. 9 1
      libobs/obs-win-crash-handler.c
  2. 4 9
      libobs/obs-windows.c

+ 9 - 1
libobs/obs-win-crash-handler.c

@@ -40,6 +40,7 @@ typedef BOOL (WINAPI *STACKWALK64)(DWORD machine_type, HANDLE process,
 		PFUNCTION_TABLE_ACCESS_ROUTINE64 function_table_access_routine,
 		PGET_MODULE_BASE_ROUTINE64 get_module_base_routine,
 		PTRANSLATE_ADDRESS_ROUTINE64 translate_address);
+typedef BOOL (WINAPI *SYMREFRESHMODULELIST)(HANDLE process);
 
 typedef PVOID (WINAPI *SYMFUNCTIONTABLEACCESS64)(HANDLE process,
 		DWORD64 addr_base);
@@ -78,6 +79,7 @@ struct exception_handler_data {
 	SYMGETMODULEBASE64                    sym_get_module_base64;
 	SYMFROMADDR                           sym_from_addr;
 	SYMGETMODULEINFO64                    sym_get_module_info64;
+	SYMREFRESHMODULELIST                  sym_refresh_module_list;
 	STACKWALK64                           stack_walk64;
 	ENUMERATELOADEDMODULES64              enumerate_loaded_modules64;
 	MINIDUMPWRITEDUMP                     minidump_write_dump;
@@ -134,6 +136,7 @@ static inline bool get_dbghelp_imports(struct exception_handler_data *data)
 	GET_DBGHELP_IMPORT(sym_get_module_base64, "SymGetModuleBase64");
 	GET_DBGHELP_IMPORT(sym_from_addr, "SymFromAddrW");
 	GET_DBGHELP_IMPORT(sym_get_module_info64, "SymGetModuleInfo64");
+	GET_DBGHELP_IMPORT(sym_refresh_module_list, "SymRefreshModuleList");
 	GET_DBGHELP_IMPORT(stack_walk64, "StackWalk64");
 	GET_DBGHELP_IMPORT(enumerate_loaded_modules64,
 			"EnumerateLoadedModulesW64");
@@ -163,6 +166,8 @@ static inline void init_instruction_data(struct stack_trace *trace)
 	trace->frame.AddrStack.Mode = AddrModeFlat;
 }
 
+extern bool sym_initialize_called;
+
 static inline void init_sym_info(struct exception_handler_data *data)
 {
 	data->sym_set_options(
@@ -170,7 +175,10 @@ static inline void init_sym_info(struct exception_handler_data *data)
 			SYMOPT_FAIL_CRITICAL_ERRORS |
 			SYMOPT_LOAD_ANYTHING);
 
-	data->sym_initialize(data->process, NULL, true);
+	if (!sym_initialize_called)
+		data->sym_initialize(data->process, NULL, true);
+	else
+		data->sym_refresh_module_list(data->process);
 
 	data->sym_info = LocalAlloc(LPTR, sizeof(*data->sym_info) + 256);
 	data->sym_info->SizeOfStruct = sizeof(SYMBOL_INFO);

+ 4 - 9
libobs/obs-windows.c

@@ -524,11 +524,12 @@ static char *get_abs_path(const char *path)
 	return abspath;
 }
 
+bool sym_initialize_called = false;
+
 void reset_win32_symbol_paths(void)
 {
 	static BOOL (WINAPI *sym_initialize_w)(HANDLE, const wchar_t*, BOOL);
 	static BOOL (WINAPI *sym_set_search_path_w)(HANDLE, const wchar_t*);
-	static BOOL (WINAPI *sym_refresh_module_list)(HANDLE);
 	static bool funcs_initialized = false;
 	static bool initialize_success = false;
 
@@ -551,10 +552,7 @@ void reset_win32_symbol_paths(void)
 		sym_initialize_w = (void*)GetProcAddress(mod, "SymInitializeW");
 		sym_set_search_path_w = (void*)GetProcAddress(mod,
 				"SymSetSearchPathW");
-		sym_refresh_module_list = (void*)GetProcAddress(mod,
-				"SymRefreshModuleList");
-		if (!sym_initialize_w || !sym_set_search_path_w ||
-				!sym_refresh_module_list)
+		if (!sym_initialize_w || !sym_set_search_path_w)
 			return;
 
 		initialize_success = true;
@@ -615,16 +613,13 @@ void reset_win32_symbol_paths(void)
 	if (path_str.array) {
 		os_utf8_to_wcs_ptr(path_str.array, path_str.len, &path_str_w);
 		if (path_str_w) {
-			static bool sym_initialize_called = false;
-
 			if (!sym_initialize_called) {
 				sym_initialize_w(GetCurrentProcess(),
-						path_str_w, true);
+						path_str_w, false);
 				sym_initialize_called = true;
 			} else {
 				sym_set_search_path_w(GetCurrentProcess(),
 						path_str_w);
-				sym_refresh_module_list(GetCurrentProcess());
 			}
 
 			bfree(path_str_w);