From: Changgyu Choi Date: Tue, 25 Mar 2025 06:49:36 +0000 (+0900) Subject: Apply united-service for service integration X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen;p=platform%2Fcore%2Fappfw%2Fdata-provider-master.git Apply united-service for service integration Follow service will be integrated: - esd - data-provider-master - alarm-server Change-Id: I55c5321af9af1b668ea0b179d7cd57173c00afb6 Signed-off-by: Changgyu Choi --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 377f572..d954a14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,18 @@ SET(VERSION "${VERSION_MAJOR}.0.0") ADD_SUBDIRECTORY(src) +SET(SERVICE_DESCRIPTION "Data Provider Master") +SET(SERVICE_NAME "${PROJECT_NAME}") +SET(SERVICE_TYPE "simple") +SET(SERVICE_MODE "normal") +SET(SERVICE_PATH "${MOD_DIR}/mod/lib${PROJECT_NAME}.so") +SET(SERVICE_PRIORITY "10") + +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/${PROJECT_NAME}.service.in + ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}.service @ONLY) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}.service + DESTINATION ${MOD_DIR}/conf) + CONFIGURE_FILE(data-provider-master.conf.in data-provider-master.conf @ONLY) CONFIGURE_FILE(org.tizen.data-provider-master.service.in org.tizen.data_provider_service.service @ONLY) CONFIGURE_FILE(org.tizen.data_provider_service.busname.in org.tizen.data_provider_service.busname @ONLY) @@ -26,4 +38,4 @@ SET(DATA_PROVIDER_MASTER_UNIT_TESTS data-provider-master-unittests) ADD_TEST(NAME ${DATA_PROVIDER_MASTER_UNIT_TESTS} COMMAND ${DATA_PROVIDER_MASTER_UNIT_TESTS}) ADD_DEPENDENCIES(${DATA_PROVIDER_MASTER_UNIT_TESTS} data-provider-master) -ENDIF(NOT DEFINED MINIMUM_BUILD) \ No newline at end of file +ENDIF(NOT DEFINED MINIMUM_BUILD) diff --git a/data-provider-master.service.in b/data-provider-master.service.in new file mode 100644 index 0000000..1c093f0 --- /dev/null +++ b/data-provider-master.service.in @@ -0,0 +1,7 @@ +[United-Service] +Description=@SERVICE_DESCRIPTION@ +Name=@SERVICE_NAME@ +Type=@SERVICE_TYPE@ +Mode=@SERVICE_MODE@ +Path=@SERVICE_PATH@ +Priority=@SERVICE_PRIORITY@ diff --git a/include/service_common.h b/include/service_common.h index 15ebc60..34baa7e 100755 --- a/include/service_common.h +++ b/include/service_common.h @@ -52,12 +52,12 @@ typedef struct monitoring_info { int send_notify(GVariant *body, char *cmd, GHashTable **monitoring_hash, char *interface_name, uid_t uid); bool is_existed_busname(const char *sender_name); int send_event_notify_by_busname(GVariant *body, char *cmd, char *busname, char *interface_name); -int service_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, +int noti_service_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash, uid_t uid); -int service_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash, uid_t uid); +int noti_service_unregister(GVariant *parameters, GVariant **reply_body, const gchar *sender, GHashTable **monitoring_hash, uid_t uid); int delete_monitoring_list(GHashTable **monitoring_hash, const char *sender, uid_t uid); GDBusConnection *service_common_get_connection(); int service_common_register_dbus_interface(char *introspection_xml, GDBusInterfaceVTable interface_vtable); diff --git a/org.tizen.data-provider-master.service.in b/org.tizen.data-provider-master.service.in index 49d12da..1c613d5 100644 --- a/org.tizen.data-provider-master.service.in +++ b/org.tizen.data-provider-master.service.in @@ -1,4 +1,4 @@ [D-BUS Service] Name=org.tizen.data_provider_service Exec=/bin/false -SystemdService=data-provider-master.service +SystemdService=esd.service diff --git a/org.tizen.data_provider_service.busname.in b/org.tizen.data_provider_service.busname.in index 67fe55e..f057bf8 100644 --- a/org.tizen.data_provider_service.busname.in +++ b/org.tizen.data_provider_service.busname.in @@ -5,5 +5,5 @@ DefaultDependencies=no [BusName] Name=org.tizen.data_provider_service -Service=data-provider-master.service +Service=esd.service AllowWorld=talk diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index 6c9a4aa..a142fa0 100644 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -7,7 +7,7 @@ Release: 1 Group: Applications/Core Applications License: Apache-2.0 Source0: %{name}-%{version}.tar.gz -Source1: data-provider-master.service +# Source1: data-provider-master.service Source1001: %{name}.manifest BuildRequires: cmake, gettext-tools, smack, coreutils BuildRequires: pkgconfig(dlog) @@ -30,6 +30,8 @@ BuildRequires: pkgconfig(alarm-service) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(security-manager) BuildRequires: pkgconfig(gmock) +BuildRequires: pkgconfig(tizen-core) +BuildRequires: pkgconfig(united-service) %if 0%{?gcov:1} BuildRequires: lcov @@ -63,6 +65,9 @@ Group: Application Framework/Testing gcov objects of a data provider master %endif +%define _modname esd +%define _moddir %{_datadir}/united-service/%{_modname} + %prep %setup -q cp %{SOURCE1001} . @@ -84,6 +89,7 @@ export TARGET=device %endif %cmake . \ + -DMOD_DIR=%{_moddir} \ -DNAME=%{name} \ -DTARGET=${TARGET} \ -DMAJORVER=${MAJORVER} \ @@ -102,7 +108,7 @@ genhtml %{name}.info -o out --legend --show-details rm -rf %{buildroot} %make_install mkdir -p %{buildroot}%{_prefix}/lib/systemd/system -install -m 0644 %SOURCE1 %{buildroot}%{_unitdir}/data-provider-master.service +# install -m 0644 %SOURCE1 %{buildroot}%{_unitdir}/data-provider-master.service install -m 0644 org.tizen.data_provider_service.busname %{buildroot}%{_unitdir}/org.tizen.data_provider_service.busname @@ -147,13 +153,14 @@ install -m 0755 run-unittest.sh %{buildroot}%{_bindir}/tizen-unittests/%{name}/ %manifest %{name}.manifest %defattr(-,root,root,-) %license LICENSE -%attr(0755,root,root) %{_bindir}/data-provider-master -%attr(0644,root,root) %{_unitdir}/data-provider-master.service +# %attr(0755,root,root) %{_bindir}/data-provider-master +# %attr(0644,root,root) %{_unitdir}/data-provider-master.service %attr(0644,root,root) %{_datadir}/dbus-1/system-services/org.tizen.data_provider_service.service %attr(0644,root,root) %{_unitdir}/org.tizen.data_provider_service.busname %{_unitdir}/busnames.target.wants/org.tizen.data_provider_service.busname %config %{_sysconfdir}/dbus-1/system.d/data-provider-master.conf -%{_prefix}/bin/%{name} +%{_moddir}/mod/libdata-provider-master.so +%{_moddir}/conf/data-provider-master.service #%defattr(-,owner,users,-) ################################################# diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c6e0a37..6921025 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,6 +19,8 @@ pkg_check_modules(pkgs REQUIRED alarm-service libtzplatform-config security-manager + tizen-core + united-service ) FOREACH(flag ${pkgs_CFLAGS}) @@ -26,6 +28,7 @@ FOREACH(flag ${pkgs_CFLAGS}) ENDFOREACH(flag) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wall -Werror -Winline") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS} -std=c++17") SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") SET(CMAKE_CXX_FLAGS_RELEASE "-O2") @@ -34,10 +37,13 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../include) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/.) AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCES) -ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCES}) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SOURCES}) -SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${EXTRA_CFLAGS} -fPIE") -SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-pie") -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${EXTRA_CFLAGS} -fPIC") +# SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} "-lpthread -ldl") -INSTALL(TARGETS ${PROJECT_NAME} DESTINATION /usr/bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) \ No newline at end of file +INSTALL(TARGETS ${PROJECT_NAME} + DESTINATION ${MOD_DIR}/mod + COMPONENT RuntimeLibraries +) diff --git a/src/main.cc b/src/main.cc index 7d24620..75c3c8a 100644 --- a/src/main.cc +++ b/src/main.cc @@ -37,9 +37,19 @@ #include "notification_service.h" #include "notification_ex_service.h" -static GMainLoop *main_loop; -static GIOChannel *channel; -static guint source; +#include +#include + +#undef EXPORT +#define EXPORT __attribute__((visibility("default"))) + +#undef API +#define API extern "C" EXPORT + +tizen_core_poll_fd_h poll_fd = NULL; +tizen_core_source_h __source = NULL; + +static service_h __service; static void lang_key_changed_cb(keynode_t *node, void *first) { @@ -99,113 +109,179 @@ static inline int app_terminate(void) return 0; } -static gboolean __signal_handler(GIOChannel *channel, - GIOCondition cond, gpointer data) -{ - struct signalfd_siginfo fdsi; - ssize_t size; - int sfd; - - sfd = g_io_channel_unix_get_fd(channel); - - size = read(sfd, &fdsi, sizeof(struct signalfd_siginfo)); - if (size != sizeof(struct signalfd_siginfo)) { - ERR("signal read failed [%d]", errno); - return TRUE; - } - - if (fdsi.ssi_signo == SIGTERM) { - ERR("Terminated(SIGTERM)"); - g_main_loop_quit(main_loop); - } else { - ERR("Unknown SIG[%d] received", fdsi.ssi_signo); - } - - return TRUE; +static bool signal_handler_dispatch(tizen_core_source_h source, + void* user_data) { + int fd = -1; + tizen_core_poll_fd_get_fd(poll_fd, &fd); + + struct signalfd_siginfo fdsi; + ssize_t size = read(fd, &fdsi, sizeof(fdsi)); + if (size != sizeof(fdsi)) { + ERR("signal read failed [%d]", errno); + return true; // Retry on EAGAIN + } + + if (fdsi.ssi_signo == SIGTERM) { + ERR("Terminated(SIGTERM)"); + service_quit(__service); + return false; // Remove the source + } else { + ERR("Unknown SIG[%d] received", fdsi.ssi_signo); + } + + return true; // Continue listening for more signals } static int __init_signal_handler(void) { - sigset_t mask; - int sfd; - int ret; - - ret = sigemptyset(&mask); - if (ret < 0) { - ERR("sigemptyset : %d", errno); - return -1; - } - - ret = sigaddset(&mask, SIGTERM); - if (ret < 0) { - ERR("sigaddset: %d", errno); - return -1; - } - - ret = sigprocmask(SIG_BLOCK, &mask, NULL); - if (ret < 0) { - ERR("sigprocmask: %d", errno); - return -1; - } - - sfd = signalfd(-1, &mask, SFD_NONBLOCK); - if (sfd < 0) { - ERR("signalfd: %d", errno); - return -1; - } - - channel = g_io_channel_unix_new(sfd); - g_io_channel_set_close_on_unref(channel, TRUE); - g_io_channel_set_encoding(channel, NULL, NULL); - g_io_channel_set_buffered(channel, FALSE); - - source = g_io_add_watch(channel, G_IO_IN, __signal_handler, NULL); - - INFO("source[%u]", source); - - return 0; + sigset_t mask; + int sfd; + int ret; + tizen_core_h core = NULL; + + // Step 1: Create signalfd for SIGTERM + sigemptyset(&mask); + sigaddset(&mask, SIGTERM); + ret = sigprocmask(SIG_BLOCK, &mask, NULL); + if (ret < 0) { + perror("sigprocmask"); + return -1; + } + sfd = signalfd(-1, &mask, SFD_NONBLOCK); + if (sfd < 0) { + perror("signalfd"); + return -1; + } + + // Step 2: Create and configure poll_fd + ret = tizen_core_poll_fd_create(&poll_fd); + if (ret != TIZEN_CORE_ERROR_NONE) { + perror("tizen_core_poll_fd_create"); + close(sfd); + return -1; + } + ret = tizen_core_poll_fd_set_fd(poll_fd, sfd); + if (ret != TIZEN_CORE_ERROR_NONE) { + tizen_core_poll_fd_destroy(poll_fd); + close(sfd); + return -1; + } + ret = tizen_core_poll_fd_set_events(poll_fd, TIZEN_CORE_POLL_EVENT_IN); + if (ret != TIZEN_CORE_ERROR_NONE) { + tizen_core_poll_fd_destroy(poll_fd); + close(sfd); + return -1; + } + + // Step 3: Create Tizen Core source + ret = tizen_core_source_create(&__source); + if (ret != TIZEN_CORE_ERROR_NONE) { + tizen_core_poll_fd_destroy(poll_fd); + close(sfd); + return -1; + } + + // Step 4: Add poll_fd to the source + ret = tizen_core_source_add_poll(__source, poll_fd); + if (ret != TIZEN_CORE_ERROR_NONE) { + tizen_core_source_destroy(__source); + tizen_core_poll_fd_destroy(poll_fd); + close(sfd); + return -1; + } + + // Step 5: Set callbacks + ret = tizen_core_source_set_dispatch_cb(__source, signal_handler_dispatch, + nullptr); + if (ret != TIZEN_CORE_ERROR_NONE) { + tizen_core_source_destroy(__source); + tizen_core_poll_fd_destroy(poll_fd); + close(sfd); + return -1; + } + + // Step 6: Add source to the Tizen Core + ret = tizen_core_find_from_this_thread(&core); + if (ret != TIZEN_CORE_ERROR_NONE) { + tizen_core_source_destroy(__source); + tizen_core_poll_fd_destroy(poll_fd); + close(sfd); + return -1; + } + ret = tizen_core_add_source(core, __source); + if (ret != TIZEN_CORE_ERROR_NONE) { + tizen_core_remove_source(core, __source); + tizen_core_source_destroy(__source); + tizen_core_poll_fd_destroy(poll_fd); + close(sfd); + return -1; + } + + return 0; } void __finish(void) { - if (source > 0) - g_source_remove(source); - if (channel) - g_io_channel_unref(channel); - - app_terminate(); + tizen_core_h core = nullptr; + tizen_core_find_from_this_thread(&core); + if (poll_fd != nullptr) + tizen_core_source_remove_poll(__source, poll_fd); + if (__source != nullptr) + tizen_core_remove_source(core, __source); + + app_terminate(); } -int main(int argc, char *argv[]) -{ - int restart_count = 0; - - main_loop = g_main_loop_new(NULL, FALSE); - if (!main_loop) - return -1; - +static void ServiceCreateCb(service_h service, void* user_data) { + int restart_count = 0; + DBG("ServiceCreateCb"); #if (GLIB_MAJOR_VERSION <= 2 && GLIB_MINOR_VERSION < 36) - g_type_init(); + g_type_init(); #endif - vconf_get_int(VCONFKEY_MASTER_RESTART_COUNT, &restart_count); + __service = service; - app_create(restart_count); - sd_notify(0, "READY=1"); + vconf_get_int(VCONFKEY_MASTER_RESTART_COUNT, &restart_count); + app_create(restart_count); + vconf_set_int(VCONFKEY_MASTER_RESTART_COUNT, restart_count); - restart_count++; - vconf_set_int(VCONFKEY_MASTER_RESTART_COUNT, restart_count); + if (__init_signal_handler() < 0) + ERR("Failed to init signal handler"); +} - if (__init_signal_handler() < 0) - ERR("Failed to init signal handler"); +static void ServiceDestroyCb(service_h service, void* user_data) { + DBG("ServiceDestroyCb"); + __finish(); +} - g_main_loop_run(main_loop); +static void ServiceMessageCb(service_h service, + const char* sender, + bundle* envelope, + void* user_data) { + DBG("Message. sender=%s", sender); +} - __finish(); +API int USD_MOD_INIT(const char* name) { + DBG("USD_MOD_INIT. name=%s", name); + service_lifecycle_callback_s callback = { + .create = ServiceCreateCb, + .destroy = ServiceDestroyCb, + .message = ServiceMessageCb + }; - g_main_loop_unref(main_loop); + int ret = service_register(name, &callback, nullptr); + if (ret != SERVICE_ERROR_NONE) + ERR("Failed to register service. name=%s, error=%d", name, ret); - return 0; + return ret; +} + +API void USD_MOD_SHUTDOWN(const char* name) { + ERR("UNITED_SERVICE_SHUTDOWN"); + + int ret = service_unregister(name); + if (ret != SERVICE_ERROR_NONE) + ERR("Failed to unregister service. name=%s, error=%d", name, ret); } /* End of a file */ diff --git a/src/notification_ex_service.cc b/src/notification_ex_service.cc index 4c7eb80..542a6a3 100644 --- a/src/notification_ex_service.cc +++ b/src/notification_ex_service.cc @@ -14,22 +14,23 @@ * limitations under the License. */ -#include -#include -#include -#include -#include -#include -#include -#include #include -#include +#include #include #include -#include +#include +#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -312,7 +313,16 @@ out: if (timer > 0) g_source_remove(timer); - timer = g_timeout_add(MAX_TIMEOUT, TimeoutHandler, &timer); + tizen_core_h core = nullptr; + tizen_core_find_from_this_thread(&core); + tizen_core_source_h source = nullptr; + tizen_core_add_timer( + core, MAX_TIMEOUT, + +[](void* data) -> bool { return TimeoutHandler(data); }, &timer, + &source); + + if (source == nullptr) + ERR("Failed to set timer"); } static gboolean TimeoutHandler(gpointer data) { diff --git a/src/notification_service.c b/src/notification_service.c index 3c809e2..513025e 100644 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "service_common.h" #include "notification_service.h" @@ -153,7 +154,7 @@ static void _noti_dbus_method_call_handler(GDBusConnection *conn, pid_t pid = get_sender_pid(sender); if (g_strcmp0(method_name, "noti_service_register") == 0) { - ret = service_register(parameters, &reply_body, sender, + ret = noti_service_register(parameters, &reply_body, sender, _on_name_appeared, _on_name_vanished, &_monitoring_hash, uid); if (ret == NOTIFICATION_ERROR_NONE) notification_add_private_sharing_target_id(pid, sender, uid); @@ -2831,11 +2832,11 @@ out: return ret; } -static gboolean __refresh_setting_table(gpointer data) +static bool __refresh_setting_table(void* data) { notification_setting_refresh_setting_table( tzplatform_getuid(TZ_SYS_DEFAULT_USER)); - return G_SOURCE_REMOVE; + return false; } /*! @@ -2882,7 +2883,11 @@ HAPI int notification_service_init(int restart_count) if (uids) free(uids); - g_idle_add(__refresh_setting_table, NULL); + tizen_core_h core = NULL; + tizen_core_find_from_this_thread(&core); + tizen_core_source_h source = NULL; + tizen_core_add_idle_job(core, __refresh_setting_table, NULL, &source); + // g_idle_add(__refresh_setting_table, NULL); INFO("Successfully initialized"); return NOTIFICATION_ERROR_NONE; diff --git a/src/service_common.cc b/src/service_common.cc index bea0230..d074487 100644 --- a/src/service_common.cc +++ b/src/service_common.cc @@ -370,7 +370,7 @@ static int _monitoring_app_list_compare_cb(gconstpointer a, gconstpointer b) { return strcmp(static_cast(a), reinterpret_cast(b)); } -int service_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, +int noti_service_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, GHashTable **monitoring_hash, @@ -388,7 +388,7 @@ int service_register(GVariant *parameters, GVariant **reply_body, const gchar *s if (uid > NORMAL_UID_BASE && uid != request_uid) return SERVICE_COMMON_ERROR_IO_ERROR; - DBG("service_register : uid %d , request_uid %d", uid, request_uid); + DBG("noti_service_register : uid %d , request_uid %d", uid, request_uid); monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)); added_list = g_list_find_custom(monitoring_list, bus_name, (GCompareFunc)_monitoring_app_list_compare_cb); diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt index 5aad466..dbf5338 100644 --- a/tests/unit_tests/CMakeLists.txt +++ b/tests/unit_tests/CMakeLists.txt @@ -22,6 +22,7 @@ PKG_CHECK_MODULES(data-provider-master-unittests REQUIRED alarm-service libtzplatform-config security-manager + tizen-core ) FOREACH(flag ${data-provider-master-unittests_CFLAGS}) diff --git a/tests/unit_tests/src/test_service_common.cc b/tests/unit_tests/src/test_service_common.cc index e0c93e7..8b5246e 100644 --- a/tests/unit_tests/src/test_service_common.cc +++ b/tests/unit_tests/src/test_service_common.cc @@ -80,7 +80,7 @@ TEST_F(ServiceCommonServiceTest, get_sender_pid) { EXPECT_EQ(pid, 11); } -TEST_F(ServiceCommonServiceTest, service_register) { +TEST_F(ServiceCommonServiceTest, noti_service_register) { GVariant* param = g_variant_new("(i)", 5001); GVariant* reply; GHashTable* hash = g_hash_table_new(g_direct_hash, g_direct_equal); @@ -89,7 +89,7 @@ TEST_F(ServiceCommonServiceTest, service_register) { _, _, _, _, _, _, _)) .WillRepeatedly(Return(1)); - int ret = service_register(param, &reply, "sender", nullptr, nullptr, &hash, + int ret = noti_service_register(param, &reply, "sender", nullptr, nullptr, &hash, 5001); EXPECT_EQ(ret, SERVICE_COMMON_ERROR_NONE); }