dns async lookup fix - if u del svr before dns lookup done
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 21 Jan 2011 10:01:04 +0000 (10:01 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 21 Jan 2011 10:01:04 +0000 (10:01 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@56254 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_con/ecore_con.c
src/lib/ecore_con/ecore_con_ares.c
src/lib/ecore_con/ecore_con_info.c
src/lib/ecore_con/ecore_con_private.h

index 279a3ee..1402557 100644 (file)
@@ -1134,12 +1134,23 @@ ecore_con_client_flush(Ecore_Con_Client *cl)
  * @}
  */
 
+void
+ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info)
+{
+   svr->infos = eina_list_remove(svr->infos, info);
+}
+
 static void
 _ecore_con_server_free(Ecore_Con_Server *svr)
 {
    Ecore_Con_Client *cl;
    double t_start, t;
 
+   while (svr->infos)
+     {
+        ecore_con_info_data_clear(svr->infos->data);
+        svr->infos = eina_list_remove_list(svr->infos, svr->infos);
+     }
    if ((!svr->write_buf) && svr->delete_me && (!svr->dead) && (svr->event_count < 1))
      {
         /* this is a catch-all for cases when a server is not properly killed. */
index fd0d661..9f395a4 100644 (file)
@@ -302,9 +302,17 @@ ecore_con_info_get(Ecore_Con_Server *svr,
                            cares);
      }
 
+   svr->infos = eina_list_append(svr->infos, cares);
    return 1;
 }
 
+void
+ecore_con_info_data_clear(void *info)
+{
+   Ecore_Con_CAres *cares = info;
+   cares->data = NULL;
+}
+
 static Eina_Bool
 _ecore_con_info_cares_timeout_cb(void *data __UNUSED__)
 {
@@ -529,7 +537,11 @@ on_mem_error:
    ERR("Not enough memory");
 
 on_error:
-   arg->done_cb(arg->data, NULL);
+   if (arg->data)
+     {
+        ecore_con_server_infos_del(arg->data, arg);
+        arg->done_cb(arg->data, NULL);
+     }
    free(arg);
 }
 
@@ -567,6 +579,7 @@ _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg,
 
    free(arg->result->info.ai_addr);
    free(arg->result);
+   if (arg->data) ecore_con_server_infos_del(arg->data, arg);
    free(arg);
 }
 
index 055218f..67ad68b 100644 (file)
@@ -306,9 +306,17 @@ ecore_con_info_get(Ecore_Con_Server *svr,
    info_slaves = (CB_Data *)eina_inlist_append(EINA_INLIST_GET(
                                                  info_slaves),
                                                EINA_INLIST_GET(cbdata));
+   svr->infos = eina_list_append(svr->infos, cbdata);
    return 1;
 }
 
+void
+ecore_con_info_data_clear(void *info)
+{
+   CB_Data *cbdata = info;
+   cbdata->data = NULL;
+}
+
 static void
 _ecore_con_info_readdata(CB_Data *cbdata)
 {
@@ -347,15 +355,31 @@ _ecore_con_info_readdata(CB_Data *cbdata)
 
              recv->info.ai_next = NULL;
 
-             cbdata->cb_done(cbdata->data, recv);
+             if (cbdata->data)
+               {
+                  cbdata->cb_done(cbdata->data, recv);
+                  ecore_con_server_infos_del(cbdata->data, cbdata);
+               }
 
              free(torecv);
           }
         else
-          cbdata->cb_done(cbdata->data, NULL);
+          {
+             if (cbdata->data)
+               {
+                  cbdata->cb_done(cbdata->data, NULL);
+                  ecore_con_server_infos_del(cbdata->data, cbdata);
+               }
+          }
      }
    else
-     cbdata->cb_done(cbdata->data, NULL);
+     {
+        if (cbdata->data)
+          {
+             cbdata->cb_done(cbdata->data, NULL);
+             ecore_con_server_infos_del(cbdata->data, cbdata);
+          }
+     }
 
    cbdata->cb_done = NULL;
 }
@@ -368,6 +392,7 @@ _ecore_con_info_slave_free(CB_Data *cbdata)
    ecore_main_fd_handler_del(cbdata->fdh);
    ecore_event_handler_del(cbdata->handler);
    close(ecore_main_fd_handler_fd_get(cbdata->fdh));
+   if (cbdata->data) ecore_con_server_infos_del(cbdata->data, cbdata);
    free(cbdata);
 }
 
@@ -385,8 +410,12 @@ _ecore_con_info_data_handler(void             *data,
           _ecore_con_info_readdata(cbdata);
         else
           {
-             cbdata->cb_done(cbdata->data, NULL);
-             cbdata->cb_done = NULL;
+             if (cbdata->data)
+               {
+                  cbdata->cb_done(cbdata->data, NULL);
+                  cbdata->cb_done = NULL;
+                  ecore_con_server_infos_del(cbdata->data, cbdata);
+               }
           }
      }
 
index d4b4a58..e7b8788 100644 (file)
@@ -127,6 +127,7 @@ struct _Ecore_Con_Server
    int write_buf_size;
    int write_buf_offset;
    unsigned char *write_buf;
+   Eina_List *infos;
    int event_count;
    int client_limit;
    pid_t ppid;
@@ -197,6 +198,9 @@ struct _Ecore_Con_Lookup
    const void *data;
 };
 
+/* from ecore_con.c */
+void ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info);
+
 /* from ecore_local.c */
 int ecore_con_local_init(void);
 int ecore_con_local_shutdown(void);
@@ -230,6 +234,8 @@ int                 ecore_con_info_udp_listen(Ecore_Con_Server *svr,
 int                 ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
                                                 Ecore_Con_Info_Cb done_cb,
                                                 void *data);
+void                ecore_con_info_data_clear(void *info);
+
 /* from ecore_con_ssl.c */
 Ecore_Con_Ssl_Error ecore_con_ssl_init(void);
 Ecore_Con_Ssl_Error ecore_con_ssl_shutdown(void);