static char *get_init_filename(Scheme_Env *env) { Scheme_Object *f; Scheme_Thread * volatile p; mz_jmp_buf * volatile save, newbuf; p = scheme_get_current_thread(); save = p->error_buf; p->error_buf = &newbuf; if (!scheme_setjmp(newbuf)) { f = scheme_builtin_value("find-system-path"); if (f) { Scheme_Object *a[1]; a[0] = scheme_intern_symbol("init-file"); f = _scheme_apply(f, 1, a); if (SCHEME_PATHP(f)) { p->error_buf = save; return SCHEME_PATH_VAL(f); } } } p->error_buf = save; return NULL; }
static void *place_start_proc_after_stack(void *data_arg, void *stack_base) { Place_Start_Data *place_data; Scheme_Object *place_main; Scheme_Object *a[2], *channel; mzrt_thread_id ptid; intptr_t rc = 0; ptid = mz_proc_thread_self(); place_data = (Place_Start_Data *) data_arg; data_arg = NULL; /* printf("Startin place: proc thread id%u\n", ptid); */ /* create pristine THREAD_LOCAL variables*/ null_out_runtime_globals(); /* scheme_make_thread behaves differently if the above global vars are not null */ scheme_place_instance_init(stack_base); a[0] = scheme_places_deep_copy(place_data->current_library_collection_paths); scheme_current_library_collection_paths(1, a); a[0] = scheme_places_deep_copy(place_data->module); a[1] = scheme_places_deep_copy(place_data->function); a[1] = scheme_intern_exact_symbol(SCHEME_SYM_VAL(a[1]), SCHEME_SYM_LEN(a[1])); if (!SAME_TYPE(SCHEME_TYPE(place_data->channel), scheme_place_bi_channel_type)) { channel = scheme_places_deep_copy(place_data->channel); } else { channel = place_data->channel; } mzrt_sema_post(place_data->ready); place_data = NULL; # ifdef MZ_PRECISE_GC /* this prevents a master collection attempt from deadlocking with the place_data->ready semaphore above */ GC_allow_master_gc_check(); # endif /* at point point, don't refer to place_data or its content anymore, because it's allocated in the other place */ scheme_set_root_param(MZCONFIG_EXIT_HANDLER, scheme_def_place_exit_proc); { Scheme_Thread * volatile p; mz_jmp_buf * volatile saved_error_buf; mz_jmp_buf new_error_buf; p = scheme_get_current_thread(); saved_error_buf = p->error_buf; p->error_buf = &new_error_buf; if (!scheme_setjmp(new_error_buf)) { Scheme_Object *dynamic_require; dynamic_require = scheme_builtin_value("dynamic-require"); place_main = scheme_apply(dynamic_require, 2, a); a[0] = channel; scheme_apply(place_main, 1, a); } else { rc = 1; } p->error_buf = saved_error_buf; } /*printf("Leavin place: proc thread id%u\n", ptid);*/ scheme_place_instance_destroy(); return (void*) rc; }
/* * Get the init filename for the system * * First look to see if <addon-dir>/interactive.rkt exists * * Otherwise check config file for location */ static Scheme_Object *get_init_filename(Scheme_Env *env, char *init_filename_sym, char *default_init_module, char *user_init_module) { Scheme_Object *f, *a[2], *build_path; Scheme_Thread * volatile p; mz_jmp_buf * volatile save, newbuf; p = scheme_get_current_thread(); save = p->error_buf; p->error_buf = &newbuf; if(!scheme_setjmp(newbuf)) { build_path = scheme_builtin_value("build-path"); /* First test to see if user init file exists */ f = scheme_builtin_value("find-system-path"); a[0] = scheme_intern_symbol("addon-dir"); a[0] = _scheme_apply(f, 1, a); a[1] = scheme_make_path(user_init_module); f = _scheme_apply(build_path, 2, a); if (SCHEME_PATHP(f)) { char *filename; filename = scheme_expand_filename(SCHEME_PATH_VAL(f), -1, "startup", NULL, SCHEME_GUARD_FILE_EXISTS); if(scheme_file_exists(filename)) { p->error_buf = save; return scheme_make_path(filename); } } /* Failed, next check config.rkt fo system init file */ f = scheme_builtin_value("find-main-config"); a[0] = _scheme_apply(f, 0, NULL); a[1] = scheme_make_path("config.rktd"); f = _scheme_apply(build_path, 2, a); if (SCHEME_PATHP(f)) { char *filename; filename = scheme_expand_filename(SCHEME_PATH_VAL(f), -1, "startup", NULL, SCHEME_GUARD_FILE_EXISTS | SCHEME_GUARD_FILE_READ); if(scheme_file_exists(filename)) { Scheme_Object * port; port = scheme_open_input_file(SCHEME_PATH_VAL(f), "get-init-filename"); f = scheme_read(port); scheme_close_input_port(port); if(SCHEME_HASHTRP(f)) { f = scheme_hash_tree_get((Scheme_Hash_Tree *)f, scheme_intern_symbol(init_filename_sym)); if(f) { p->error_buf = save; return f; } } } } /* Failed to load custom init file, load racket/interactive */ f = scheme_intern_symbol(default_init_module); p->error_buf = save; return f; } p->error_buf = save; return NULL; }