6 # define WIN32_LEAN_AND_MEAN
8 # undef WIN32_LEAN_AND_MEAN
9 # ifndef USER_TIMER_MINIMUM
10 # define USER_TIMER_MINIMUM 0x0a
22 #include <sys/types.h>
27 # include <sys/time.h>
37 # include <sys/param.h>
49 #include "ecore_private.h"
51 #ifdef HAVE_SYS_EPOLL_H
53 # include <sys/epoll.h>
56 #ifdef USE_G_MAIN_LOOP
60 struct _Ecore_Fd_Handler
65 Ecore_Fd_Handler_Flags flags;
70 Ecore_Fd_Prep_Cb prep_func;
73 Eina_Bool read_active : 1;
74 Eina_Bool write_active : 1;
75 Eina_Bool error_active : 1;
76 Eina_Bool delete_me : 1;
77 #if defined(USE_G_MAIN_LOOP) && !defined(HAVE_EPOLL)
83 struct _Ecore_Win32_Handler
88 Ecore_Fd_Win32_Cb func;
91 Eina_Bool delete_me : 1;
96 static int _ecore_main_select(double timeout);
97 static void _ecore_main_prepare_handlers(void);
98 static void _ecore_main_fd_handlers_cleanup(void);
100 static void _ecore_main_fd_handlers_bads_rem(void);
102 static void _ecore_main_fd_handlers_call(void);
103 static int _ecore_main_fd_handlers_buf_call(void);
104 #ifndef USE_G_MAIN_LOOP
105 static void _ecore_main_loop_iterate_internal(int once_only);
109 static int _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds,
110 fd_set *exceptfds, struct timeval *timeout);
111 static void _ecore_main_win32_handlers_cleanup(void);
114 static int in_main_loop = 0;
115 static int do_quit = 0;
116 static Ecore_Fd_Handler *fd_handlers = NULL;
117 static Ecore_Fd_Handler *fd_handler_current = NULL;
118 static Eina_List *fd_handlers_with_prep = NULL;
119 static Eina_List *fd_handlers_with_buffer = NULL;
120 static Eina_List *fd_handlers_to_delete = NULL;
122 static Eina_List *fd_handlers_to_call = NULL;
123 static Eina_List *fd_handlers_to_call_current;
124 static Eina_List *fd_handlers_to_call_current_next;
127 static Ecore_Win32_Handler *win32_handlers = NULL;
128 static Ecore_Win32_Handler *win32_handler_current = NULL;
129 static Eina_Bool win32_handlers_delete_me = EINA_FALSE;
133 static Ecore_Select_Function main_loop_select = _ecore_main_win32_select;
135 static Ecore_Select_Function main_loop_select = select;
138 static double t1 = 0.0;
139 static double t2 = 0.0;
142 static int epoll_fd = -1;
143 static pid_t epoll_pid;
146 #ifdef USE_G_MAIN_LOOP
148 static GPollFD ecore_epoll_fd;
150 static GSource *ecore_glib_source;
151 static guint ecore_glib_source_id;
152 static GMainLoop* ecore_main_loop;
153 static gboolean ecore_idling;
154 static gboolean ecore_fds_ready;
159 _ecore_get_epoll_fd(void)
161 if (epoll_pid && epoll_pid != getpid())
164 _ecore_main_loop_shutdown();
166 if (epoll_pid == 0 && epoll_fd < 0)
168 _ecore_main_loop_init();
174 _ecore_epoll_add(int efd, int fd, int events, void *ptr)
176 struct epoll_event ev;
178 memset(&ev, 0, sizeof (ev));
181 INF("adding poll on %d %08x", fd, events);
182 return epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev);
186 _ecore_poll_events_from_fdh(Ecore_Fd_Handler *fdh)
189 if (fdh->flags & ECORE_FD_READ) events |= EPOLLIN;
190 if (fdh->flags & ECORE_FD_WRITE) events |= EPOLLOUT;
191 if (fdh->flags & ECORE_FD_ERROR) events |= EPOLLERR;
196 _ecore_poll_events_from_fdh(Ecore_Fd_Handler *fdh __UNUSED__)
202 #ifdef USE_G_MAIN_LOOP
204 _gfd_events_from_fdh(Ecore_Fd_Handler *fdh)
207 if (fdh->flags & ECORE_FD_READ) events |= G_IO_IN;
208 if (fdh->flags & ECORE_FD_WRITE) events |= G_IO_OUT;
209 if (fdh->flags & ECORE_FD_ERROR) events |= G_IO_ERR;
215 _ecore_main_fdh_poll_add(Ecore_Fd_Handler *fdh)
219 r = _ecore_epoll_add(_ecore_get_epoll_fd(), fdh->fd,
220 _ecore_poll_events_from_fdh(fdh), fdh);
221 #elif USE_G_MAIN_LOOP
222 fdh->gfd.fd = fdh->fd;
223 fdh->gfd.events = _gfd_events_from_fdh(fdh);
224 fdh->gfd.revents = 0;
225 INF("adding gpoll on %d %08x", fdh->fd, fdh->gfd.events);
226 g_source_add_poll(ecore_glib_source, &fdh->gfd);
228 if (!ECORE_MAGIC_CHECK(fdh, ECORE_MAGIC_FD_HANDLER))
230 ECORE_MAGIC_FAIL(fdh, ECORE_MAGIC_FD_HANDLER,
231 "_ecore_main_fdh_poll_add");
238 _ecore_main_fdh_poll_del(Ecore_Fd_Handler *fdh)
241 struct epoll_event ev;
242 int efd = _ecore_get_epoll_fd();
244 memset(&ev, 0, sizeof (ev));
245 INF("removing poll on %d", fdh->fd);
246 /* could get an EBADF if somebody closed the FD before removing it */
247 if ((epoll_ctl(efd, EPOLL_CTL_DEL, fdh->fd, &ev) < 0))
251 WRN("fd %d was closed, can't remove from epoll - reinit!",
253 _ecore_main_loop_shutdown();
254 _ecore_main_loop_init();
258 ERR("Failed to delete epoll fd %d! (errno=%d)", fdh->fd, errno);
261 #elif USE_G_MAIN_LOOP
262 fdh->gfd.fd = fdh->fd;
263 fdh->gfd.events = _gfd_events_from_fdh(fdh);
264 fdh->gfd.revents = 0;
265 INF("adding gpoll on %d %08x", fdh->fd, fdh->gfd.events);
266 g_source_add_poll(ecore_glib_source, &fdh->gfd);
268 if (!ECORE_MAGIC_CHECK(fdh, ECORE_MAGIC_FD_HANDLER))
270 ECORE_MAGIC_FAIL(fdh, ECORE_MAGIC_FD_HANDLER,
271 "_ecore_main_fdh_poll_del");
277 _ecore_main_fdh_poll_modify(Ecore_Fd_Handler *fdh)
281 struct epoll_event ev;
282 int efd = _ecore_get_epoll_fd();
284 memset(&ev, 0, sizeof (ev));
285 ev.events = _ecore_poll_events_from_fdh(fdh);
287 INF("modifing epoll on %d to %08x", fdh->fd, ev.events);
288 r = epoll_ctl(efd, EPOLL_CTL_MOD, fdh->fd, &ev);
289 #elif USE_G_MAIN_LOOP
290 fdh->gfd.fd = fdh->fd;
291 fdh->gfd.events = _gfd_events_from_fdh(fdh);
292 fdh->gfd.revents = 0;
293 INF("modifing gpoll on %d to %08x", fdh->fd, fdh->gfd.events);
295 if (!ECORE_MAGIC_CHECK(fdh, ECORE_MAGIC_FD_HANDLER))
297 ECORE_MAGIC_FAIL(fdh, ECORE_MAGIC_FD_HANDLER,
298 "_ecore_main_fdh_poll_modify");
305 static inline int _ecore_main_fdh_poll_mark_active(void)
307 struct epoll_event ev[32];
309 int efd = _ecore_get_epoll_fd();
311 memset(&ev, 0, sizeof (ev));
312 ret = epoll_wait(efd, ev, sizeof(ev) / sizeof(struct epoll_event), 0);
315 if (errno == EINTR) return -1;
316 ERR("epoll_wait failed %d", errno);
320 for (i = 0; i < ret; i++)
322 Ecore_Fd_Handler *fdh;
325 fdh = ev[i].data.ptr;
326 if (!ECORE_MAGIC_CHECK(fdh, ECORE_MAGIC_FD_HANDLER))
328 ECORE_MAGIC_FAIL(fdh, ECORE_MAGIC_FD_HANDLER,
329 "_ecore_main_fdh_poll_mark_active");
334 ERR("deleted fd in epoll");
337 pst = st = fdh->read_active | fdh->write_active | fdh->error_active;
338 if ((ev[i].events & EPOLLIN) && (!fdh->read_active))
339 st = fdh->read_active = EINA_TRUE;
340 if ((ev[i].events & EPOLLOUT) && (!fdh->write_active))
341 st = fdh->write_active = EINA_TRUE;
342 if ((ev[i].events & EPOLLERR) && (!fdh->error_active))
343 st = fdh->error_active = EINA_TRUE;
345 fd_handlers_to_call = eina_list_append(fd_handlers_to_call, fdh);
351 #elif USE_G_MAIN_LOOP
353 static inline int _ecore_main_fdh_poll_mark_active(void)
355 Ecore_Fd_Handler *fdh;
359 /* call the prepare callback for all handlers */
360 EINA_INLIST_FOREACH(fd_handlers, fdh)
365 pst = st = fdh->read_active | fdh->write_active | fdh->error_active;
366 if ((fdh->gfd.revents & G_IO_IN) && (!fdh->read_active))
367 st = fdh->read_active = EINA_TRUE;
368 if ((fdh->gfd.revents & G_IO_OUT) && (!fdh->write_active))
369 st = fdh->write_active = EINA_TRUE;
370 if ((fdh->gfd.revents & G_IO_ERR) && (!fdh->error_active))
371 st = fdh->error_active = EINA_TRUE;
373 fd_handlers_to_call = eina_list_append(fd_handlers_to_call, fdh);
374 if (fdh->gfd.revents & (G_IO_IN|G_IO_OUT|G_IO_ERR)) ret++;
377 INF("found %d active fds", ret);
384 #ifdef USE_G_MAIN_LOOP
386 /* like we are about to enter main_loop_select in _ecore_main_select */
388 _ecore_main_gsource_prepare(GSource *source, gint *next_time)
390 double t = _ecore_timer_next_get();
393 INF("enter, next timeout in %.1f", t);
398 while (_ecore_timer_call(_ecore_time_loop_time));
399 _ecore_timer_cleanup();
401 /* when idling, busy loop checking the fds only */
402 if (!ecore_idling) _ecore_idle_enterer_call();
405 /* don't check fds if somebody quit */
406 running = g_main_loop_is_running(ecore_main_loop);
409 /* only set idling state in dispatch */
410 if (ecore_idling && !_ecore_idler_exist())
412 if (_ecore_timers_exists())
414 double t = _ecore_timer_next_get();
415 *next_time = (t / 1000.0);
423 if (fd_handlers_with_prep)
424 _ecore_main_prepare_handlers();
428 INF("leave, timeout = %d", *next_time);
430 /* ready if we're not running (about to quit) */
435 _ecore_main_gsource_check(GSource *source)
440 ecore_fds_ready = (_ecore_main_fdh_poll_mark_active() > 0);
441 _ecore_main_fd_handlers_cleanup();
443 _ecore_time_loop_time = ecore_time_get();
444 _ecore_timer_enable_new();
449 return TRUE; /* always dispatch */
452 /* like we just came out of main_loop_select in _ecore_main_select */
454 _ecore_main_gsource_dispatch(GSource *source, GSourceFunc callback, gpointer user_data)
456 gboolean events_ready, timers_ready, idlers_ready, signals_ready;
457 double next_time = _ecore_timer_next_get();
459 events_ready = _ecore_event_exist();
460 timers_ready = _ecore_timers_exists() && (0.0 <= next_time);
461 idlers_ready = _ecore_idler_exist();
462 signals_ready = (_ecore_signal_count_get() > 0);
465 INF("enter idling=%d fds=%d events=%d signals=%d timers=%d (next=%.2f) idlers=%d",
466 ecore_idling, ecore_fds_ready, events_ready, signals_ready,
467 _ecore_timers_exists(), next_time, idlers_ready);
469 if (ecore_idling && events_ready)
471 INF("calling idle exiters");
472 _ecore_idle_exiter_call();
475 else if (!ecore_idling && !events_ready)
483 INF("calling idler");
486 events_ready = _ecore_event_exist();
487 timers_ready = _ecore_timers_exists() && (0.0 <= next_time);
488 idlers_ready = _ecore_idler_exist();
490 if ((ecore_fds_ready || events_ready || timers_ready || idlers_ready || signals_ready))
492 INF("calling idle exiters");
493 _ecore_idle_exiter_call();
502 _ecore_main_fd_handlers_call();
503 if (fd_handlers_with_buffer)
504 _ecore_main_fd_handlers_buf_call();
505 while (_ecore_signal_count_get()) _ecore_signal_call();
507 _ecore_main_fd_handlers_cleanup();
514 return TRUE; /* what should be returned here? */
518 _ecore_main_gsource_finalize(GSource *source)
523 static GSourceFuncs ecore_gsource_funcs =
525 .prepare = _ecore_main_gsource_prepare,
526 .check = _ecore_main_gsource_check,
527 .dispatch = _ecore_main_gsource_dispatch,
528 .finalize = _ecore_main_gsource_finalize,
534 _ecore_main_loop_init(void)
538 epoll_fd = epoll_create(1);
540 CRIT("Failed to create epoll fd!");
541 epoll_pid = getpid();
543 /* add polls on all our file descriptors */
544 Ecore_Fd_Handler *fdh;
545 EINA_INLIST_FOREACH(fd_handlers, fdh)
549 _ecore_epoll_add(epoll_fd, fdh->fd,
550 _ecore_poll_events_from_fdh(fdh), fdh);
551 _ecore_main_fdh_poll_add(fdh);
556 #ifdef USE_G_MAIN_LOOP
557 ecore_glib_source = g_source_new(&ecore_gsource_funcs, sizeof (GSource));
558 if (!ecore_glib_source)
559 CRIT("Failed to create glib source for epoll!");
563 ecore_epoll_fd.fd = epoll_fd;
564 ecore_epoll_fd.events = G_IO_IN;
565 ecore_epoll_fd.revents = 0;
566 g_source_add_poll(ecore_glib_source, &ecore_epoll_fd);
568 ecore_glib_source_id = g_source_attach(ecore_glib_source, NULL);
569 if (ecore_glib_source_id <= 0)
570 CRIT("Failed to attach glib source to default context");
577 _ecore_main_loop_shutdown(void)
579 #ifdef USE_G_MAIN_LOOP
580 if (ecore_glib_source)
582 g_source_destroy(ecore_glib_source);
583 ecore_glib_source = NULL;
599 * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
605 * @addtogroup Ecore_Main_Loop_Group Ecore Main Loop functions
607 * These functions control the Ecore event handling loop. This loop is
608 * designed to work on embedded systems all the way to large and
609 * powerful mutli-cpu workstations.
611 * It serialises all system signals and events into a single event
612 * queue, that can be easily processed without needing to worry about
613 * concurrency. A properly written, event-driven program using this
614 * kind of programming does not need threads. It makes the program very
615 * robust and easy to follow.
617 * Here is an example of simple program and its basic event loop flow:
618 * @image html prog_flow.png
620 * For examples of setting up and using a main loop, see
621 * @ref event_handler_example.c and @ref timer_example.c.
627 * Runs a single iteration of the main loop to process everything on the
631 ecore_main_loop_iterate(void)
633 #ifndef USE_G_MAIN_LOOP
634 _ecore_main_loop_iterate_internal(1);
636 g_main_context_iteration(NULL, 1);
641 * Runs the application main loop.
643 * This function will not return until @ref ecore_main_loop_quit is called.
647 ecore_main_loop_begin(void)
649 #ifndef USE_G_MAIN_LOOP
651 while (do_quit == 0) _ecore_main_loop_iterate_internal(0);
655 ecore_main_loop = g_main_loop_new(NULL, FALSE);
656 g_main_loop_run(ecore_main_loop);
661 * Quits the main loop once all the events currently on the queue have
665 ecore_main_loop_quit(void)
667 #ifndef USE_G_MAIN_LOOP
671 g_main_loop_quit(ecore_main_loop);
677 * Sets the function to use when monitoring multiple file descriptors,
678 * and waiting until one of more of the file descriptors before ready
679 * for some class of I/O operation.
681 * This function will be used instead of the system call select and
682 * could possible be used to integrate the Ecore event loop with an
683 * external event loop.
685 * @warning you don't know how to use, don't even try to use it.
689 ecore_main_loop_select_func_set(Ecore_Select_Function func)
691 main_loop_select = func;
695 * Gets the select function set by ecore_select_func_set(),
696 * or the native select function if none was set.
700 ecore_main_loop_select_func_get(void)
702 return main_loop_select;
706 * @defgroup Ecore_FD_Handler_Group File Event Handling Functions
708 * Functions that deal with file descriptor handlers.
712 * Adds a callback for activity on the given file descriptor.
714 * @p func will be called during the execution of @ref ecore_main_loop_begin
715 * when the file descriptor is available for reading, or writing, or both.
717 * Normally the return value from the @p func is "zero means this handler is
718 * finished and can be deleted" as is usual for handler callbacks. However,
719 * if the @p buf_func is supplied, then the return value from the @p func is
720 * "non zero means the handler should be called again in a tight loop".
722 * @p buf_func is called during event loop handling to check if data that has
723 * been read from the file descriptor is in a buffer and is available to
724 * read. Some systems (notably xlib) handle their own buffering, and would
725 * otherwise not work with select(). These systems should use a @p buf_func.
726 * This is a most annoying hack, only ecore_x uses it, so refer to that for
727 * an example. NOTE - @p func should probably return "one" always if
728 * @p buf_func is used, to avoid confusion with the other return value
731 * @param fd The file descriptor to watch.
732 * @param flags To watch it for read (@c ECORE_FD_READ) and/or
733 * (@c ECORE_FD_WRITE) write ability. @c ECORE_FD_ERROR
735 * @param func The callback function.
736 * @param data The data to pass to the callback.
737 * @param buf_func The function to call to check if any data has been
738 * buffered and already read from the fd. Can be @c NULL.
739 * @param buf_data The data to pass to the @p buf_func function.
740 * @return A fd handler handle if successful. @c NULL otherwise.
741 * @ingroup Ecore_FD_Handler_Group
743 EAPI Ecore_Fd_Handler *
744 ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, Ecore_Fd_Cb func, const void *data,
745 Ecore_Fd_Cb buf_func, const void *buf_data)
747 Ecore_Fd_Handler *fdh;
749 if ((fd < 0) || (flags == 0) || (!func)) return NULL;
751 fdh = calloc(1, sizeof(Ecore_Fd_Handler));
752 if (!fdh) return NULL;
753 ECORE_MAGIC_SET(fdh, ECORE_MAGIC_FD_HANDLER);
756 if (_ecore_main_fdh_poll_add(fdh) < 0)
758 ERR("Failed to add poll on fd %d (errno = %d)!", fd, errno);
762 fdh->read_active = EINA_FALSE;
763 fdh->write_active = EINA_FALSE;
764 fdh->error_active = EINA_FALSE;
765 fdh->delete_me = EINA_FALSE;
767 fdh->data = (void *)data;
768 fdh->buf_func = buf_func;
770 fd_handlers_with_buffer = eina_list_append(fd_handlers_with_buffer, fdh);
771 fdh->buf_data = (void *)buf_data;
772 fd_handlers = (Ecore_Fd_Handler *)
773 eina_inlist_append(EINA_INLIST_GET(fd_handlers),
774 EINA_INLIST_GET(fdh));
779 EAPI Ecore_Win32_Handler *
780 ecore_main_win32_handler_add(void *h, Ecore_Fd_Win32_Cb func, const void *data)
782 Ecore_Win32_Handler *wh;
784 if (!h || !func) return NULL;
786 wh = calloc(1, sizeof(Ecore_Win32_Handler));
787 if (!wh) return NULL;
788 ECORE_MAGIC_SET(wh, ECORE_MAGIC_WIN32_HANDLER);
790 wh->delete_me = EINA_FALSE;
792 wh->data = (void *)data;
793 win32_handlers = (Ecore_Win32_Handler *)
794 eina_inlist_append(EINA_INLIST_GET(win32_handlers),
795 EINA_INLIST_GET(wh));
799 EAPI Ecore_Win32_Handler *
800 ecore_main_win32_handler_add(void *h __UNUSED__, Ecore_Fd_Win32_Cb func __UNUSED__,
801 const void *data __UNUSED__)
808 * Deletes the given FD handler.
809 * @param fd_handler The given FD handler.
810 * @return The data pointer set using @ref ecore_main_fd_handler_add,
811 * for @p fd_handler on success. @c NULL otherwise.
812 * @ingroup Ecore_FD_Handler_Group
814 * Beware that if the fd is already closed, ecore may complain if it uses
815 * epoll internally, and that in some rare cases this may be able to cause
816 * crashes and instability. Remember to delete your fd handlers before the
817 * fd's they listen to are closed.
820 ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
822 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
824 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
825 "ecore_main_fd_handler_del");
828 if (fd_handler->delete_me)
829 /* FIXME: should this return NULL instead? */
830 return fd_handler->data;
832 fd_handler->delete_me = EINA_TRUE;
833 _ecore_main_fdh_poll_del(fd_handler);
834 fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fd_handler);
835 if (fd_handler->prep_func && fd_handlers_with_prep)
836 fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fd_handler);
837 if (fd_handler->buf_func && fd_handlers_with_buffer)
838 fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fd_handler);
839 return fd_handler->data;
844 ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler)
846 if (!ECORE_MAGIC_CHECK(win32_handler, ECORE_MAGIC_WIN32_HANDLER))
848 ECORE_MAGIC_FAIL(win32_handler, ECORE_MAGIC_WIN32_HANDLER,
849 "ecore_main_win32_handler_del");
852 win32_handler->delete_me = EINA_TRUE;
853 win32_handlers_delete_me = EINA_TRUE;
854 return win32_handler->data;
858 ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler __UNUSED__)
865 * @brief Set the prepare callback with data for a given #Ecore_Fd_Handler
866 * @param fd_handler The fd handler
867 * @param func The prep function
868 * @param data The data to pass to the prep function
869 * This function will be called prior to the the fd handler's callback function.
872 ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Prep_Cb func, const void *data)
874 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
876 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
877 "ecore_main_fd_handler_prepare_callback_set");
880 fd_handler->prep_func = func;
881 fd_handler->prep_data = (void *)data;
882 if (fd_handlers_with_prep && (!eina_list_data_find(fd_handlers_with_prep, fd_handler)))
883 /* FIXME: THIS WILL NOT SCALE WITH LOTS OF PREP FUNCTIONS!!! */
884 fd_handlers_with_prep = eina_list_append(fd_handlers_with_prep, fd_handler);
888 * Retrieves the file descriptor that the given handler is handling.
889 * @param fd_handler The given FD handler.
890 * @return The file descriptor the handler is watching.
891 * @ingroup Ecore_FD_Handler_Group
894 ecore_main_fd_handler_fd_get(Ecore_Fd_Handler *fd_handler)
896 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
898 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
899 "ecore_main_fd_handler_fd_get");
902 return fd_handler->fd;
906 * Return if read, write or error, or a combination thereof, is active on the
907 * file descriptor of the given FD handler.
908 * @param fd_handler The given FD handler.
909 * @param flags The flags, @c ECORE_FD_READ, @c ECORE_FD_WRITE or
910 * @c ECORE_FD_ERROR to query.
911 * @return #EINA_TRUE if any of the given flags are active. #EINA_FALSE otherwise.
912 * @ingroup Ecore_FD_Handler_Group
915 ecore_main_fd_handler_active_get(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags)
917 int ret = EINA_FALSE;
919 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
921 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
922 "ecore_main_fd_handler_active_get");
925 if ((flags & ECORE_FD_READ) && (fd_handler->read_active)) ret = EINA_TRUE;
926 if ((flags & ECORE_FD_WRITE) && (fd_handler->write_active)) ret = EINA_TRUE;
927 if ((flags & ECORE_FD_ERROR) && (fd_handler->error_active)) ret = EINA_TRUE;
932 * Set what active streams the given FD handler should be monitoring.
933 * @param fd_handler The given FD handler.
934 * @param flags The flags to be watching.
935 * @ingroup Ecore_FD_Handler_Group
938 ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags)
940 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
942 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
943 "ecore_main_fd_handler_active_set");
946 fd_handler->flags = flags;
947 if (_ecore_main_fdh_poll_modify(fd_handler) < 0)
949 ERR("Failed to mod epoll fd %d!", fd_handler->fd);
962 _ecore_main_shutdown(void)
967 "*** ECORE WARINING: Calling ecore_shutdown() while still in the main loop.\n"
968 "*** Program may crash or behave strangely now.");
973 Ecore_Fd_Handler *fdh;
976 fd_handlers = (Ecore_Fd_Handler *) eina_inlist_remove(EINA_INLIST_GET(fd_handlers),
977 EINA_INLIST_GET(fdh));
978 ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
981 if (fd_handlers_with_buffer)
982 fd_handlers_with_buffer = eina_list_free(fd_handlers_with_buffer);
983 if (fd_handlers_with_prep)
984 fd_handlers_with_prep = eina_list_free(fd_handlers_with_prep);
985 if (fd_handlers_to_delete)
986 fd_handlers_to_delete = eina_list_free(fd_handlers_to_delete);
987 if (fd_handlers_to_call)
988 fd_handlers_to_call = eina_list_free(fd_handlers_to_call);
990 fd_handlers_to_call_current = NULL;
991 fd_handlers_to_delete = NULL;
992 fd_handler_current = NULL;
995 while (win32_handlers)
997 Ecore_Win32_Handler *wh;
1000 win32_handlers = (Ecore_Win32_Handler *) eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
1001 EINA_INLIST_GET(wh));
1002 ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE);
1005 win32_handlers_delete_me = EINA_FALSE;
1006 win32_handler_current = NULL;
1011 _ecore_main_prepare_handlers(void)
1013 Ecore_Fd_Handler *fdh;
1016 /* call the prepare callback for all handlers with prep functions */
1017 EINA_LIST_FOREACH_SAFE(fd_handlers_with_prep, l, l2, fdh)
1021 fd_handlers_with_prep = eina_list_remove_list(l, fd_handlers_with_prep);
1024 if (!fdh->delete_me && fdh->prep_func)
1027 fdh->prep_func(fdh->prep_data, fdh);
1031 fd_handlers_with_prep = eina_list_remove_list(fd_handlers_with_prep, l);
1036 _ecore_main_select(double timeout)
1038 struct timeval tv, *t;
1039 fd_set rfds, wfds, exfds;
1044 if ((!finite(timeout)) || (timeout == 0.0)) /* finite() tests for NaN, too big, too small, and infinity. */
1050 else if (timeout > 0.0)
1055 timeout += (0.5 / HZ);
1057 usec = (int)((timeout - (double)sec) * 1000000);
1060 usec = (int)((timeout - (double)sec) * 1000000);
1071 /* call the prepare callback for all handlers */
1072 if (fd_handlers_with_prep)
1073 _ecore_main_prepare_handlers();
1075 Ecore_Fd_Handler *fdh;
1077 EINA_INLIST_FOREACH(fd_handlers, fdh)
1079 if (!fdh->delete_me)
1081 if (fdh->flags & ECORE_FD_READ)
1083 FD_SET(fdh->fd, &rfds);
1084 if (fdh->fd > max_fd) max_fd = fdh->fd;
1086 if (fdh->flags & ECORE_FD_WRITE)
1088 FD_SET(fdh->fd, &wfds);
1089 if (fdh->fd > max_fd) max_fd = fdh->fd;
1091 if (fdh->flags & ECORE_FD_ERROR)
1093 FD_SET(fdh->fd, &exfds);
1094 if (fdh->fd > max_fd) max_fd = fdh->fd;
1098 #else /* HAVE_EPOLL */
1099 /* polling on the epoll fd will wake when an fd in the epoll set is active */
1100 max_fd = _ecore_get_epoll_fd();
1101 FD_SET(max_fd, &rfds);
1102 #endif /* HAVE_EPOLL */
1104 if (_ecore_signal_count_get()) return -1;
1106 ret = main_loop_select(max_fd + 1, &rfds, &wfds, &exfds, t);
1108 _ecore_time_loop_time = ecore_time_get();
1112 if (errno == EINTR) return -1;
1113 else if (errno == EBADF) _ecore_main_fd_handlers_bads_rem();
1119 _ecore_main_fdh_poll_mark_active();
1120 #else /* HAVE_EPOLL */
1121 Ecore_Fd_Handler *fdh;
1123 EINA_INLIST_FOREACH(fd_handlers, fdh)
1125 if (!fdh->delete_me)
1128 pst = st = fdh->read_active | fdh->write_active | fdh->error_active;
1129 if ((FD_ISSET(fdh->fd, &rfds)) && (!fdh->read_active))
1130 st = fdh->read_active = EINA_TRUE;
1131 if ((FD_ISSET(fdh->fd, &wfds)) && (!fdh->write_active))
1132 st = fdh->write_active = EINA_TRUE;
1133 if ((FD_ISSET(fdh->fd, &exfds)) && (!fdh->error_active))
1134 st = fdh->error_active = EINA_TRUE;
1136 fd_handlers_to_call = eina_list_append(fd_handlers_to_call, fdh);
1139 #endif /* HAVE_EPOLL */
1140 _ecore_main_fd_handlers_cleanup();
1142 _ecore_main_win32_handlers_cleanup();
1151 _ecore_main_fd_handlers_bads_rem(void)
1153 Ecore_Fd_Handler *fdh;
1157 ERR("Removing bad fds");
1158 for (l = EINA_INLIST_GET(fd_handlers); l; )
1160 fdh = (Ecore_Fd_Handler *) l;
1164 if ((fcntl(fdh->fd, F_GETFD) < 0) && (errno == EBADF))
1166 ERR("Found bad fd at index %d", fdh->fd);
1167 if (fdh->flags & ECORE_FD_ERROR)
1169 ERR("Fd set for error! calling user");
1171 if (!fdh->func(fdh->data, fdh))
1173 ERR("Fd function err returned 0, remove it");
1174 if (!fdh->delete_me)
1176 fdh->delete_me = EINA_TRUE;
1177 fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
1185 ERR("Problematic fd found at %d! setting it for delete", fdh->fd);
1186 if (!fdh->delete_me)
1188 fdh->delete_me = EINA_TRUE;
1189 fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
1199 ERR("No bad fd found. Maybe a foreign fd from glib?");
1201 ERR("No bad fd found. EEEK!");
1204 _ecore_main_fd_handlers_cleanup();
1209 _ecore_main_fd_handlers_cleanup(void)
1211 Ecore_Fd_Handler *fdh;
1214 if (!fd_handlers_to_delete) return;
1215 EINA_LIST_FOREACH_SAFE(fd_handlers_to_delete, l, l2, fdh)
1219 fd_handlers_to_delete = eina_list_remove_list(l, fd_handlers_to_delete);
1222 /* fdh->delete_me should be set for all fdhs at the start of the list */
1223 if (fdh->references)
1225 if (fdh->buf_func && fd_handlers_with_buffer)
1226 fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fdh);
1227 if (fdh->prep_func && fd_handlers_with_prep)
1228 fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fdh);
1229 fd_handlers = (Ecore_Fd_Handler *)
1230 eina_inlist_remove(EINA_INLIST_GET(fd_handlers), EINA_INLIST_GET(fdh));
1231 ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
1233 fd_handlers_to_delete = eina_list_remove_list(fd_handlers_to_delete, l);
1239 _ecore_main_win32_handlers_cleanup(void)
1241 Ecore_Win32_Handler *wh;
1243 int deleted_in_use = 0;
1245 if (!win32_handlers_delete_me) return;
1246 for (l = EINA_INLIST_GET(win32_handlers); l; )
1248 wh = (Ecore_Win32_Handler *)l;
1259 win32_handlers = (Ecore_Win32_Handler *)
1260 eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
1261 EINA_INLIST_GET(wh));
1262 ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE);
1266 if (!deleted_in_use) win32_handlers_delete_me = EINA_FALSE;
1271 _ecore_main_fd_handlers_call(void)
1273 if (!fd_handlers_to_call_current)
1275 /* regular main loop, start from head */
1276 fd_handlers_to_call_current = fd_handlers_to_call;
1277 fd_handlers_to_call_current_next = eina_list_next(fd_handlers_to_call_current);
1281 /* recursive main loop, continue from where we were */
1282 fd_handlers_to_call_current = fd_handlers_to_call_current_next;
1283 fd_handlers_to_call_current_next = eina_list_next(fd_handlers_to_call_current);
1286 while (fd_handlers_to_call_current)
1288 Ecore_Fd_Handler *fdh = fd_handlers_to_call_current->data;
1290 if (!fdh->delete_me)
1292 if ((fdh->read_active) ||
1293 (fdh->write_active) ||
1294 (fdh->error_active))
1297 if (!fdh->func(fdh->data, fdh))
1299 if (!fdh->delete_me)
1301 fdh->delete_me = EINA_TRUE;
1302 fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
1308 fdh->read_active = EINA_FALSE;
1309 fdh->write_active = EINA_FALSE;
1310 fdh->error_active = EINA_FALSE;
1314 fd_handlers_to_call = eina_list_remove_list(fd_handlers_to_call, fd_handlers_to_call_current);
1315 fd_handlers_to_call_current = fd_handlers_to_call_current_next;
1316 fd_handlers_to_call_current_next = eina_list_next(fd_handlers_to_call_current_next);
1321 _ecore_main_fd_handlers_buf_call(void)
1323 Ecore_Fd_Handler *fdh;
1328 EINA_LIST_FOREACH_SAFE(fd_handlers_with_buffer, l, l2, fdh)
1332 fd_handlers_with_buffer = eina_list_remove_list(l, fd_handlers_with_buffer);
1335 if ((!fdh->delete_me) && fdh->buf_func)
1338 if (fdh->buf_func(fdh->buf_data, fdh))
1340 ret |= fdh->func(fdh->data, fdh);
1341 if (!fdh->read_active)
1343 fdh->read_active = EINA_TRUE;
1344 if ((!fdh->write_active) && (!fdh->error_active))
1345 fd_handlers_to_call = eina_list_append(fd_handlers_to_call, fdh);
1351 fd_handlers_with_buffer = eina_list_remove_list(fd_handlers_with_buffer, l);
1356 #ifndef USE_G_MAIN_LOOP
1358 _ecore_main_loop_iterate_internal(int once_only)
1360 double next_time = -1.0;
1365 /* expire any timers */
1366 while (_ecore_timer_call(_ecore_time_loop_time));
1367 _ecore_timer_cleanup();
1369 /* process signals into events .... */
1370 while (_ecore_signal_count_get()) _ecore_signal_call();
1371 if (_ecore_event_exist())
1373 _ecore_idle_enterer_call();
1375 _ecore_main_select(0.0);
1376 _ecore_time_loop_time = ecore_time_get();
1377 _ecore_timer_enable_new();
1378 goto process_events;
1380 /* call idle enterers ... */
1381 if (!once_only) _ecore_idle_enterer_call();
1384 have_event = have_signal = 0;
1386 if (_ecore_main_select(0.0) > 0) have_event = 1;
1387 if (_ecore_signal_count_get() > 0) have_signal = 1;
1388 if (have_signal || have_event)
1390 _ecore_time_loop_time = ecore_time_get();
1391 _ecore_timer_enable_new();
1392 goto process_events;
1396 /* if these calls caused any buffered events to appear - deal with them */
1397 if (fd_handlers_with_buffer)
1398 _ecore_main_fd_handlers_buf_call();
1400 /* if there are any - jump to processing them */
1401 if (_ecore_event_exist())
1404 _ecore_main_select(0.0);
1405 _ecore_time_loop_time = ecore_time_get();
1406 _ecore_timer_enable_new();
1407 goto process_events;
1411 _ecore_idle_enterer_call();
1413 _ecore_time_loop_time = ecore_time_get();
1414 _ecore_timer_enable_new();
1418 if (_ecore_fps_debug)
1420 t2 = ecore_time_get();
1421 if ((t1 > 0.0) && (t2 > 0.0))
1422 _ecore_fps_debug_runtime_add(t2 - t1);
1425 /* any timers re-added as a result of these are allowed to go */
1426 _ecore_timer_enable_new();
1429 _ecore_time_loop_time = ecore_time_get();
1431 _ecore_timer_enable_new();
1434 if (!_ecore_event_exist())
1437 have_event = have_signal = 0;
1438 next_time = _ecore_timer_next_get();
1443 if (!_ecore_idler_exist())
1445 if (_ecore_main_select(-1.0) > 0) have_event = 1;
1452 if (!_ecore_idler_call()) goto start_loop;
1453 if (_ecore_event_exist()) break;
1454 if (_ecore_main_select(0.0) > 0) have_event = 1;
1455 if (_ecore_signal_count_get() > 0) have_signal = 1;
1456 if (have_event || have_signal) break;
1457 if (_ecore_timers_exists()) goto start_loop;
1466 if (!_ecore_idler_exist())
1468 if (_ecore_main_select(next_time) > 0) have_event = 1;
1475 if (!_ecore_idler_call()) goto start_loop;
1476 if (_ecore_event_exist()) break;
1477 if (_ecore_main_select(0.0) > 0) have_event = 1;
1478 if (_ecore_signal_count_get() > 0) have_signal = 1;
1479 if (have_event || have_signal) break;
1480 next_time = _ecore_timer_next_get();
1481 if (next_time <= 0) break;
1486 _ecore_time_loop_time = ecore_time_get();
1488 if (_ecore_fps_debug) t1 = ecore_time_get();
1489 /* we came out of our "wait state" so idle has exited */
1490 if (!once_only) _ecore_idle_exiter_call();
1491 /* call the fd handler per fd that became alive... */
1492 /* this should read or write any data to the monitored fd and then */
1493 /* post events onto the ecore event pipe if necessary */
1495 _ecore_main_fd_handlers_call();
1496 if (fd_handlers_with_buffer)
1497 _ecore_main_fd_handlers_buf_call();
1498 /* process signals into events .... */
1499 while (_ecore_signal_count_get()) _ecore_signal_call();
1500 /* handle events ... */
1501 _ecore_event_call();
1502 _ecore_main_fd_handlers_cleanup();
1504 if (once_only) _ecore_idle_enterer_call();
1511 _ecore_main_win32_select(int nfds __UNUSED__, fd_set *readfds, fd_set *writefds,
1512 fd_set *exceptfds, struct timeval *tv)
1514 HANDLE objects[MAXIMUM_WAIT_OBJECTS];
1515 int sockets[MAXIMUM_WAIT_OBJECTS];
1516 Ecore_Fd_Handler *fdh;
1517 Ecore_Win32_Handler *wh;
1518 unsigned int objects_nbr = 0;
1519 unsigned int handles_nbr = 0;
1520 unsigned int events_nbr = 0;
1527 /* Create an event object per socket */
1528 EINA_INLIST_FOREACH(fd_handlers, fdh)
1534 if (FD_ISSET(fdh->fd, readfds))
1535 network_event |= FD_READ;
1536 if (FD_ISSET(fdh->fd, writefds))
1537 network_event |= FD_WRITE;
1538 if (FD_ISSET(fdh->fd, exceptfds))
1539 network_event |= FD_OOB;
1543 event = WSACreateEvent();
1544 WSAEventSelect(fdh->fd, event, network_event);
1545 objects[objects_nbr] = event;
1546 sockets[events_nbr] = fdh->fd;
1552 /* store the HANDLEs in the objects to wait for */
1553 EINA_INLIST_FOREACH(win32_handlers, wh)
1555 objects[objects_nbr] = wh->h;
1560 /* Empty the queue before waiting */
1561 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
1563 TranslateMessage(&msg);
1564 DispatchMessage(&msg);
1567 /* Wait for any message sent or posted to this queue */
1568 /* or for one of the passed handles be set to signaled. */
1572 timeout = (DWORD)((tv->tv_sec * 1000.0) + (tv->tv_usec / 1000.0));
1574 if (timeout == 0) return 0;
1576 result = MsgWaitForMultipleObjects(objects_nbr, (const HANDLE *)objects, EINA_FALSE,
1577 timeout, QS_ALLINPUT);
1583 /* The result tells us the type of event we have. */
1584 if (result == WAIT_FAILED)
1588 msg = evil_last_error_get();
1589 ERR(" * %s\n", msg);
1593 else if (result == WAIT_TIMEOUT)
1595 /* ERR("time out\n"); */
1598 else if (result == (WAIT_OBJECT_0 + objects_nbr))
1600 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
1602 TranslateMessage(&msg);
1603 DispatchMessage(&msg);
1608 else if ((result >= 0) && (result < WAIT_OBJECT_0 + events_nbr))
1610 WSANETWORKEVENTS network_event;
1612 WSAEnumNetworkEvents(sockets[result], objects[result], &network_event);
1614 if (network_event.lNetworkEvents & FD_READ)
1615 FD_SET(sockets[result], readfds);
1616 if (network_event.lNetworkEvents & FD_WRITE)
1617 FD_SET(sockets[result], writefds);
1618 if (network_event.lNetworkEvents & FD_OOB)
1619 FD_SET(sockets[result], exceptfds);
1623 else if ((result >= (WAIT_OBJECT_0 + events_nbr)) &&
1624 (result < (WAIT_OBJECT_0 + objects_nbr)))
1626 if (!win32_handler_current)
1628 /* regular main loop, start from head */
1629 win32_handler_current = win32_handlers;
1633 /* recursive main loop, continue from where we were */
1634 win32_handler_current = (Ecore_Win32_Handler *)EINA_INLIST_GET(win32_handler_current)->next;
1637 while (win32_handler_current)
1639 wh = win32_handler_current;
1641 if (objects[result - WAIT_OBJECT_0] == wh->h)
1646 if (!wh->func(wh->data, wh))
1648 wh->delete_me = EINA_TRUE;
1649 win32_handlers_delete_me = EINA_TRUE;
1654 if (win32_handler_current) /* may have changed in recursive main loops */
1655 win32_handler_current = (Ecore_Win32_Handler *)EINA_INLIST_GET(win32_handler_current)->next;
1661 ERR("unknown result...\n");
1665 /* Remove event objects again */
1666 for (i = 0; i < events_nbr; i++) WSACloseEvent(objects[i]);