somewhat fix deferred freeing of curl objects
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 22 Feb 2012 10:10:22 +0000 (10:10 +0000)
committerMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 22 Feb 2012 10:10:22 +0000 (10:10 +0000)
SVN revision: 68258

legacy/ecore/src/lib/ecore_con/ecore_con_private.h
legacy/ecore/src/lib/ecore_con/ecore_con_url.c

index 017370b..1c6937a 100644 (file)
@@ -221,6 +221,7 @@ struct _Ecore_Con_Url
 
    unsigned int event_count;
    Eina_Bool dead : 1;
+   Eina_Bool multi : 1;
 };
 #endif
 
index c49b85f..3e0561d 100644 (file)
@@ -293,8 +293,11 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
         curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL);
         curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_TRUE);
 
-        _ecore_con_url_multi_remove(url_con);
-        _url_con_list = eina_list_remove(_url_con_list, url_con);
+        if (url_con->multi)
+          {
+             _ecore_con_url_multi_remove(url_con);
+             _url_con_list = eina_list_remove(_url_con_list, url_con);
+          }
 
         curl_easy_cleanup(url_con->curl_easy);
      }
@@ -302,6 +305,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
 
    url_con->curl_easy = NULL;
    url_con->timer = NULL;
+   url_con->dead = EINA_TRUE;
    if (url_con->event_count) return;
    ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE);
 
@@ -1267,9 +1271,8 @@ _ecore_con_url_multi_remove(Ecore_Con_Url *url_con)
 {
    CURLMcode ret;
 
-   if (url_con->dead) return;
-   url_con->dead = EINA_TRUE;
    ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
+   url_con->multi = EINA_FALSE;
    if (ret != CURLM_OK) ERR("curl_multi_remove_handle failed: %s", curl_multi_strerror(ret));
 }
 
@@ -1560,6 +1563,7 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
         return EINA_FALSE;
      }
 
+   url_con->multi = EINA_TRUE;
    _url_con_list = eina_list_append(_url_con_list, url_con);
    ecore_timer_thaw(_curl_timer);