event-loop: handles idle event 56/261356/2
authorSeonah Moon <seonah1.moon@samsung.com>
Fri, 16 Jul 2021 02:24:54 +0000 (11:24 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Fri, 16 Jul 2021 06:43:32 +0000 (15:43 +0900)
Change-Id: I6858826eeba960ddeb0928930462e4d4f848fd5f

packaging/capi-network-vine.spec
plugins/ble-gatt/ble-gatt-plugin.cpp
src/include/vine-event-loop.h
src/vine-data-path.cpp
src/vine-event-loop-epoll.cpp
src/vine-event-loop-glib.cpp
src/vine-event-loop.cpp

index 71a4b99..ddff2eb 100755 (executable)
@@ -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
index 56802c4..70d48ed 100755 (executable)
@@ -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:
index 05379c4..ee9630a 100755 (executable)
@@ -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
index 5dce302..0458549 100755 (executable)
@@ -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);
 }
 
index e8815dd..626da1c 100755 (executable)
@@ -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,
 };
index 390eb51..35a0b87 100755 (executable)
 #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
index 950edf0..e5ce195 100755 (executable)
@@ -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);