patch from mike to fix kernel issue with closed fd's+ epoll to re-init
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 20 Oct 2010 14:21:19 +0000 (14:21 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 20 Oct 2010 14:21:19 +0000 (14:21 +0000)
epoll fd set. also fix "WARN->WRN and no \n in the patch.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@53672 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore/ecore_main.c

index f9d142f..9435cce 100644 (file)
@@ -237,10 +237,19 @@ _ecore_main_fdh_poll_del(Ecore_Fd_Handler *fdh)
    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(efd, EPOLL_CTL_DEL, fdh->fd, &ev) < 0) &&
-       (errno != EBADF))
+   if ((epoll_ctl(efd, EPOLL_CTL_DEL, fdh->fd, &ev) < 0))
      {
-        ERR("Failed to delete epoll fd %d! (errno=%d)", fdh->fd, errno);
+        if (errno == EBADF)
+          {
+             WRN("fd %d was closed, can't remove from epoll - reinit!", 
+                 fdh->fd);
+             _ecore_main_loop_shutdown();
+             _ecore_main_loop_init();
+          }
+        else
+          {
+             ERR("Failed to delete epoll fd %d! (errno=%d)", fdh->fd, errno);
+          }
      }
 #elif USE_G_MAIN_LOOP
    fdh->gfd.fd = fdh->fd;