X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fruntime.c;h=4c5434e187bb703d0e4cef036e17ef70620a0725;hb=b0a7abdf2bd6f2d66fcce97196024cdb0e1a1886;hp=fa9e33bb97374a62973a1be215c9de7d47e51d61;hpb=9524f32119c687023c20f181cdf47f0125f59c60;p=sbcl.git diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index fa9e33b..4c5434e 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -17,16 +17,22 @@ #include #include +#ifndef LISP_FEATURE_WIN32 #include +#endif #include +#ifndef LISP_FEATURE_WIN32 #include +#endif #include #include #include #include #include #include +#ifndef LISP_FEATURE_WIN32 #include +#endif #include #include @@ -93,7 +99,7 @@ successful_malloc(size_t size) { void* result = malloc(size); if (0 == result) { - lose("malloc failure"); + lose("malloc failure\n"); } else { return result; } @@ -176,14 +182,46 @@ distribution for more information.\n\ ", SBCL_VERSION_STRING); } - +/* Look for a core file to load, first in the directory named by the + * SBCL_HOME environment variable, then in a hardcoded default + * location. Returns a malloced copy of the core filename. */ +char * +search_for_core () +{ + char *sbcl_home = getenv("SBCL_HOME"); + char *lookhere; + char *stem = "/sbcl.core"; + char *core; + + if(!sbcl_home) sbcl_home = SBCL_HOME; + lookhere = (char *) calloc(strlen(sbcl_home) + + strlen(stem) + + 1, + sizeof(char)); + sprintf(lookhere, "%s%s", sbcl_home, stem); + core = copied_existing_filename_or_null(lookhere); + free(lookhere); + if (!core) { + lose("can't find core file\n"); + } + + return core; +} + + int main(int argc, char *argv[], char *envp[]) { +#ifdef LISP_FEATURE_WIN32 + /* Exception handling support structure. Evil Win32 hack. */ + struct lisp_exception_frame exception_frame; +#endif + /* the name of the core file we're to execute. Note that this is * a malloc'ed string which should be freed eventually. */ char *core = 0; char **sbcl_argv = 0; + os_vm_offset_t embedded_core_offset = 0; /* other command line options */ boolean noinform = 0; @@ -215,11 +253,11 @@ main(int argc, char *argv[], char *envp[]) ++argi; } else if (0 == strcmp(arg, "--core")) { if (core) { - lose("more than one core file specified"); + lose("more than one core file specified\n"); } else { ++argi; if (argi >= argc) { - lose("missing filename for --core argument"); + lose("missing filename for --core argument\n"); } core = copied_string(argv[argi]); ++argi; @@ -265,7 +303,7 @@ main(int argc, char *argv[], char *envp[]) * error. */ if (!end_runtime_options && 0 == strcmp(arg, "--end-runtime-options")) { - lose("bad runtime option \"%s\"", argi0); + lose("bad runtime option \"%s\"\n", argi0); } sbcl_argv[argj++] = arg; } @@ -275,24 +313,25 @@ main(int argc, char *argv[], char *envp[]) /* If no core file was specified, look for one. */ if (!core) { - char *sbcl_home = getenv("SBCL_HOME"); - char *lookhere; - char *stem = "/sbcl.core"; - if(!sbcl_home) sbcl_home = SBCL_HOME; - lookhere = (char *) calloc(strlen(sbcl_home) + - strlen(stem) + - 1, - sizeof(char)); - sprintf(lookhere, "%s%s", sbcl_home, stem); - core = copied_existing_filename_or_null(lookhere); - free(lookhere); - if (!core) { - lose("can't find core file"); - } + char *runtime_path = os_get_runtime_executable_path(); + + if (runtime_path) { + os_vm_offset_t offset = search_for_embedded_core(runtime_path); + + if (offset != -1) { + embedded_core_offset = offset; + core = runtime_path; + } else { + free(runtime_path); + core = search_for_core(); + } + } else { + core = search_for_core(); + } } - /* Make sure that SBCL_HOME is set, no matter where the core was - * found */ - if (!getenv("SBCL_HOME")) { + + /* Make sure that SBCL_HOME is set, unless loading an embedded core. */ + if (!getenv("SBCL_HOME") && embedded_core_offset == 0) { char *envstring, *copied_core, *dir; char *stem = "SBCL_HOME="; copied_core = copied_string(core); @@ -322,17 +361,25 @@ main(int argc, char *argv[], char *envp[]) globals_init(); - initial_function = load_core_file(core); + initial_function = load_core_file(core, embedded_core_offset); if (initial_function == NIL) { - lose("couldn't find initial function"); + lose("couldn't find initial function\n"); } - SHOW("freeing core"); - free(core); gc_initialize_pointers(); arch_install_interrupt_handlers(); +#ifndef LISP_FEATURE_WIN32 os_install_interrupt_handlers(); +#else +/* wos_install_interrupt_handlers(handler); */ + wos_install_interrupt_handlers(&exception_frame); +#endif + + /* Pass core filename into Lisp */ + SetSymbolValue(CORE_STRING, alloc_base_string(core),0); + SHOW("freeing core"); + free(core); /* Convert remaining argv values to something that Lisp can grok. */ SHOW("setting POSIX-ARGV symbol value"); @@ -341,7 +388,14 @@ main(int argc, char *argv[], char *envp[]) FSHOW((stderr, "/funcalling initial_function=0x%lx\n", (unsigned long)initial_function)); +#ifdef LISP_FEATURE_WIN32 + fprintf(stderr, "\n\ +This is experimental prerelease support for the Windows platform: use\n\ +at your own risk. \"Your Kitten of Death awaits!\"\n"); + fflush(stdout); + fflush(stderr); +#endif create_initial_thread(initial_function); - lose("CATS. CATS ARE NICE."); + lose("CATS. CATS ARE NICE.\n"); return 0; }