Eina_Bool _elm_module_load(Elm_Module *m) { char buf[PATH_MAX]; if (m->module) return EINA_TRUE; if (strchr(m->name, '/')) return EINA_FALSE; if (getenv("ELM_RUN_IN_TREE")) { snprintf(buf, sizeof(buf), ELM_TOP_BUILD_DIR "/src/modules/%s/.libs/module"EFL_SHARED_EXTENSION, m->name); } else { snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s/module"EFL_SHARED_EXTENSION, _elm_lib_dir, m->name, MODULE_ARCH); } m->module = eina_module_new(buf); if ((m->module) && (eina_module_load(m->module) == EINA_TRUE)) { m->init_func = eina_module_symbol_get(m->module, "elm_modapi_init"); if (m->init_func) { m->shutdown_func = eina_module_symbol_get(m->module, "elm_modapi_shutdown"); m->so_path = eina_stringshare_add(buf); snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s", _elm_lib_dir, m->name, MODULE_ARCH); m->bin_dir = eina_stringshare_add(buf); snprintf(buf, sizeof(buf), "%s/elementary/modules/%s", _elm_lib_dir, m->name); m->data_dir = eina_stringshare_add(buf); } else { if (m->module) { eina_module_unload(m->module); eina_module_free(m->module); m->module = NULL; } return EINA_FALSE; } } else if (m->module) { eina_module_free(m->module); m->module = NULL; } if (!m->module) return EINA_FALSE; return EINA_TRUE; }
EAPI Eina_Bool eina_module_free(Eina_Module *m) { EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE); DBG("m=%p, handle=%p, file=%s, refs=%d", m, m->handle, m->file, m->ref); if (m->handle) if (eina_module_unload(m) == EINA_FALSE) return EINA_FALSE; free(m); return EINA_TRUE; }
void _elm_module_unload(Elm_Module *m) { eina_stringshare_del(m->so_path); eina_stringshare_del(m->data_dir); eina_stringshare_del(m->bin_dir); ELM_SAFE_FREE(m->api, free); if (m->module) { if (m->shutdown_func) m->shutdown_func(m); eina_module_unload(m->module); eina_module_free(m->module); m->module = NULL; } m->shutdown_func = NULL; m->init_func = NULL; }
Eina_Bool _elm_module_load(Elm_Module *m) { const char *home; char buf[PATH_MAX]; if (m->module) return EINA_TRUE; home = getenv("HOME"); if (home) { snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s/%s/module" EFL_SHARED_EXTENSION, home, m->name, MODULE_ARCH); m->module = eina_module_new(buf); if (m->module && eina_module_load (m->module) == EINA_TRUE) { m->init_func = eina_module_symbol_get(m->module, "elm_modapi_init"); if (m->init_func) { m->shutdown_func = eina_module_symbol_get(m->module, "elm_modapi_shutdown"); m->so_path = eina_stringshare_add(buf); snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s/%s", home, m->name, MODULE_ARCH); m->bin_dir = eina_stringshare_add(buf); snprintf(buf, sizeof(buf), "%s/"ELEMENTARY_BASE_DIR"/modules/%s", home, m->name); m->data_dir = eina_stringshare_add(buf); } else { if (m->module) { eina_module_unload(m->module); eina_module_free(m->module); m->module = NULL; } return EINA_FALSE; } } else if (m->module) { eina_module_free(m->module); m->module = NULL; } } if (!m->module) { snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s/module" EFL_SHARED_EXTENSION, _elm_lib_dir, m->name, MODULE_ARCH); m->module = eina_module_new(buf); if (m->module && eina_module_load (m->module) == EINA_TRUE) { m->init_func = eina_module_symbol_get(m->module, "elm_modapi_init"); if (m->init_func) { m->shutdown_func = eina_module_symbol_get(m->module, "elm_modapi_shutdown"); m->so_path = eina_stringshare_add(buf); snprintf(buf, sizeof(buf), "%s/elementary/modules/%s/%s", _elm_lib_dir, m->name, MODULE_ARCH); m->bin_dir = eina_stringshare_add(buf); snprintf(buf, sizeof(buf), "%s/elementary/modules/%s", _elm_lib_dir, m->name); m->data_dir = eina_stringshare_add(buf); } else { if (m->module) { eina_module_unload(m->module); eina_module_free(m->module); m->module = NULL; } return EINA_FALSE; } } } else if (m->module) { eina_module_free(m->module); m->module = NULL; } if (!m->module) return EINA_FALSE; return EINA_TRUE; }