Hi Guys,
Superficially tested... issue is if somebody does:
close(fd);
ecore_main_fd_handler_del(fdh);
epoll can't remove the fd because it's already closed, so we get an EBADF from
the kernel.
Work around the broken case by issuing a WARN() and reinitializing ecore.
thanks,
Mike
>From bba7e843c58983278dbee18adee02e52da972207 Mon Sep 17 00:00:00 2001
From: Mike McCormack <[email protected]>
Date: Tue, 19 Oct 2010 22:10:40 +0900
Subject: [PATCH 2/2] Reinit main loop if somebody passes a closed fd to epoll
---
trunk/ecore/src/lib/ecore/ecore_main.c | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/trunk/ecore/src/lib/ecore/ecore_main.c b/trunk/ecore/src/lib/ecore/ecore_main.c
index f9d142f..e518566 100644
--- a/trunk/ecore/src/lib/ecore/ecore_main.c
+++ b/trunk/ecore/src/lib/ecore/ecore_main.c
@@ -237,10 +237,18 @@ _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)
+ {
+ WARN("fd %d was closed, can't remove from epoll - reinit!\n", 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;
--
1.7.0.4
------------------------------------------------------------------------------
Download new Adobe(R) Flash(R) Builder(TM) 4
The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly
Flex(R) Builder(TM)) enable the development of rich applications that run
across multiple browsers and platforms. Download your free trials today!
http://p.sf.net/sfu/adobe-dev2dev
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel