#include <sys/wait.h>
#include <unistd.h>
#include <linux/limits.h>
+#include <pthread.h>
-#include <storage.h>
#include <vconf.h>
#include <app_common.h>
+#include <tzplatform_config.h>
#include <Ecore.h>
}
}
-static bool storage_cb(int id, storage_type_e type, storage_state_e state, const char *path, void *user_data)
-{
- int* tmp = (int*)user_data;
- if (type == STORAGE_TYPE_INTERNAL)
- {
- *tmp = id;
- return false;
- }
-
- return true;
-}
-
-static void setSpecialFolder(storage_directory_e type, const char* key)
-{
- int error;
- char* path = NULL;
- static int __storageId = -1;
-
- if (__storageId < 0) {
- error = storage_foreach_device_supported(storage_cb, &__storageId);
- if (error != STORAGE_ERROR_NONE) {
- return;
- }
- }
-
- error = storage_get_directory(__storageId, type, &path);
- if (error == STORAGE_ERROR_NONE && path != NULL) {
- setenv(key, const_cast<char *>(path), 1);
- free(path);
- }
-}
-
static void initEnvForSpecialFolder()
{
+ const char* path = NULL;
if (getenv("XDG_PICTURES_DIR") == NULL) {
- setSpecialFolder(STORAGE_DIRECTORY_IMAGES, "XDG_PICTURES_DIR");
+ path = tzplatform_getenv(TZ_USER_IMAGES);
+ if (path) {
+ setenv("XDG_PICTURES_DIR", path, 1);
+ }
}
if (getenv("XDG_MUSIC_DIR") == NULL) {
- setSpecialFolder(STORAGE_DIRECTORY_MUSIC, "XDG_MUSIC_DIR");
+ path = tzplatform_getenv(TZ_USER_MUSIC);
+ if (path) {
+ setenv("XDG_MUSIC_DIR", path, 1);
+ }
}
if (getenv("XDG_VIDEOS_DIR") == NULL) {
- setSpecialFolder(STORAGE_DIRECTORY_VIDEOS, "XDG_VIDEOS_DIR");
+ path = tzplatform_getenv(TZ_USER_VIDEOS);
+ if (path) {
+ setenv("XDG_VIDEOS_DIR", path, 1);
+ }
}
}
static void setLang()
{
+ //To reduce search overhead of libicuuc.so.xx
+ setenv("CLR_ICU_VERSION_OVERRIDE", "build", 1);
+
char* lang = vconf_get_str(VCONFKEY_LANGSET);
if (!lang) {
_ERR("Fail to get language from vconf");
return -1;
}
- // Intiailize ecore first (signal handlers, etc.) before runtime init.
- ecore_init();
-
// set language environment to support ICU
setLang();
// 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
// See https://github.com/dotnet/coreclr/issues/6698
//
// libunwind use following methods to unwind stack frame.
- // UNW_ARM_METHOD_ALL 0xFF
- // UNW_ARM_METHOD_DWARF 0x01
- // UNW_ARM_METHOD_FRAME 0x02
- // UNW_ARM_METHOD_EXIDX 0x04
+ // UNW_ARM_METHOD_ALL 0xFF
+ // UNW_ARM_METHOD_DWARF 0x01
+ // UNW_ARM_METHOD_FRAME 0x02
+ // UNW_ARM_METHOD_EXIDX 0x04
putenv(const_cast<char *>("UNW_ARM_UNWIND_METHOD=6"));
#endif // __arm__
// Disable config cache to set environment after coreclr_initialize()
putenv(const_cast<char *>("COMPlus_DisableConfigCache=1"));
+ // Set environment variable for System.Environment.SpecialFolder
+ initEnvForSpecialFolder();
+
// read string from external file and set them to environment value.
setEnvFromFile();
__pm->setExtraDllPaths(pluginExtraDllPaths);
}
- pluginHasLogControl();
-
std::string libCoreclr(concatPath(__pm->getRuntimePath(), "libcoreclr.so"));
__coreclrLib = dlopen(libCoreclr.c_str(), RTLD_NOW | RTLD_LOCAL);
_INFO("libcoreclr dlopen and dlsym success");
- // Set environment for System.Environment.SpecialFolder
- // Below function creates dbus connection by callging storage API.
- // If dbus connection is created bofere fork(), forked process cannot use dbus.
- // To avoid gdbus blocking issue, below function should be called after fork()
- initEnvForSpecialFolder();
-
std::string tpa;
char* pluginTPA = pluginGetTPA();
if (pluginTPA && pluginTPA[0] != '\0') {
return -1;
}
+ // VD has their own signal handler.
+ if (!pluginHasLogControl()) {
+ registerSigHandler();
+ }
+
int st = createDelegate(__hostHandle, __domainId, "Tizen.Runtime", "Tizen.Runtime.Environment", "SetEnvironmentVariable", (void**)&setEnvironmentVariable);
if (st < 0 || setEnvironmentVariable == nullptr) {
_ERR("Create delegate for Tizen.Runtime.dll -> Tizen.Runtime.Environment -> SetEnvironmentVariable failed (0x%08x)", st);
}
if (launchMode == LaunchMode::loader) {
-
// preload libraries and manage dlls for optimizing startup time
preload();
checkOnTerminate = true;
// workaround : to prevent crash while process terminate on profiling mode,
- // kill process immediately.
+ // kill process immediately.
// see https://github.com/dotnet/coreclr/issues/26687
if (__isProfileMode) {
_INFO("shutdown process immediately.");
return -1;
}
- // VD has their own signal handler.
- if (!pluginHasLogControl()) {
- registerSigHandler();
- }
-
pluginSetAppInfo(appId, path);
// temporal root path is overrided to real application root path