This is where I stand now, and as it is in the 0.7.0 cygwin package. It works fine, but slow. There's a new installed key in the config hash, and the code to check this in library.c is ifdef'ed out as it generates a VM out of memory error.
2008/8/9 Reini Urban <[EMAIL PROTECTED]>: > Reini Urban schrieb: >> >> Reini Urban schrieb: >>> >>> Geoffrey Broadwell via RT schrieb: >>>> >>>> On Sun, 2008-07-27 at 13:13 +0200, Reini Urban wrote: >>>>> >>>>> + stat $I0, conf_file, 0 >>>>> + if $I0 goto conf >>>>> + + # If installed into /usr/lib/parrot, not /usr/runtime/parrot >>>>> + # This logic has to be reversed when installed versions should >>>>> run faster >>>>> + # than source builds. >>>> >>>> Reverse it now; we'll never remember to get back to this in the future. >>>> >>>>> + conf_file = interpinfo .INTERPINFO_RUNTIME_PREFIX >>>>> + conf_file .= "/lib/parrot/include/config.fpmc" >>>>> +conf: >>>> >>>>> + name = interpinfo .INTERPINFO_RUNTIME_PREFIX >>>>> + concat name, "lib/parrot/dynext/" >>>>> concat name, request >>>> >>>> Since we're using PIR in both places, we should probably use the .= >>>> sugar in both places. Yes, I know the second file has some 'concat's in >>>> it already. Here's an opportunity to fix that. :-) >>> >>> Ok. concat to .= is easy. >>> >>> Why I don't want to fix that as you suggest is that I wait for feedback >>> how it was designed to be. This patch is just a intermediate hack. Someone >>> like particle or Allison should comment on that. >>> >>> It is fine for benchmarks that the source build uses >>> runtime/parrot/include/config.fpmc. >>> But the installed version either should NOT need to load the frozen >>> config file when it is already linked in, or check with some global or >>> interpinfo magic and look up the right prefix then. >>> No useless stats please. >> >> My current plan is this: >> >> Source builds should be allowed to access >> runtime/parrot/include/config.fpmc and the various other config fpmc's, but >> the installable version, linked to install_config.fpmc must change its >> lib_path to allow only FHS-compliant paths, >> i.e remove runtime/parrot and runtime/parrot/include in favor of >> lib/parrot and lib/parrot/include. >> >> This must be fixed in config.pir, parrotlib.pir and src/library.c with >> this ticket. (Hope I forgot no other file) >> I'll work on that, but I have a business trip for the next two weeks. >> >> An optimization for another ticket would be to remove the run-time access >> to include/config.pir for linked installable's, where the frozen config.fpmc >> is already linked. There the sub _config should use some config detection >> logic (suggestion: new config key 'installed') to omit .include >> "library/config.pir" >> See the ticket perl #57418 [TODO] optimize _config to omit .include >> "library/config.pir" on installables > > Attached is an improved version with a fix in src/library.c, to decide > between installed and not installed configs. > This solves at least the /usr/runtime problem. > > However config.pir still unnecessarily tries to access some runtime files, > esp. "interpinfo.pasm" to get the index of .INTERPINFO_RUNTIME_PREFIX > I'm toying with the idea to fill that macro in parrotlib.pir and config.pir > with config/gen/parrot_include.pm. -- Reini Urban http://phpwiki.org/ http://murbreak.at/
Remove stats to /usr/runtime/parrot at installed versions ("/usr" being the prefix). Check the config_hash for the installed key and the interpreter INTERPINFO_RUNTIME_PREFIX or CONFIG_HASH if present. The library.c code is not working yet with ENABLE_PARROT_LIBRARY_INSTALLED Parrot VM: PANIC: Out of mem! Not enough tuits yet to fix and debug it. Index: parrot-svn/runtime/parrot/library/config.pir =================================================================== --- parrot-svn.orig/runtime/parrot/library/config.pir +++ parrot-svn/runtime/parrot/library/config.pir @@ -48,12 +48,28 @@ undefined values) is undefined, and may .sub _config .local pmc CONF .local string conf_file + + #unless find_sub('_config') goto runtime + #$P0 = _config() + #.return( $P0 ) + +runtime: + # conf_file = Parrot_locate_runtime_file_str(interp, "config.fpmc", 2) conf_file = interpinfo .INTERPINFO_RUNTIME_PREFIX conf_file .= "/runtime/parrot/include/config.fpmc" + stat $I0, conf_file, 0 + if $I0 goto conf + # If installed into /usr/lib/parrot, not /usr/runtime/parrot + # This logic has to be reversed when installed versions should run faster + # than source builds. + conf_file = interpinfo .INTERPINFO_RUNTIME_PREFIX + conf_file .= "/lib/parrot/include/config.fpmc" +conf: open CONF, conf_file, "<" $I0 = defined CONF if $I0 goto ok1 + printerr "Can't read '" printerr conf_file printerr "': " Index: parrot-svn/runtime/parrot/library/parrotlib.pir =================================================================== --- parrot-svn.orig/runtime/parrot/library/parrotlib.pir +++ parrot-svn/runtime/parrot/library/parrotlib.pir @@ -24,14 +24,13 @@ parrotlib's interface functions. .local pmc includes .local string root - - # XXX todo: get root from config $P0 = new 'Env' root = $P0["PARROT_RUNTIME_ROOT"] length $I0, root if $I0 == 0 goto DEFAULT branch OKAY DEFAULT: + # lib/parrot on installed, or runtime root = "runtime/parrot" OKAY: @@ -138,13 +137,22 @@ Returns the location of a dynamic extens stat $I0, name, 0 if $I0 goto END - name = "runtime/parrot/dynext/" + .include "interpinfo.pasm" + name = interpinfo .INTERPINFO_RUNTIME_PREFIX + concat name, "lib/parrot/dynext/" concat name, request stat $I0, name, 0 if $I0 goto END + concat name, ext + stat $I0, name, 0 + if $I0 goto END + name = "runtime/parrot/dynext/" concat name, request + stat $I0, name, 0 + if $I0 goto END + concat name, ext stat $I0, name, 0 if $I0 goto END Index: parrot-svn/src/library.c =================================================================== --- parrot-svn.orig/src/library.c +++ parrot-svn/src/library.c @@ -121,64 +121,108 @@ if will be called as a function with thi Platform code may add, delete, or replace search path entries as needed. See also F<include/parrot/library.h> for C<enum_lib_paths>. +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED +then the config hash is checked for the path prefix. This still crashes. + =cut */ +#undef ENABLE_PARROT_LIBRARY_INSTALLED + void parrot_init_library_paths(PARROT_INTERP) { PMC *paths; STRING *entry; + INTVAL installed = 0; PMC * const iglobals = interp->iglobals; /* create the lib_paths array */ PMC * const lib_paths = pmc_new(interp, enum_class_FixedPMCArray); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + PMC * const config_hash = VTABLE_get_pmc_keyed_int(interp, iglobals, IGLOBALS_CONFIG_HASH); + STRING * const key = CONST_STRING(interp, "installed"); +#endif VTABLE_set_integer_native(interp, lib_paths, PARROT_LIB_PATH_SIZE); VTABLE_set_pmc_keyed_int(interp, iglobals, IGLOBALS_LIB_PATHS, lib_paths); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + if (VTABLE_elements(interp, config_hash) && + VTABLE_exists_keyed_str(interp, config_hash, key))) { + installed = VTABLE_get_integer_keyed_str(interp, config_hash, key); + } +#endif + /* each is an array of strings */ /* define include paths */ paths = pmc_new(interp, enum_class_ResizableStringArray); VTABLE_set_pmc_keyed_int(interp, lib_paths, PARROT_LIB_PATH_INCLUDE, paths); - entry = CONST_STRING(interp, "runtime/parrot/include/"); - VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "runtime/parrot/"); - VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + if (installed) { +#endif + entry = CONST_STRING(interp, "lib/parrot/include/"); + VTABLE_push_string(interp, paths, entry); + entry = CONST_STRING(interp, "lib/parrot/"); + VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + } else { +#endif + entry = CONST_STRING(interp, "runtime/parrot/include/"); + VTABLE_push_string(interp, paths, entry); + entry = CONST_STRING(interp, "runtime/parrot/"); + VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + } +#endif entry = CONST_STRING(interp, "./"); VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "lib/parrot/include/"); - VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "lib/parrot/"); - VTABLE_push_string(interp, paths, entry); /* define library paths */ paths = pmc_new(interp, enum_class_ResizableStringArray); VTABLE_set_pmc_keyed_int(interp, lib_paths, PARROT_LIB_PATH_LIBRARY, paths); - entry = CONST_STRING(interp, "runtime/parrot/library/"); - VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "runtime/parrot/"); - VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + if (installed) { +#endif + entry = CONST_STRING(interp, "lib/parrot/library/"); + VTABLE_push_string(interp, paths, entry); + entry = CONST_STRING(interp, "lib/parrot/"); + VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + } else { +#endif + entry = CONST_STRING(interp, "runtime/parrot/library/"); + VTABLE_push_string(interp, paths, entry); + entry = CONST_STRING(interp, "runtime/parrot/"); + VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + } +#endif entry = CONST_STRING(interp, "./"); VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "lib/parrot/library/"); - VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "lib/parrot/"); - VTABLE_push_string(interp, paths, entry); /* define dynext paths */ paths = pmc_new(interp, enum_class_ResizableStringArray); VTABLE_set_pmc_keyed_int(interp, lib_paths, PARROT_LIB_PATH_DYNEXT, paths); - entry = CONST_STRING(interp, "runtime/parrot/dynext/"); - VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + if (installed) { +#endif + entry = CONST_STRING(interp, "lib/parrot/dynext/"); + VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + } else { +#endif + entry = CONST_STRING(interp, "runtime/parrot/dynext/"); + VTABLE_push_string(interp, paths, entry); +#ifdef ENABLE_PARROT_LIBRARY_INSTALLED + } +#endif entry = CONST_STRING(interp, ""); VTABLE_push_string(interp, paths, entry); - entry = CONST_STRING(interp, "lib/parrot/dynext/"); - VTABLE_push_string(interp, paths, entry); /* shared exts */ paths = pmc_new(interp, enum_class_ResizableStringArray); @@ -202,7 +246,16 @@ parrot_init_library_paths(PARROT_INTERP) =item C<static PMC* get_search_paths> -RT#48260: Not yet documented!!! +Return lib_paths as array of StringArrays with library searchpaths and shared +extension used for loading various files at runtime. +The structure looks like this: + + lib_paths = [ + [ "runtime/parrot/include", ... ], # paths for .include 'file' + [ "runtime/parrot/library", ... ], # paths for load_bytecode + [ "runtime/parrot/dynext", ... ], # paths for loadlib + [ ".so", ... ] # list of shared extensions + ] =cut @@ -573,7 +626,9 @@ Parrot_locate_runtime_file_str(PARROT_IN =item C<char* Parrot_locate_runtime_file> -RT#48260: Not yet documented!!! +Determines whether a file name given by a fixed-8 or utf8 C<STRING> is an +absolute file name. Returns C<1> if the filename is absolute, returns C<0> +otherwise. =cut Index: parrot-svn/config/gen/config_pm/config_lib.in =================================================================== --- parrot-svn.orig/config/gen/config_pm/config_lib.in +++ parrot-svn/config/gen/config_pm/config_lib.in @@ -12,6 +12,7 @@ no_arg: <<PCONFIG>> + set P0["installed"], I11 if I11, is_install set S1, "<<PWD>>" set P0["prefix"], S1