VINE_ADDRESS_FAMILY_IPV6,
} vine_address_family_e;
+/**
+ * @brief Enumeration for event loop
+ * @since_tizen 6.5
+ */
+typedef enum {
+ /**
+ * App uses event fd from vine
+ */
+ VINE_EVENT_LOOP_DEFAULT = 0,
+
+ /**
+ * External glib event loop
+ */
+ VINE_EVENT_LOOP_EXTERNAL_GLIB,
+} vine_event_loop_e;
+
/**
* @brief Initializes Vine.
* @since_tizen 6.5
*/
int vine_get_capabilities(vine_capability_type_e type, int *capabilities);
+/**
+ * @brief Sets event loop.
+ * @since_tizen 6.5
+ * @param[in] loop The event loop
+ * @return 0 on success, otherwise a negative error value
+ * @retval #VINE_ERROR_NONE Successful
+ * @retval #VINE_ERROR_NOT_INITIALIZED Not initialized
+ * @retval #VINE_ERROR_NOT_SUPPORTED Not supported
+ * @see vine_initialize()
+ */
+int vine_set_event_loop(vine_event_loop_e loop);
+
/**
* @brief Gets event file discriptor for monitoring Vine events.
* @since_tizen 6.5
#include "vine-log.h"
#include "vine-utils.h"
-static vine_event_loop_fn __event_loop;
-#if defined VINE_EVENT_LOOP_EPOLL
+#if defined USE_VINE_EVENT_LOOP_EPOLL
extern vine_event_loop_fn vine_event_loop_epoll;
#endif
-#if defined VINE_EVENT_LOOP_EXTERNAL_GLIB
+#if defined USE_VINE_EVENT_LOOP_EXTERNAL_GLIB
extern vine_event_loop_fn vine_event_loop_glib;
#endif
-int vine_event_loop_init()
+static vine_event_loop_fn __event_loop[] = {
+#if defined USE_VINE_EVENT_LOOP_EPOLL
+ [VINE_EVENT_LOOP_DEFAULT] = vine_event_loop_epoll,
+#endif
+#if defined USE_VINE_EVENT_LOOP_EXTERNAL_GLIB
+ [VINE_EVENT_LOOP_EXTERNAL_GLIB] = vine_event_loop_glib,
+#endif
+};
+
+static int __event_loop_type = 0;
+
+int vine_event_loop_set(vine_event_loop_e loop)
{
-#if defined VINE_EVENT_LOOP_EPOLL
- __event_loop = vine_event_loop_epoll;
-#elif defined VINE_EVENT_LOOP_EXTERNAL_GLIB
- __event_loop = vine_event_loop_glib;
+ RET_VAL_IF(loop < VINE_EVENT_LOOP_DEFAULT || loop > VINE_EVENT_LOOP_EXTERNAL_GLIB,
+ VINE_ERROR_INVALID_PARAMETER, "Invalid parameter");
+
+#ifndef USE_VINE_EVENT_LOOP_EPOLL
+ RET_VAL_IF(loop == VINE_EVENT_LOOP_DEFAULT, VINE_ERROR_INVALID_PARAMETER,
+ "External glib event loop is not supported");
#endif
+#ifndef USE_VINE_EVENT_LOOP_EXTERNAL_GLIB
+ RET_VAL_IF(loop == VINE_EVENT_LOOP_EXTERNAL_GLIB, VINE_ERROR_INVALID_PARAMETER,
+ "External glib event loop is not supported");
+#endif
+
+ __event_loop_type = (int)loop;
+ return VINE_ERROR_NONE;
+}
- return __event_loop.init();
+int vine_event_loop_init()
+{
+ return __event_loop[__event_loop_type].init();
}
void vine_event_loop_deinit()
{
- __event_loop.deinit();
+ __event_loop[__event_loop_type].deinit();
}
int vine_event_loop_start()
{
- return __event_loop.start();;
+ return __event_loop[__event_loop_type].start();;
}
void vine_event_loop_stop()
{
- __event_loop.stop();;
+ __event_loop[__event_loop_type].stop();;
}
int vine_event_queue_create(vine_event_queue_h *event_queue)
{
- return __event_loop.event_queue_create(event_queue);;
+ return __event_loop[__event_loop_type].event_queue_create(event_queue);;
}
void vine_event_queue_destroy(vine_event_queue_h event_queue)
{
- __event_loop.event_queue_destroy(event_queue);
+ __event_loop[__event_loop_type].event_queue_destroy(event_queue);
}
void vine_event_loop_get_eventfd(vine_event_queue_h event_queue, int *eventfd)
{
- __event_loop.get_eventfd(event_queue, eventfd);
+ __event_loop[__event_loop_type].get_eventfd(event_queue, eventfd);
}
int vine_event_loop_add_io_handler(
int fd, int events, vine_poll_handler handler, void *user_data)
{
- return __event_loop.add_io_handler(fd, events, handler, user_data);
+ return __event_loop[__event_loop_type].add_io_handler(fd, events, handler, user_data);
}
int vine_event_loop_mod_io_handler(
int fd, int events, vine_poll_handler handler, void *user_data)
{
- return __event_loop.mod_io_handler(fd, events, handler, user_data);
+ return __event_loop[__event_loop_type].mod_io_handler(fd, events, handler, user_data);
}
int vine_event_loop_del_io_handler(int fd)
{
- return __event_loop.del_io_handler(fd);
+ return __event_loop[__event_loop_type].del_io_handler(fd);
}
// Register an event handler which is called in vine_event_loop_process()
vine_event_handler handler, vine_event_free_handler free_func,
void *user_data)
{
- return __event_loop.add_event(event_queue, event_data, handler, free_func, user_data);
+ return __event_loop[__event_loop_type].add_event(event_queue, event_data, handler, free_func, user_data);
}
int vine_event_loop_process(vine_event_queue_h event_queue)
{
- return __event_loop.process(event_queue);
+ return __event_loop[__event_loop_type].process(event_queue);
}