Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

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


Modified Files:
        ecore_ipc.c ecore_ipc_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_ipc/ecore_ipc.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -3 -r1.27 -r1.28
--- ecore_ipc.c 13 Mar 2006 08:50:26 -0000      1.27
+++ ecore_ipc.c 20 Mar 2006 05:53:12 -0000      1.28
@@ -217,7 +217,11 @@
 static int _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
 static int _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
 static int _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
+static void _ecore_ipc_event_client_add_free(void *data, void *ev);
+static void _ecore_ipc_event_client_del_free(void *data, void *ev);
 static void _ecore_ipc_event_client_data_free(void *data, void *ev);
+static void _ecore_ipc_event_server_add_free(void *data, void *ev);
+static void _ecore_ipc_event_server_del_free(void *data, void *ev);
 static void _ecore_ipc_event_server_data_free(void *data, void *ev);
     
 EAPI int ECORE_IPC_EVENT_CLIENT_ADD = 0;
@@ -429,13 +433,18 @@
                         "ecore_ipc_server_del");
        return NULL;
      }
-   ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
    data = svr->data;
-   while (svr->clients) ecore_ipc_client_del((Ecore_Ipc_Client *)svr->clients);
-   ecore_con_server_del(svr->server);
-   servers = _ecore_list2_remove(servers, svr);
-   if (svr->buf) free(svr->buf);
-   free(svr);
+   if (svr->event_count > 0)
+     svr->delete_me = 1;
+   else
+     {
+       ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
+       while (svr->clients) ecore_ipc_client_del((Ecore_Ipc_Client 
*)svr->clients);
+       ecore_con_server_del(svr->server);
+       servers = _ecore_list2_remove(servers, svr);
+       if (svr->buf) free(svr->buf);
+       free(svr);
+     }
    return data;
 }
 
@@ -760,13 +769,18 @@
                         "ecore_ipc_client_del");
        return NULL;
      }
-   ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
    data = cl->data;
-   svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
-   ecore_con_client_del(cl->client);
-   svr->clients = _ecore_list2_remove(svr->clients, cl);
-   if (cl->buf) free(cl->buf);
-   free(cl);
+   if (cl->event_count > 0)
+     cl->delete_me = 1;
+   else
+     {
+       ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
+       svr = 
ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
+       ecore_con_client_del(cl->client);
+       svr->clients = _ecore_list2_remove(svr->clients, cl);
+       if (cl->buf) free(cl->buf);
+       free(cl);
+     }
    return data;
 }
 
@@ -868,8 +882,10 @@
             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
             if (e2)
               {
+                  cl->event_count++;
                  e2->client = cl;
-                 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2, NULL, NULL);
+                 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
+                                 _ecore_ipc_event_client_add_free, NULL);
               }
          }
      }
@@ -894,8 +910,10 @@
             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
             if (e2)
               {
+                 cl->event_count++;
                  e2->client = cl;
-                 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2, NULL, NULL);
+                 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
+                                 _ecore_ipc_event_client_del_free, NULL);
               }
          }
      }
@@ -920,8 +938,10 @@
             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
             if (e2)
               {
+                  svr->event_count++;
                  e2->server = svr;
-                 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2, NULL, NULL);
+                 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
+                                 _ecore_ipc_event_server_add_free, NULL);
               }
          }
      }
@@ -946,8 +966,10 @@
             e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
             if (e2)
               {
+                  svr->event_count++;
                  e2->server = svr;
-                 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2, NULL, NULL);
+                 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
+                                 _ecore_ipc_event_server_del_free, NULL);
               }
          }
      }
@@ -1098,6 +1120,7 @@
                       e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
                       if (e2)
                         {
+                           cl->event_count++;
                            e2->client   = cl;
                            e2->major    = msg.major;
                            e2->minor    = msg.minor;
@@ -1107,7 +1130,8 @@
                            e2->size     = msg.size;
                            e2->data     = buf;
                            ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
-                                           _ecore_ipc_event_client_data_free, 
NULL);
+                                           _ecore_ipc_event_client_data_free,
+                                           NULL);
                         }
                    }
                  cl->prev.i = msg;
@@ -1276,6 +1300,7 @@
                       e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
                       if (e2)
                         {
+                           svr->event_count++;
                            e2->server   = svr;
                            e2->major    = msg.major;
                            e2->minor    = msg.minor;
@@ -1285,7 +1310,8 @@
                            e2->size     = msg.size;
                            e2->data     = buf;
                            ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
-                                           _ecore_ipc_event_server_data_free, 
NULL);
+                                           _ecore_ipc_event_server_data_free,
+                                           NULL);
                         }
                    }
                  svr->prev.i = msg;
@@ -1322,12 +1348,58 @@
 }
 
 static void
+_ecore_ipc_event_client_add_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Ipc_Event_Client_Add *e;
+   
+   e = ev;
+   if ((e->client->event_count == 0) && (e->client->delete_me))
+     ecore_ipc_client_del(e->client);
+   free(e);
+}
+
+static void
+_ecore_ipc_event_client_del_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Ipc_Event_Client_Del *e;
+   
+   e = ev;
+   if ((e->client->event_count == 0) && (e->client->delete_me))
+     ecore_ipc_client_del(e->client);
+   free(e);
+}
+
+static void
 _ecore_ipc_event_client_data_free(void *data __UNUSED__, void *ev)
 {
    Ecore_Ipc_Event_Client_Data *e;
    
    e = ev;
    if (e->data) free(e->data);
+   if ((e->client->event_count == 0) && (e->client->delete_me))
+     ecore_ipc_client_del(e->client);
+   free(e);
+}
+
+static void
+_ecore_ipc_event_server_add_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Ipc_Event_Server_Add *e;
+   
+   e = ev;
+   if ((e->server->event_count == 0) && (e->server->delete_me))
+     ecore_ipc_server_del(e->server);
+   free(e);
+}
+
+static void
+_ecore_ipc_event_server_del_free(void *data __UNUSED__, void *ev)
+{
+   Ecore_Ipc_Event_Server_Add *e;
+   
+   e = ev;
+   if ((e->server->event_count == 0) && (e->server->delete_me))
+     ecore_ipc_server_del(e->server);
    free(e);
 }
 
@@ -1338,5 +1410,7 @@
    
    e = ev;
    if (e->data) free(e->data);
+   if ((e->server->event_count == 0) && (e->server->delete_me))
+     ecore_ipc_server_del(e->server);
    free(e);
 }
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_ipc/ecore_ipc_private.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- ecore_ipc_private.h 13 Mar 2006 08:50:26 -0000      1.8
+++ ecore_ipc_private.h 20 Mar 2006 05:53:12 -0000      1.9
@@ -48,6 +48,9 @@
    struct {
       Ecore_Ipc_Msg_Head i, o;
    } prev;
+   
+   int               event_count;
+   char              delete_me : 1;
 };
    
 struct _Ecore_Ipc_Server
@@ -64,6 +67,9 @@
    struct {
       Ecore_Ipc_Msg_Head i, o;
    } prev;
+   
+   int               event_count;
+   char              delete_me : 1;
 };
 
 #endif




-------------------------------------------------------
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