>From fb2eb5260121db9a5c24fd37c881b83a0e4ae02b Mon Sep 17 00:00:00 2001 From: Evan Hanson Date: Mon, 20 Apr 2015 18:01:49 +1200 Subject: [PATCH 1/2] Only resolve executable once when using a private repository Avoids resolving the current executable twice when a private repository is used on SEARCH_EXE_PATH platforms by moving the `C_main_exe` assignment into `C_main_entry_point`. (Previously, it would be resolved once by `C_private_repository` and once again when setting `C_main_exe`.) --- chicken.h | 18 +++++++++++++----- runtime.c | 10 +++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/chicken.h b/chicken.h index a0af44a..c4b3da2 100644 --- a/chicken.h +++ b/chicken.h @@ -1587,9 +1587,9 @@ extern double trunc(double); #define C_ub_i_pointer_f64_set(p, n) (*((double *)(p)) = (n)) #ifdef C_PRIVATE_REPOSITORY -# define C_private_repository(fname) C_use_private_repository(C_path_to_executable(fname)) +# define C_private_repository() C_use_private_repository(C_executable_dirname()) #else -# define C_private_repository(fname) +# define C_private_repository() #endif /* left for backwards-compatibility */ @@ -1601,13 +1601,20 @@ extern double trunc(double); # define C_set_gui_mode #endif +#ifdef SEARCH_EXE_PATH +# define C_set_main_exe(fname) C_main_exe = C_resolve_executable_pathname(fname) +#else +# define C_set_main_exe(fname) +#endif + #if !defined(C_EMBEDDED) && !defined(C_SHARED) # if (defined(C_WINDOWS_GUI) || defined(C_GUI)) && defined(_WIN32) # define C_main_entry_point \ int WINAPI WinMain(HINSTANCE me, HINSTANCE you, LPSTR cmdline, int show) \ { \ C_gui_mode = 1; \ - C_private_repository(NULL); \ + C_set_main_exe(argv[0]); \ + C_private_repository(); \ return CHICKEN_main(0, NULL, (void *)C_toplevel); \ } # else @@ -1615,7 +1622,8 @@ extern double trunc(double); int main(int argc, char *argv[]) \ { \ C_set_gui_mode; \ - C_private_repository(argv[ 0 ]); \ + C_set_main_exe(argv[0]); \ + C_private_repository(); \ return CHICKEN_main(argc, argv, (void*)C_toplevel); \ } # endif @@ -1840,8 +1848,8 @@ C_fctexport int C_do_unregister_finalizer(C_word x); C_fctexport C_word C_dbg_hook(C_word x); C_fctexport void C_use_private_repository(C_char *path); C_fctexport C_char *C_private_repository_path(); +C_fctexport C_char *C_executable_dirname(); C_fctexport C_char *C_executable_pathname(); -C_fctexport C_char *C_path_to_executable(C_char *fname); C_fctexport C_char *C_resolve_executable_pathname(C_char *fname); C_fctimport void C_ccall C_toplevel(C_word c, C_word self, C_word k) C_noret; diff --git a/runtime.c b/runtime.c index e9ea017..30f74d8 100644 --- a/runtime.c +++ b/runtime.c @@ -1223,10 +1223,6 @@ void CHICKEN_parse_command_line(int argc, char *argv[], C_word *heap, C_word *st C_main_argc = argc; C_main_argv = argv; -#ifdef SEARCH_EXE_PATH - C_main_exe = C_resolve_executable_pathname(argv[0]); -#endif - *heap = DEFAULT_HEAP_SIZE; *stack = DEFAULT_STACK_SIZE; *symbols = DEFAULT_SYMBOL_TABLE_SIZE; @@ -8968,16 +8964,16 @@ C_executable_pathname() { #ifdef SEARCH_EXE_PATH return C_main_exe == NULL ? NULL : C_strdup(C_main_exe); #else - return C_resolve_executable_pathname(C_main_argv[0]); + return C_resolve_executable_pathname(NULL); #endif } C_char * -C_path_to_executable(C_char *fname) { +C_executable_dirname() { int len; C_char *path; - if((path = C_resolve_executable_pathname(fname)) == NULL) + if((path = C_executable_pathname()) == NULL) return NULL; #if defined(_WIN32) && !defined(__CYGWIN__) -- 2.1.4