From fe1cd63bcf2f9d57946f37258b571325af5caac0 Mon Sep 17 00:00:00 2001 From: Seonah Moon Date: Fri, 16 Jul 2021 11:24:54 +0900 Subject: [PATCH] event-loop: handles idle event Change-Id: I6858826eeba960ddeb0928930462e4d4f848fd5f --- packaging/capi-network-vine.spec | 2 +- plugins/ble-gatt/ble-gatt-plugin.cpp | 5 ++-- src/include/vine-event-loop.h | 6 +++++ src/vine-data-path.cpp | 2 +- src/vine-event-loop-epoll.cpp | 10 ++++++++ src/vine-event-loop-glib.cpp | 50 +++++++++++++++++++++++++++++++++++- src/vine-event-loop.cpp | 7 +++++ 7 files changed, 76 insertions(+), 6 deletions(-) diff --git a/packaging/capi-network-vine.spec b/packaging/capi-network-vine.spec index 71a4b99..ddff2eb 100755 --- a/packaging/capi-network-vine.spec +++ b/packaging/capi-network-vine.spec @@ -3,7 +3,7 @@ %bcond_without use_glib_event_loop Name: capi-network-vine Summary: An service discovery framework -Version: 1.1.4 +Version: 1.1.5 Release: 0 Group: Network & Connectivity/API License: Apache-2.0 diff --git a/plugins/ble-gatt/ble-gatt-plugin.cpp b/plugins/ble-gatt/ble-gatt-plugin.cpp index 56802c4..70d48ed 100755 --- a/plugins/ble-gatt/ble-gatt-plugin.cpp +++ b/plugins/ble-gatt/ble-gatt-plugin.cpp @@ -661,9 +661,8 @@ int gatt_open(vine_dp_plugin_h handle, int addr_family, VINE_LOGI("Succeeded to start GATT server."); - // TODO - //if (g_callbacks.opened_cb) - // g_callbacks.opened_cb(VINE_DATA_PATH_ERROR_NONE, -1, gatt->user); + if (g_callbacks.opened_cb) + g_callbacks.opened_cb(VINE_DATA_PATH_ERROR_NONE, -1, gatt->user); return VINE_DATA_PATH_ERROR_NONE; ERR: diff --git a/src/include/vine-event-loop.h b/src/include/vine-event-loop.h index 05379c4..ee9630a 100755 --- a/src/include/vine-event-loop.h +++ b/src/include/vine-event-loop.h @@ -60,6 +60,9 @@ int vine_event_loop_add_event(vine_event_queue_h event_queue, void *event_data, vine_event_handler handler, vine_event_free_handler free_func, void *user_data); +int vine_event_loop_add_idle_event(vine_event_queue_h event_queue, void *event_data, + vine_event_handler handler, vine_event_free_handler free_func, + void *user_data); typedef struct { int (*init)(); @@ -76,6 +79,9 @@ typedef struct { int (*add_event)(vine_event_queue_h event_queue, void *event_data, vine_event_handler handler, vine_event_free_handler free_func, void *user_data); + int (*add_idle_event)(vine_event_queue_h event_queue, void *event_data, + vine_event_handler handler, vine_event_free_handler free_func, + void *user_data); } vine_event_loop_fn; #define MAX_VINE_FDS 512 diff --git a/src/vine-data-path.cpp b/src/vine-data-path.cpp index 5dce302..0458549 100755 --- a/src/vine-data-path.cpp +++ b/src/vine-data-path.cpp @@ -258,7 +258,7 @@ static void __opened_cb(int result, int port, void *user_data) opened_event->result = result; opened_event->port = port; - vine_event_loop_add_event(dp->event_queue, opened_event, + vine_event_loop_add_idle_event(dp->event_queue, opened_event, __invoke_opened_user_cb, free, dp); } diff --git a/src/vine-event-loop-epoll.cpp b/src/vine-event-loop-epoll.cpp index e8815dd..626da1c 100755 --- a/src/vine-event-loop-epoll.cpp +++ b/src/vine-event-loop-epoll.cpp @@ -288,6 +288,15 @@ int vine_event_loop_epoll_add_event(vine_event_queue_h event_queue, void *event_ return VINE_ERROR_NONE; } +// event-loop-epoll processes the events whenever idle time. +// Therefore, this works the same with vine_event_loop_epoll_add_event(). +int vine_event_loop_epoll_add_idle_event(vine_event_queue_h event_queue, void *event_data, + vine_event_handler handler, vine_event_free_handler free_func, + void *user_data) +{ + return vine_event_loop_epoll_add_event(event_queue, event_data, handler, free_func, user_data); +} + int vine_event_loop_epoll_process(vine_event_queue_h event_queue) { VINE_LOGD("Process a vine event. event_queue[%p]", event_queue); @@ -338,4 +347,5 @@ vine_event_loop_fn vine_event_loop_epoll = { .mod_io_handler = vine_event_loop_epoll_mod_io_handler, .del_io_handler = vine_event_loop_epoll_del_io_handler, .add_event = vine_event_loop_epoll_add_event, + .add_idle_event = vine_event_loop_epoll_add_idle_event, }; diff --git a/src/vine-event-loop-glib.cpp b/src/vine-event-loop-glib.cpp index 390eb51..35a0b87 100755 --- a/src/vine-event-loop-glib.cpp +++ b/src/vine-event-loop-glib.cpp @@ -27,6 +27,13 @@ #include "vine-utils.h" typedef struct { + void *event_data; + vine_event_handler handler; + vine_event_free_handler free_func; + void *user_data; +} vine_glib_idle_event_handler; + +typedef struct { int fd; vine_poll_handler handler; void *user_data; @@ -202,6 +209,46 @@ int vine_event_loop_glib_add_event(vine_event_queue_h event_queue, void *event_d return VINE_ERROR_NONE; } +static gboolean _handle_idle_event(gpointer user_data) +{ + RET_VAL_IF(user_data == NULL, VINE_ERROR_INVALID_PARAMETER, "user_data is NULL"); + + vine_glib_idle_event_handler *idle_handler = (vine_glib_idle_event_handler *)user_data; + VINE_LOGD("event_data[%p]", idle_handler->event_data); + + if (idle_handler->handler) + idle_handler->handler(idle_handler->event_data, idle_handler->user_data); + + if (idle_handler->free_func) + idle_handler->free_func(idle_handler->event_data); + + free(idle_handler); + + return FALSE; +} + +int vine_event_loop_glib_add_idle_event(vine_event_queue_h event_queue, void *event_data, + vine_event_handler handler, vine_event_free_handler free_func, + void *user_data) +{ + // Ignore event_queue + + RET_VAL_IF(handler == NULL, VINE_ERROR_INVALID_PARAMETER, "handler is NULL"); + VINE_LOGD("event_data[%p]", event_data); + + vine_glib_idle_event_handler *idle_handler = + (vine_glib_idle_event_handler *) calloc(1, sizeof(vine_glib_idle_event_handler)); + RET_VAL_IF(idle_handler == NULL, VINE_ERROR_INVALID_PARAMETER, "idle_handler is NULL"); + + idle_handler->event_data = event_data; + idle_handler->handler = handler; + idle_handler->free_func = free_func; + idle_handler->user_data = user_data; + g_idle_add(_handle_idle_event, idle_handler); + + return VINE_ERROR_NONE; +} + int vine_event_loop_glib_process(vine_event_queue_h event_queue) { return VINE_ERROR_NONE; @@ -220,6 +267,7 @@ vine_event_loop_fn vine_event_loop_glib = { .mod_io_handler = vine_event_loop_glib_mod_io_handler, .del_io_handler = vine_event_loop_glib_del_io_handler, .add_event = vine_event_loop_glib_add_event, + .add_idle_event = vine_event_loop_glib_add_idle_event, }; -#endif // USE_VINE_EVENT_LOOP_EXTERNAL_GLIB \ No newline at end of file +#endif // USE_VINE_EVENT_LOOP_EXTERNAL_GLIB diff --git a/src/vine-event-loop.cpp b/src/vine-event-loop.cpp index 950edf0..e5ce195 100755 --- a/src/vine-event-loop.cpp +++ b/src/vine-event-loop.cpp @@ -121,6 +121,13 @@ int vine_event_loop_add_event(vine_event_queue_h event_queue, void *event_data, return __event_loop[__event_loop_type].add_event(event_queue, event_data, handler, free_func, user_data); } +int vine_event_loop_add_idle_event(vine_event_queue_h event_queue, void *event_data, + vine_event_handler handler, vine_event_free_handler free_func, + void *user_data) +{ + return __event_loop[__event_loop_type].add_idle_event(event_queue, event_data, handler, free_func, user_data); +} + int vine_event_loop_process(vine_event_queue_h event_queue) { return __event_loop[__event_loop_type].process(event_queue); -- 2.7.4