Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_con


Modified Files:
        ecore_con.c ecore_con_private.h 


Log Message:


defer server and client deletion for con and ipc until all pending events
have been processed.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/ecore_con.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -3 -r1.59 -r1.60
--- ecore_con.c 13 Mar 2006 08:50:26 -0000      1.59
+++ ecore_con.c 20 Mar 2006 05:53:12 -0000      1.60
@@ -34,7 +34,11 @@
 static int _ecore_con_svr_cl_handler(void *data, Ecore_Fd_Handler *fd_handler);
 static void _ecore_con_server_flush(Ecore_Con_Server *svr);
 static void _ecore_con_client_flush(Ecore_Con_Client *cl);
+static void _ecore_con_event_client_add_free(void *data, void *ev);
+static void _ecore_con_event_client_del_free(void *data, void *ev);
 static void _ecore_con_event_client_data_free(void *data, void *ev);
+static void _ecore_con_event_server_add_free(void *data, void *ev);
+static void _ecore_con_event_server_del_free(void *data, void *ev);
 static void _ecore_con_event_server_data_free(void *data, void *ev);
 
 EAPI int ECORE_CON_EVENT_CLIENT_ADD = 0;
@@ -436,8 +440,10 @@
             e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
             if (e)
               {
+                 svr->event_count++;
                  e->server = svr;
-                 ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, NULL, NULL);
+                 ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
+                                 _ecore_con_event_server_add_free, NULL);
               }
          }
      }
@@ -491,10 +497,15 @@
        ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
                         "ecore_con_server_del");
        return NULL;
-     }   
+     }
    data = svr->data;
-   _ecore_con_server_free(svr);
-   if (ecore_list_goto(servers, svr)) ecore_list_remove(servers);
+   if (svr->event_count > 0)
+     svr->delete_me = 1;
+   else
+     {
+       _ecore_con_server_free(svr);
+       if (ecore_list_goto(servers, svr)) ecore_list_remove(servers);
+     }
    return data;
 }
 
@@ -700,9 +711,14 @@
        return NULL;
      }   
    data = cl->data;
-   if (ecore_list_goto(cl->server->clients, cl))
-     ecore_list_remove(cl->server->clients);
-   _ecore_con_client_free(cl);
+   if (cl->event_count > 0)
+     cl->delete_me = 1;
+   else
+     {
+       if (ecore_list_goto(cl->server->clients, cl))
+         ecore_list_remove(cl->server->clients);
+       _ecore_con_client_free(cl);
+     }
    return data;
 }
 
@@ -842,8 +858,10 @@
             e = calloc(1, sizeof(Ecore_Con_Event_Client_Add));
             if (e)
               {
+                 cl->event_count++;
                  e->client = cl;
-                 ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, e, NULL, NULL);
+                 ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, e,
+                                 _ecore_con_event_client_add_free, NULL);
               }
          }
      }
@@ -888,8 +906,10 @@
    e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
    if (e)
      {
+       svr->event_count++;
        e->server = svr;
-       ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e, NULL, NULL);
+       ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
+                       _ecore_con_event_server_del_free, NULL);
      }
    
    svr->dead = 1;
@@ -984,8 +1004,10 @@
        e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
        if (e)
          {
+            svr->event_count++;
             e->server = svr;
-            ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, NULL, NULL);
+            ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
+                            _ecore_con_event_server_add_free, NULL);
          }
        if (!svr->write_buf)
          ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
@@ -1081,11 +1103,13 @@
                       e = calloc(1, sizeof(Ecore_Con_Event_Server_Data));
                       if (e)
                         {
+                           svr->event_count++;
                            e->server = svr;
                            e->data = inbuf;
                            e->size = inbuf_num;
                            ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e,
-                                           _ecore_con_event_server_data_free, 
NULL);
+                                           _ecore_con_event_server_data_free,
+                                           NULL);
                         }
                    }
                  if (lost_server)
