* Move Ecore_Fd_Handler to Eina_Inlist.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 4 Mar 2009 10:50:14 +0000 (10:50 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 4 Mar 2009 10:50:14 +0000 (10:50 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@39360 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore/ecore_main.c
src/lib/ecore/ecore_private.h

index 6258819..cc54133 100644 (file)
@@ -18,6 +18,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include <errno.h>
+#include <assert.h>
 
 #define FIX_HZ 1
 
@@ -149,6 +150,11 @@ ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, int (*func) (voi
    if ((fd < 0) ||
        (flags == 0) ||
        (!func)) return NULL;
+
+   EINA_INLIST_FOREACH(fd_handlers, fdh)
+     if (fdh->fd == fd && fdh->flags == flags)
+       abort();
+
    fdh = calloc(1, sizeof(Ecore_Fd_Handler));
    if (!fdh) return NULL;
    ECORE_MAGIC_SET(fdh, ECORE_MAGIC_FD_HANDLER);
@@ -162,7 +168,8 @@ ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, int (*func) (voi
    fdh->data = (void *)data;
    fdh->buf_func = buf_func;
    fdh->buf_data = (void *)buf_data;
-   fd_handlers = _ecore_list2_append(fd_handlers, fdh);
+   fd_handlers = (Ecore_Fd_Handler *) eina_inlist_append(EINA_INLIST_GET(fd_handlers),
+                                                        EINA_INLIST_GET(fdh));
    return fdh;
 }
 
@@ -279,7 +286,8 @@ _ecore_main_shutdown(void)
        Ecore_Fd_Handler *fdh;
 
        fdh = fd_handlers;
-       fd_handlers = _ecore_list2_remove(fd_handlers, fdh);
+       fd_handlers = (Ecore_Fd_Handler *) eina_inlist_remove(EINA_INLIST_GET(fd_handlers),
+                                                             EINA_INLIST_GET(fdh));
        ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
        free(fdh);
      }
@@ -293,7 +301,9 @@ _ecore_main_select(double timeout)
    fd_set         rfds, wfds, exfds;
    int            max_fd;
    int            ret;
-   Ecore_List2    *l;
+   Ecore_Fd_Handler *fdh;
+
+   int cr, cw, ce;
 
    t = NULL;
    if ((!finite(timeout)) || (timeout == 0.0))  /* finite() tests for NaN, too big, too small, and infinity.  */
@@ -328,33 +338,31 @@ _ecore_main_select(double timeout)
    FD_ZERO(&wfds);
    FD_ZERO(&exfds);
 
-   /* call the prepare callback for all handlers */
-   for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
-     {
-       Ecore_Fd_Handler *fdh;
-
-       fdh = (Ecore_Fd_Handler *)l;
+   cr = 0;
+   cw = 0;
+   ce = 0;
 
-       if (!fdh->delete_me && fdh->prep_func)
-         fdh->prep_func (fdh->prep_data, fdh);
-     }
-   for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
+   /* call the prepare callback for all handlers */
+   EINA_INLIST_FOREACH(fd_handlers, fdh)
+     if (!fdh->delete_me && fdh->prep_func)
+       fdh->prep_func (fdh->prep_data, fdh);
+   EINA_INLIST_FOREACH(fd_handlers, fdh)
      {
-       Ecore_Fd_Handler *fdh;
-
-       fdh = (Ecore_Fd_Handler *)l;
        if (fdh->flags & ECORE_FD_READ)
          {
+            cr++;
             FD_SET(fdh->fd, &rfds);
             if (fdh->fd > max_fd) max_fd = fdh->fd;
          }
        if (fdh->flags & ECORE_FD_WRITE)
          {
+            cw++;
             FD_SET(fdh->fd, &wfds);
             if (fdh->fd > max_fd) max_fd = fdh->fd;
          }
        if (fdh->flags & ECORE_FD_ERROR)
          {
+            ce++;
             FD_SET(fdh->fd, &exfds);
             if (fdh->fd > max_fd) max_fd = fdh->fd;
          }
@@ -365,24 +373,31 @@ _ecore_main_select(double timeout)
    if (ret < 0)
      {
        if (errno == EINTR) return -1;
-     }
-   if (ret > 0)
-     {
-       for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
+       if (errno == EBADF)
          {
-            Ecore_Fd_Handler *fdh;
+            fprintf(stderr, "max_fd: %i\n", max_fd);
+            fprintf(stderr, "cr: %i, cw: %i, ce: %i\n", cr, cw, ce);
 
-            fdh = (Ecore_Fd_Handler *)l;
-            if (!fdh->delete_me)
+            EINA_INLIST_FOREACH(fd_handlers, fdh)
               {
-                 if (FD_ISSET(fdh->fd, &rfds))
-                   fdh->read_active = 1;
-                 if (FD_ISSET(fdh->fd, &wfds))
-                   fdh->write_active = 1;
-                 if (FD_ISSET(fdh->fd, &exfds))
-                   fdh->error_active = 1;
+                 if (fdh->flags & ECORE_FD_WRITE)
+                   fprintf(stderr, "%p => %i\n", fdh, fdh->fd);
               }
+            abort();
          }
+     }
+   if (ret > 0)
+     {
+       EINA_INLIST_FOREACH(fd_handlers, fdh)
+         if (!fdh->delete_me)
+           {
+              if (FD_ISSET(fdh->fd, &rfds))
+                fdh->read_active = 1;
+              if (FD_ISSET(fdh->fd, &wfds))
+                fdh->write_active = 1;
+              if (FD_ISSET(fdh->fd, &exfds))
+                fdh->error_active = 1;
+           }
        _ecore_main_fd_handlers_cleanup();
        return 1;
      }
@@ -392,18 +407,19 @@ _ecore_main_select(double timeout)
 static void
 _ecore_main_fd_handlers_cleanup(void)
 {
-   Ecore_List2 *l;
+   Ecore_Fd_Handler *fdh;
+   Eina_Inlist *l;
 
    if (!fd_handlers_delete_me) return;
-   for (l = (Ecore_List2 *)fd_handlers; l;)
+   for (l = EINA_INLIST_GET(fd_handlers); l; )
      {
-       Ecore_Fd_Handler *fdh;
+       fdh = (Ecore_Fd_Handler *) l;
 
-       fdh = (Ecore_Fd_Handler *)l;
        l = l->next;
        if (fdh->delete_me)
          {
-            fd_handlers = _ecore_list2_remove(fd_handlers, fdh);
+            fd_handlers = (Ecore_Fd_Handler *) eina_inlist_remove(EINA_INLIST_GET(fd_handlers),
+                                                                  EINA_INLIST_GET(fdh));
             ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
             free(fdh);
          }
@@ -414,56 +430,47 @@ _ecore_main_fd_handlers_cleanup(void)
 static void
 _ecore_main_fd_handlers_call(void)
 {
-   Ecore_List2    *l;
-
-   for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
-     {
-       Ecore_Fd_Handler *fdh;
+   Ecore_Fd_Handler *fdh;
 
-       fdh = (Ecore_Fd_Handler *)l;
-       if (!fdh->delete_me)
-         {
-            if ((fdh->read_active) ||
-                (fdh->write_active) ||
-                (fdh->error_active))
-              {
-                 if (!fdh->func(fdh->data, fdh))
-                   {
-                      fdh->delete_me = 1;
-                      fd_handlers_delete_me = 1;
-                   }
-                 fdh->read_active = 0;
+   EINA_INLIST_FOREACH(fd_handlers, fdh)
+     if (!fdh->delete_me)
+       {
+         if ((fdh->read_active) ||
+             (fdh->write_active) ||
+             (fdh->error_active))
+           {
+              if (!fdh->func(fdh->data, fdh))
+                {
+                   fdh->delete_me = 1;
+                   fd_handlers_delete_me = 1;
+                }
+              fdh->read_active = 0;
                  fdh->write_active = 0;
                  fdh->error_active = 0;
-              }
-         }
-     }
+           }
+       }
 }
 
 static int
 _ecore_main_fd_handlers_buf_call(void)
 {
-   Ecore_List2    *l;
+   Ecore_Fd_Handler *fdh;
    int ret;
 
    ret = 0;
-   for (l = (Ecore_List2 *)fd_handlers; l; l = l->next)
-     {
-       Ecore_Fd_Handler *fdh;
+   EINA_INLIST_FOREACH(fd_handlers, fdh)
+     if (!fdh->delete_me)
+       {
+         if (fdh->buf_func)
+           {
+              if (fdh->buf_func(fdh->buf_data, fdh))
+                {
+                   ret |= fdh->func(fdh->data, fdh);
+                   fdh->read_active = 1;
+                }
+           }
+       }
 
-       fdh = (Ecore_Fd_Handler *)l;
-       if (!fdh->delete_me)
-         {
-            if (fdh->buf_func)
-              {
-                 if (fdh->buf_func(fdh->buf_data, fdh))
-                   {
-                      ret |= fdh->func(fdh->data, fdh);
-                      fdh->read_active = 1;
-                   }
-              }
-         }
-     }
    return ret;
 }
 
index 0188d27..02b4e45 100644 (file)
@@ -8,6 +8,8 @@
 # include <signal.h>
 #endif
 
+#include <Eina.h>
+
 #ifdef EAPI
 # undef EAPI
 #endif
@@ -312,7 +314,7 @@ struct _Ecore_Idle_Exiter
 
 struct _Ecore_Fd_Handler
 {
-   Ecore_List2               __list_data;
+   EINA_INLIST;
    ECORE_MAGIC;
    int                      fd;
    Ecore_Fd_Handler_Flags   flags;