#ifdef HAVE_EPOLL
static int epoll_fd = -1;
-static GPollFD ecore_epoll_fd;
+static pid_t epoll_pid;
#endif
#ifdef USE_G_MAIN_LOOP
+#ifdef HAVE_EPOLL
+static GPollFD ecore_epoll_fd;
+#endif
static GSource *ecore_glib_source;
static guint ecore_glib_source_id;
static GMainLoop* ecore_main_loop;
#ifdef HAVE_EPOLL
static inline int
+_ecore_get_epoll_fd(void)
+{
+ if (epoll_pid && epoll_pid != getpid())
+ {
+ /* forked! */
+ _ecore_main_loop_shutdown();
+ }
+ if (epoll_pid == 0 && epoll_fd < 0)
+ {
+ _ecore_main_loop_init();
+ }
+ return epoll_fd;
+}
+
+static inline int
+_ecore_epoll_add(int efd, int fd, int events, void *ptr)
+{
+ struct epoll_event ev;
+
+ memset(&ev, 0, sizeof (ev));
+ ev.events = events;
+ ev.data.ptr = ptr;
+ INF("adding poll on %d %08x", fd, events);
+ return epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev);
+}
+
+static inline int
_ecore_poll_events_from_fdh(Ecore_Fd_Handler *fdh)
{
int events = 0;
{
int r = 0;
#ifdef HAVE_EPOLL
- struct epoll_event ev;
-
- memset(&ev, 0, sizeof (ev));
- ev.events = _ecore_poll_events_from_fdh(fdh);
- ev.data.ptr = fdh;
- INF("adding poll on %d %08x", fdh->fd, ev.events);
- r = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fdh->fd, &ev);
+ r = _ecore_epoll_add(_ecore_get_epoll_fd(), fdh->fd,
+ _ecore_poll_events_from_fdh(fdh), fdh);
#elif USE_G_MAIN_LOOP
fdh->gfd.fd = fdh->fd;
fdh->gfd.events = _gfd_events_from_fdh(fdh);
{
#ifdef HAVE_EPOLL
struct epoll_event ev;
+ int efd = _ecore_get_epoll_fd();
memset(&ev, 0, sizeof (ev));
INF("removing poll on %d", fdh->fd);
/* could get an EBADF if somebody closed the FD before removing it */
- if ((epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fdh->fd, &ev) < 0) &&
+ if ((epoll_ctl(efd, EPOLL_CTL_DEL, fdh->fd, &ev) < 0) &&
(errno != EBADF))
{
ERR("Failed to delete epoll fd %d! (errno=%d)", fdh->fd, errno);
int r = 0;
#ifdef HAVE_EPOLL
struct epoll_event ev;
+ int efd = _ecore_get_epoll_fd();
memset(&ev, 0, sizeof (ev));
ev.events = _ecore_poll_events_from_fdh(fdh);
ev.data.ptr = fdh;
INF("modifing epoll on %d to %08x", fdh->fd, ev.events);
- r = epoll_ctl(epoll_fd, EPOLL_CTL_MOD, fdh->fd, &ev);
+ r = epoll_ctl(efd, EPOLL_CTL_MOD, fdh->fd, &ev);
#elif USE_G_MAIN_LOOP
fdh->gfd.fd = fdh->fd;
fdh->gfd.events = _gfd_events_from_fdh(fdh);
{
struct epoll_event ev[32];
int i, ret;
+ int efd = _ecore_get_epoll_fd();
memset(&ev, 0, sizeof (ev));
- ret = epoll_wait(epoll_fd, ev, sizeof(ev) / sizeof(struct epoll_event), 0);
+ ret = epoll_wait(efd, ev, sizeof(ev) / sizeof(struct epoll_event), 0);
if (ret < 0)
{
if (errno == EINTR) return -1;
epoll_fd = epoll_create(1);
if (epoll_fd < 0)
CRIT("Failed to create epoll fd!");
+ epoll_pid = getpid();
+
+ /* add polls on all our file descriptors */
+ Ecore_Fd_Handler *fdh;
+ EINA_INLIST_FOREACH(fd_handlers, fdh)
+ {
+ if (fdh->delete_me)
+ continue;
+ _ecore_epoll_add(epoll_fd, fdh->fd,
+ _ecore_poll_events_from_fdh(fdh), fdh);
+ _ecore_main_fdh_poll_add(fdh);
+ }
+
#endif
#ifdef USE_G_MAIN_LOOP
close(epoll_fd);
epoll_fd = -1;
}
+
+ epoll_pid = 0;
#endif
}
}
#else /* HAVE_EPOLL */
/* polling on the epoll fd will wake when an fd in the epoll set is active */
- FD_SET(epoll_fd, &rfds);
- max_fd = epoll_fd;
+ max_fd = _ecore_get_epoll_fd();
+ FD_SET(max_fd, &rfds);
#endif /* HAVE_EPOLL */
if (_ecore_signal_count_get()) return -1;
{
Ecore_Input_Window *lookup;
- lookup = _ecore_event_window_match(e->event_window);
+ lookup = _ecore_event_window_match(e->window);
if (!lookup) return ECORE_CALLBACK_RENEW;
ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
if (press == ECORE_DOWN)
Ecore_Input_Window *lookup;
Evas_Button_Flags flags = EVAS_BUTTON_NONE;
- lookup = _ecore_event_window_match(e->event_window);
+ lookup = _ecore_event_window_match(e->window);
if (!lookup) return ECORE_CALLBACK_RENEW;
if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
Ecore_Input_Window *lookup;
e = event;
- lookup = _ecore_event_window_match(e->event_window);
+ lookup = _ecore_event_window_match(e->window);
if (!lookup) return ECORE_CALLBACK_RENEW;
if (e->multi.device == 0)
{
{
Ecore_Input_Window *lookup;
- lookup = _ecore_event_window_match(e->event_window);
+ lookup = _ecore_event_window_match(e->window);
if (!lookup) return ECORE_CALLBACK_RENEW;
ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
switch (io)
Ecore_Input_Window *lookup;
e = event;
- lookup = _ecore_event_window_match(e->event_window);
+ lookup = _ecore_event_window_match(e->window);
if (!lookup) return ECORE_CALLBACK_RENEW;
ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
evas_event_feed_mouse_wheel(lookup->evas, e->direction, e->z, e->timestamp, NULL);