X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fruntime.c;h=49c007bff6179ba8489d92cb48b51ad9170e5e51;hb=0ed4db4a998679b83cdf7978b2c67470dec70b49;hp=f66a7e562b67bc3c8a33265f3034a498d6d96011;hpb=d47b2f66bdb7abc9de99658e8dbdd1c7c108881e;p=sbcl.git diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index f66a7e5..49c007b 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include "runtime.h" #ifndef LISP_FEATURE_WIN32 #include #endif @@ -42,7 +42,9 @@ #include #endif +#if !(defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD)) #include "signal.h" +#endif #include "runtime.h" #include "vars.h" @@ -93,7 +95,7 @@ void sigint_init(void) { SHOW("entering sigint_init()"); - install_handler(SIGINT, sigint_handler); + install_handler(SIGINT, sigint_handler, 1); SHOW("leaving sigint_init()"); } @@ -292,10 +294,11 @@ search_for_executable(const char *argv0) } #endif /* LISP_FEATURE_WIN32 */ -unsigned long parse_size_arg(char *arg, char *arg_name) +size_t +parse_size_arg(char *arg, char *arg_name) { char *tail, *power_name; - unsigned long power, res; + size_t power, res; res = strtoul(arg, &tail, 0); @@ -327,7 +330,7 @@ unsigned long parse_size_arg(char *arg, char *arg_name) free(power_name); } if ((res <= 0) || - (res > (ULONG_MAX >> power))) { + (res >= (SIZE_MAX >> power))) { lose("%s argument is out of range: %s", arg_name, arg); } res <<= power; @@ -340,6 +343,54 @@ char *core_string; struct runtime_options *runtime_options; char *saved_runtime_path = NULL; +#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD) +void pthreads_win32_init(); +#endif + +void print_locale_variable(const char *name) +{ + char *value = getenv(name); + + if (value) { + fprintf(stderr, "\n %s=%s", name, value); + } +} + +void setup_locale() +{ + if(setlocale(LC_ALL, "") == NULL) { +#ifndef LISP_FEATURE_WIN32 + + fprintf(stderr, "WARNING: Setting locale failed.\n"); + fprintf(stderr, " Check the following variables for correct values:"); + + if (setlocale(LC_CTYPE, "") == NULL) { + print_locale_variable("LC_ALL"); + print_locale_variable("LC_CTYPE"); + print_locale_variable("LANG"); + } + + if (setlocale(LC_MESSAGES, "") == NULL) { + print_locale_variable("LC_MESSAGES"); + } + if (setlocale(LC_COLLATE, "") == NULL) { + print_locale_variable("LC_COLLATE"); + } + if (setlocale(LC_MONETARY, "") == NULL) { + print_locale_variable("LC_MONETARY"); + } + if (setlocale(LC_NUMERIC, "") == NULL) { + print_locale_variable("LC_NUMERIC"); + } + if (setlocale(LC_TIME, "") == NULL) { + print_locale_variable("LC_TIME"); + } + fprintf(stderr, "\n"); + +#endif + } +} + int main(int argc, char *argv[], char *envp[]) @@ -364,11 +415,14 @@ main(int argc, char *argv[], char *envp[]) lispobj initial_function; const char *sbcl_home = getenv("SBCL_HOME"); +#if defined(LISP_FEATURE_WIN32) && defined(LISP_FEATURE_SB_THREAD) + os_preinit(); + pthreads_win32_init(); +#endif + interrupt_init(); block_blockable_signals(0, 0); - setlocale(LC_ALL, ""); - runtime_options = NULL; /* Save the argv[0] derived runtime path in case @@ -530,11 +584,11 @@ main(int argc, char *argv[], char *envp[]) /* Align down to multiple of page_table page size, and to the appropriate * stack alignment. */ - dynamic_space_size &= ~(PAGE_BYTES-1); + dynamic_space_size &= ~(sword_t)(PAGE_BYTES-1); #ifdef LISP_FEATURE_GENCGC - dynamic_space_size &= ~(GENCGC_CARD_BYTES-1); + dynamic_space_size &= ~(sword_t)(GENCGC_CARD_BYTES-1); #endif - thread_control_stack_size &= ~(CONTROL_STACK_ALIGNMENT_BYTES-1); + thread_control_stack_size &= ~(sword_t)(CONTROL_STACK_ALIGNMENT_BYTES-1); /* Preserve the runtime options for possible future core saving */ runtime_options->dynamic_space_size = dynamic_space_size; @@ -544,10 +598,13 @@ main(int argc, char *argv[], char *envp[]) * systems (e.g. Alpha) arch_init() needs need os_vm_page_size, so * it must follow os_init(). -- WHN 2000-01-26 */ os_init(argv, envp); + dyndebug_init(); /* after os_init: do not print output before execve */ arch_init(); gc_init(); validate(); + setup_locale(); + /* If no core file was specified, look for one. */ if (!core) { core = search_for_core(); @@ -603,6 +660,9 @@ main(int argc, char *argv[], char *envp[]) if (initial_function == NIL) { lose("couldn't find initial function\n"); } +#ifdef LISP_FEATURE_SB_DYNAMIC_CORE + os_link_runtime(); +#endif #ifdef LISP_FEATURE_HPUX /* -1 = CLOSURE_FUN_OFFSET, 23 = SIMPLE_FUN_CODE_OFFSET, we are * not in LANGUAGE_ASSEMBLY so we cant reach them. */