X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=NativeLauncher%2Flauncher%2Flib%2Fcore_runtime.cc;h=5f1be89cfe28738c050c6cb9a411acfbcf41e283;hb=841a169fddd9c86764e081fbe2c9e56eab583785;hp=b500b01fa13b436255f9ffbc934f04da4c014ce9;hpb=79b41c69c0e08a826d4ac424483a73f31a021951;p=platform%2Fcore%2Fdotnet%2Flauncher.git diff --git a/NativeLauncher/launcher/lib/core_runtime.cc b/NativeLauncher/launcher/lib/core_runtime.cc index b500b01..5f1be89 100644 --- a/NativeLauncher/launcher/lib/core_runtime.cc +++ b/NativeLauncher/launcher/lib/core_runtime.cc @@ -56,6 +56,8 @@ static coreclr_execute_assembly_ptr executeAssembly = nullptr; static coreclr_shutdown_ptr shutdown = nullptr; static coreclr_create_delegate_ptr createDelegate = nullptr; static set_environment_variable_ptr setEnvironmentVariable = nullptr; +static stop_profile_after_delay_ptr stopProfileAfterDelay = nullptr; +static set_switch_ptr setSwitch = nullptr; static void* __coreclrLib = nullptr; static void* __hostHandle = nullptr; static unsigned int __domainId = -1; @@ -63,6 +65,8 @@ static bool __initialized = false; static bool __isProfileMode = false; PathManager* CoreRuntime::__pm = nullptr; +#define MAX_DELAY_SEC 100 + static std::vector __envList; static void setEnvFromFile() @@ -150,45 +154,39 @@ static bool storage_cb(int id, storage_type_e type, storage_state_e state, const return true; } -static void initEnvForSpecialFolder() +static void setSpecialFolder(storage_directory_e type, const char* key) { - int storageId; int error; - char *path = NULL; + char* path = NULL; + static int __storageId = -1; - error = storage_foreach_device_supported(storage_cb, &storageId); - if (error != STORAGE_ERROR_NONE) { - return; + if (__storageId < 0) { + error = storage_foreach_device_supported(storage_cb, &__storageId); + if (error != STORAGE_ERROR_NONE) { + return; + } } - error = storage_get_directory(storageId, STORAGE_DIRECTORY_IMAGES, &path); + error = storage_get_directory(__storageId, type, &path); if (error == STORAGE_ERROR_NONE && path != NULL) { - setenv("XDG_PICTURES_DIR", const_cast(path), 1); + setenv(key, const_cast(path), 1); free(path); - path = NULL; } +} - error = storage_get_directory(storageId, STORAGE_DIRECTORY_MUSIC, &path); - if (error == STORAGE_ERROR_NONE && path != NULL) { - setenv("XDG_MUSIC_DIR", const_cast(path), 1); - free(path); - path = NULL; +static void initEnvForSpecialFolder() +{ + if (getenv("XDG_PICTURES_DIR") == NULL) { + setSpecialFolder(STORAGE_DIRECTORY_IMAGES, "XDG_PICTURES_DIR"); } - error = storage_get_directory(storageId, STORAGE_DIRECTORY_VIDEOS, &path); - if (error == STORAGE_ERROR_NONE && path != NULL) { - setenv("XDG_VIDEOS_DIR", const_cast(path), 1); - free(path); - path = NULL; + if (getenv("XDG_MUSIC_DIR") == NULL) { + setSpecialFolder(STORAGE_DIRECTORY_MUSIC, "XDG_MUSIC_DIR"); } -} -// terminate candidate process when language changed -// icu related data (CultureInfo, etc) should be recreated. -static void langChangedCB(keynode_t *key, void* data) -{ - _INFO("terminiate candidate process to update language."); - exit(0); + if (getenv("XDG_VIDEOS_DIR") == NULL) { + setSpecialFolder(STORAGE_DIRECTORY_VIDEOS, "XDG_VIDEOS_DIR"); + } } static void setLang() @@ -271,12 +269,15 @@ void preload() bool initializeCoreClr(PathManager* pm, const std::string& tpa) { + bool ncdbStartupHook = isNCDBStartupHookProvided(); + const char *propertyKeys[] = { "TRUSTED_PLATFORM_ASSEMBLIES", "APP_PATHS", "APP_NI_PATHS", "NATIVE_DLL_SEARCH_DIRECTORIES", - "AppDomainCompatSwitch" + "AppDomainCompatSwitch", + ncdbStartupHook ? "STARTUP_HOOKS" : "" // must be the last one }; const char *propertyValues[] = { @@ -284,14 +285,15 @@ bool initializeCoreClr(PathManager* pm, const std::string& tpa) pm->getAppPaths().c_str(), pm->getAppNIPaths().c_str(), pm->getNativeDllSearchingPaths().c_str(), - "UseLatestBehaviorWhenTFMNotSpecified" + "UseLatestBehaviorWhenTFMNotSpecified", + ncdbStartupHook ? getNCDBStartupHook() : "" // must be the last one }; std::string selfPath = readSelfPath(); int st = initializeClr(selfPath.c_str(), "TizenDotnetApp", - sizeof(propertyKeys) / sizeof(propertyKeys[0]), + sizeof(propertyKeys) / sizeof(propertyKeys[0]) - (ncdbStartupHook ? 0 : 1), propertyKeys, propertyValues, &__hostHandle, @@ -334,6 +336,7 @@ int CoreRuntime::initialize(const char* appType, LaunchMode launchMode) // So, plugin initialize should be called before creating threads. if (initializePluginManager(appType) < 0) { _ERR("Failed to initialize PluginManager"); + return -1; } // checkInjection checks dotnet-launcher run mode @@ -369,6 +372,9 @@ int CoreRuntime::initialize(const char* appType, LaunchMode launchMode) putenv(const_cast("COMPlus_UseDefaultBaseAddr=1")); #endif // USE_DEFAULT_BASE_ADDR + // Disable config cache to set environment after coreclr_initialize() + putenv(const_cast("COMPlus_DisableConfigCache=1")); + // read string from external file and set them to environment value. setEnvFromFile(); @@ -379,9 +385,19 @@ int CoreRuntime::initialize(const char* appType, LaunchMode launchMode) return -1; } - char* pluginPath = pluginGetDllPath(); - if (pluginPath) { - __pm->addPlatformAssembliesPaths(pluginPath); + char* pluginDllPaths = pluginGetDllPath(); + if (pluginDllPaths && pluginDllPaths[0] != '\0') { + __pm->addPlatformAssembliesPaths(pluginDllPaths, true); + } + + char* pluginNativePaths = pluginGetNativeDllSearchingPath(); + if (pluginNativePaths && pluginNativePaths[0] != '\0') { + __pm->addNativeDllSearchingPaths(pluginNativePaths, true); + } + + char* pluginExtraDllPaths = pluginGetExtraDllPath(); + if (pluginExtraDllPaths && pluginExtraDllPaths[0] != '\0') { + __pm->setExtraDllPaths(pluginExtraDllPaths); } pluginHasLogControl(); @@ -421,7 +437,7 @@ int CoreRuntime::initialize(const char* appType, LaunchMode launchMode) std::string tpa; char* pluginTPA = pluginGetTPA(); - if (pluginTPA) { + if (pluginTPA && pluginTPA[0] != '\0') { tpa = std::string(pluginTPA); } else { addAssembliesFromDirectories(__pm->getPlatformAssembliesPaths(), tpa); @@ -438,10 +454,19 @@ int CoreRuntime::initialize(const char* appType, LaunchMode launchMode) return -1; } + st = createDelegate(__hostHandle, __domainId, "Tizen.Runtime", "Tizen.Runtime.Profiler", "StopProfileAfterDelay", (void**)&stopProfileAfterDelay); + if (st < 0 || stopProfileAfterDelay == nullptr) { + _ERR("Create delegate for Tizen.Runtime.dll -> Tizen.Runtime.Profiler -> StopProfileAfterDelay failed (0x%08x)", st); + return -1; + } + + st = createDelegate(__hostHandle, __domainId, "Tizen.Runtime", "Tizen.Runtime.AppSetting", "SetSwitch", (void**)&setSwitch); + if (st < 0 || setSwitch == nullptr) { + _ERR("Create delegate for Tizen.Runtime.dll -> Tizen.Runtime.AppSetting -> SetSwitch failed (0x%08x)", st); + return -1; + } + if (launchMode == LaunchMode::loader) { - // terminate candidate process if language is changed. - // CurrentCulture created for preloaded dlls should be updated. - vconf_notify_key_changed(VCONFKEY_LANGSET, langChangedCB, NULL); // preload libraries and manage dlls for optimizing startup time preload(); @@ -538,17 +563,39 @@ int CoreRuntime::launch(const char* appId, const char* root, const char* path, i // set profile.data path and collect/use it if it non-exists/exists. if (profile) { - char multiCoreJitProfile[strlen(localDataPath) + strlen(PROFILE_BASENAME)]; - strncpy(multiCoreJitProfile, localDataPath, strlen(localDataPath)); + char multiCoreJitProfile[strlen(localDataPath) + strlen(PROFILE_BASENAME) + 1]; + memcpy(multiCoreJitProfile, localDataPath, strlen(localDataPath) + 1); strncat(multiCoreJitProfile, PROFILE_BASENAME, strlen(PROFILE_BASENAME)); setEnvironmentVariable("COMPlus_MultiCoreJitProfile", multiCoreJitProfile); setEnvironmentVariable("COMPlus_MultiCoreJitMinNumCpus", "1"); + + if (exist(multiCoreJitProfile)) { + setEnvironmentVariable("COMPlus_MultiCoreJitNoProfileGather", "1"); + _INFO("MCJ playing start for %s", appId); + } else { + setEnvironmentVariable("COMPlus_MultiCoreJitNoProfileGather", "0"); + // stop profiling and write collected data after delay if env value is set. + char *env = getenv("CLR_MCJ_PROFILE_WRITE_DELAY"); + if (env != nullptr) { + int delay = std::atoi(env); + // To avoid undefined behavior by out-of-range input(atoi), set max delay value to 100. + if (delay > 0) { + if (delay > MAX_DELAY_SEC) delay = MAX_DELAY_SEC; + stopProfileAfterDelay(delay); + } + } + _INFO("MCJ recording start for %s", appId); + } } free(localDataPath); } - vconf_ignore_key_changed(VCONFKEY_LANGSET, langChangedCB); + if (exist(__pm->getAppRootPath() + "/bin/" + DISABLE_IPV6_FILE)) { + setSwitch("System.Net.DisableIPv6", true); + } + + setSwitch("Switch.System.Diagnostics.StackTrace.ShowILOffsets", true); pluginBeforeExecute();