From 61b9bf36a16f9668acd0f4635c26c78906710b29 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 12 Jan 2024 08:55:47 +0900 Subject: [PATCH] tizen-core: Use tizen core From Tizen 9.0, Tizen Core is supported. Tizen Core is a ne main loop model that privdes improved functionality over the existing GMainLoop. It allows for creation of multiple loops in diffrent threads, enabling safe communication between them. Change-Id: Idd39edd042652478775ff624e87383b1c1c590e6 Signed-off-by: Hwankyu Jhun --- meson_options.txt | 6 +++ packaging/efl.spec | 5 ++- src/lib/ecore/ecore_glib.c | 11 +++++- src/lib/ecore/ecore_main.c | 26 ++++++++++--- src/lib/ecore/meson.build | 7 ++++ src/lib/ecore/tizen-core/log_private.h | 21 +++++++++++ src/lib/ecore/tizen-core/tcore.cc | 67 ++++++++++++++++++++++++++++++++++ src/lib/ecore/tizen-core/tcore.h | 22 +++++++++++ 8 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 src/lib/ecore/tizen-core/log_private.h create mode 100644 src/lib/ecore/tizen-core/tcore.cc create mode 100644 src/lib/ecore/tizen-core/tcore.h diff --git a/meson_options.txt b/meson_options.txt index a126225..94aab62 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -415,3 +415,9 @@ option('efl-one', value : false, description : 'Build special set of .so´s as a single .so' ) + +option('tizen-core', + type : 'boolean', + value : false, + description : 'Use tizen core in efl' +) diff --git a/packaging/efl.spec b/packaging/efl.spec index 3b52e84..2c15b81 100644 --- a/packaging/efl.spec +++ b/packaging/efl.spec @@ -135,6 +135,8 @@ BuildRequires: pkgconfig(libdrm) BuildRequires: pkgconfig(wayland-client) BuildRequires: pkgconfig(wayland-server) +BuildRequires: pkgconfig(tizen-core) + ############ efl Provides: efl-data Obsoletes: efl-data @@ -1191,7 +1193,8 @@ meson setup \ --buildtype plain \ --prefix /usr \ --libdir %{_libdir} \ - -Dcpp_std=gnu++11 \ + -Dcpp_std=gnu++17 \ + -Dtizen-core=true \ builddir 2>&1 sed -i.bak -e "s/soname,libelementary_t/soname,libelementary/g" builddir/build.ninja diff --git a/src/lib/ecore/ecore_glib.c b/src/lib/ecore/ecore_glib.c index 02678e1..f9b4d9f 100644 --- a/src/lib/ecore/ecore_glib.c +++ b/src/lib/ecore/ecore_glib.c @@ -20,6 +20,10 @@ #include "Ecore.h" #include "ecore_private.h" +#ifdef USE_TIZEN_CORE +#include "tizen-core/tcore.h" +#endif // USE_TIZEN_CORE + #ifdef HAVE_GLIB # include @@ -234,14 +238,17 @@ _ecore_glib_get_tizen_context(void) { static GMainContext *ctx; static int initialized; - const char *env; if (initialized) return ctx; - env = getenv("TIZEN_GLIB_CONTEXT"); +#ifdef USE_TIZEN_CORE + if (tcore_ready()) ctx = (GMainContext*)tcore_get_glib_context(); +#else + const char *env = getenv("TIZEN_GLIB_CONTEXT"); if (env) ctx = (GMainContext *)strtoul(env, NULL, 10); +#endif // USE_TIZEN_CORE initialized = 1; return ctx; diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index fe9fd0c..841c36b 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -22,6 +22,10 @@ #include "efl_tracing.h" +#ifdef USE_TIZEN_CORE +#include "tizen-core/tcore.h" +#endif // USE_TIZEN_CORE + #ifdef HAVE_IEEEFP_H # include // for Solaris #endif @@ -1104,8 +1108,10 @@ _ecore_main_loop_setup(Eo *obj, Efl_Loop_Data *pd) DBG("loaded dlsyms uv"); #endif +#ifdef USE_TIZEN_CORE + tcore_init(); // setup for the g_main_loop only integration -#ifdef USE_G_MAIN_LOOP +#elif USE_G_MAIN_LOOP ecore_glib_source = g_source_new(&ecore_gsource_funcs, sizeof(GSource)); if (!ecore_glib_source) CRI("Failed to create glib source for epoll!"); @@ -1153,7 +1159,9 @@ _ecore_main_loop_clear(Eo *obj, Efl_Loop_Data *pd) if (obj == ML_OBJ) { _ecore_main_timechanges_stop(obj); -#ifdef USE_G_MAIN_LOOP +#ifdef USE_TIZEN_CORE + tcore_shutdown(); +#elif USE_G_MAIN_LOOP if (ecore_glib_source) { g_source_destroy(ecore_glib_source); @@ -1284,17 +1292,23 @@ static GMainContext * _ecore_glib_get_tizen_context(void) { const char *env; - GMainContext *ctx; + static GMainContext *ctx; + static int initialized; + if (initialized) return ctx; + +#ifdef USE_TIZEN_CORE + if (tcore_ready()) ctx = (GMainContext *)tcore_get_glib_context(); +#else env = getenv("TIZEN_GLIB_CONTEXT"); if (env) ctx = (GMainContext *)strtoul(env, NULL, 10); - else - ctx = NULL; +#endif // USE_TIZEN_CORE + initialized = 1; return ctx; } -#endif +#endif // USE_G_MAIN_LOOP void _ecore_main_loop_begin(Eo *obj, Efl_Loop_Data *pd) diff --git a/src/lib/ecore/meson.build b/src/lib/ecore/meson.build index 1d092df..5faf73a 100644 --- a/src/lib/ecore/meson.build +++ b/src/lib/ecore/meson.build @@ -205,6 +205,13 @@ if get_option('g-mainloop') == true endif endif +if get_option('tizen-core') == true + ecore_ext_deps += dependency('tizen-core') + ecore_ext_deps += dependency('dlog') + ecore_src += files(['tizen-core/tcore.cc']) + config_h.set('USE_TIZEN_CORE', '1') +endif + ecore_lib = library('ecore', ecore_src, pub_eo_file_target, dependencies: ecore_pub_deps + [ecore_deps, ecore_ext_deps], diff --git a/src/lib/ecore/tizen-core/log_private.h b/src/lib/ecore/tizen-core/log_private.h new file mode 100644 index 0000000..7669401 --- /dev/null +++ b/src/lib/ecore/tizen-core/log_private.h @@ -0,0 +1,21 @@ +#ifndef _LOG_PRIVATE_H +#define _LOG_PRIVATE_H + +#include + +#undef LOG_TAG +#define LOG_TAG "TCORE" + +#undef _E +#define _E LOGE + +#undef _W +#define _W LOGW + +#undef _I +#define _I LOGI + +#undef _D +#define _D LOGD + +#endif /* _LOG_PRIVATE_H */ \ No newline at end of file diff --git a/src/lib/ecore/tizen-core/tcore.cc b/src/lib/ecore/tizen-core/tcore.cc new file mode 100644 index 0000000..16e8208 --- /dev/null +++ b/src/lib/ecore/tizen-core/tcore.cc @@ -0,0 +1,67 @@ +#include "tcore.h" + +#include +#include + +#include "log_private.h" + +namespace { + +class TCore { + public: + bool Init() { + if (!disposed_) return true; + + _D("Init()"); + if (tizen_core_ready()) { + int ret = tizen_core_task_create("main", false, &tizen_core_task_); + if (ret != TIZEN_CORE_ERROR_NONE) { + _E("tizen_core_task_create() is failed"); + } else { + tizen_core_task_get_tizen_core(tizen_core_task_, &tizen_core_); + ready_ = true; + } + } + + disposed_ = false; + return true; + } + + void Dispose() { + if (disposed_) return; + + _D("Dispose()"); + if (tizen_core_task_ != nullptr) { + tizen_core_task_destroy(tizen_core_task_); + tizen_core_task_ = nullptr; + tizen_core_ = nullptr; + } + + ready_ = false; + disposed_ = true; + } + + bool IsReady() const { return ready_; } + + void* GetGLibContext() const { + return tizen_core_get_glib_context(tizen_core_); + } + + private: + bool disposed_ = true; + bool ready_ = false; + tizen_core_h tizen_core_ = nullptr; + tizen_core_task_h tizen_core_task_ = nullptr; +}; + +TCore core; + +} // namespace + +void* tcore_get_glib_context(void) { return core.GetGLibContext(); } + +bool tcore_ready(void) { return core.IsReady(); } + +int tcore_init(void) { return core.Init(); } + +void tcore_shutdown(void) { core.Dispose(); } diff --git a/src/lib/ecore/tizen-core/tcore.h b/src/lib/ecore/tizen-core/tcore.h new file mode 100644 index 0000000..562d057 --- /dev/null +++ b/src/lib/ecore/tizen-core/tcore.h @@ -0,0 +1,22 @@ +#ifndef _TCORE_H +#define _TCORE_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void *tcore_get_glib_context(void); + +bool tcore_ready(void); + +int tcore_init(void); + +void tcore_shutdown(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _TCORE_H */ -- 2.7.4