@@ -1150,11 +1174,13 @@
                       e = calloc(1, sizeof(Ecore_Con_Event_Client_Data));
                       if (e)
                         {
+                           cl->event_count++;
                            e->client = cl;
                            e->data = inbuf;
                            e->size = inbuf_num;
                            ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e,
-                                           _ecore_con_event_client_data_free, 
NULL);
+                                           _ecore_con_event_client_data_free,
+                                           NULL);
                         }
                    }
                  if ((errno == EIO) ||  (errno == EBADF) || 
@@ -1167,8 +1193,11 @@
                       e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
                       if (e)
                         {
+                           cl->event_count++;
                            e->client = cl;
-                           ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, 
NULL, NULL);
+                           ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, 
+                                           _ecore_con_event_client_del_free,
+                                           NULL);
                         }
                       cl->dead = 1;
                       ecore_main_fd_handler_del(cl->fd_handler);
@@ -1280,8 +1309,10 @@
             e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
             if (e)
               {
+                 cl->event_count++;
                  e->client = cl;
-                 ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, NULL, NULL);
+                 ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
+                                 _ecore_con_event_client_del_free, NULL);
               }
             cl->dead = 1;
             ecore_main_fd_handler_del(cl->fd_handler);
@@ -1301,12 +1332,63 @@
 }
 
 static void
+_ecore_con_event_client_add_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Con_Event_Client_Add *e;
+
+   e = ev;
+   e->client->event_count--;
+   if ((e->client->event_count == 0) && (e->client->delete_me))
+     ecore_con_client_del(e->client);
+   free(e);
+}
+
+static void
+_ecore_con_event_client_del_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Con_Event_Client_Del *e;
+
+   e = ev;
+   e->client->event_count--;
+   if ((e->client->event_count == 0) && (e->client->delete_me))
+     ecore_con_client_del(e->client);
+   free(e);
+}
+
+static void
 _ecore_con_event_client_data_free(void *data __UNUSED__, void *ev)
 {
    Ecore_Con_Event_Client_Data *e;
 
    e = ev;
+   e->client->event_count--;
    if (e->data) free(e->data);
+   if ((e->client->event_count == 0) && (e->client->delete_me))
+     ecore_con_client_del(e->client);
+   free(e);
+}
+
+static void
+_ecore_con_event_server_add_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Con_Event_Server_Add *e;
+
+   e = ev;
+   e->server->event_count--;
+   if ((e->server->event_count == 0) && (e->server->delete_me))
+     ecore_con_server_del(e->server);
+   free(e);
+}
+
+static void
+_ecore_con_event_server_del_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Con_Event_Server_Del *e;
+
+   e = ev;
+   e->server->event_count--;
+   if ((e->server->event_count == 0) && (e->server->delete_me))
+     ecore_con_server_del(e->server);
    free(e);
 }
 
@@ -1316,6 +1398,9 @@
    Ecore_Con_Event_Server_Data *e;
 
    e = ev;
+   e->server->event_count--;
    if (e->data) free(e->data);
+   if ((e->server->event_count == 0) && (e->server->delete_me))
+     ecore_con_server_del(e->server);
    free(e);
 }
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/ecore_con_private.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- ecore_con_private.h 11 Jan 2006 05:13:23 -0000      1.12
+++ ecore_con_private.h 20 Mar 2006 05:53:12 -0000      1.13
@@ -44,7 +44,9 @@
    int               buf_size;
    int               buf_offset;
    unsigned char    *buf;
+   int               event_count;
    char              dead : 1;
+   char              delete_me : 1;
 };
 
 struct _Ecore_Con_Server
@@ -62,17 +64,18 @@
    int               write_buf_size;
    int               write_buf_offset;
    unsigned char    *write_buf;
-   char              dead : 1;
-   char              created : 1;
-   char              connecting : 1;
-   char              reject_excess_clients : 1;
+   int               event_count;
    int               client_limit;
    pid_t             ppid;
-
 #if USE_OPENSSL
    SSL_CTX          *ssl_ctx;
    SSL              *ssl;
 #endif
+   char              dead : 1;
+   char              created : 1;
+   char              connecting : 1;
+   char              reject_excess_clients : 1;
+   char              delete_me : 1;
 };
 
 #ifdef HAVE_CURL




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to