ecore ecore_con_url.c: Applied ui interactoin bug fix patch from Kim
authorseoz <seoz@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 28 Sep 2011 05:30:57 +0000 (05:30 +0000)
committerseoz <seoz@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 28 Sep 2011 05:30:57 +0000 (05:30 +0000)
Yunhan <spbear@gmail.com>

On Wed, Sep 21, 2011 at 10:51 PM, Kim Yunhan <spbear@gmail.com> wrote:
> Hello!
>
> elm_map uses Ecore Con with CURL.
> I tested elm_map many times on my device.
> But sometimes UI interaction is held when data connection is poor.
> So I tried to debug and I found that this code lead to hold an Ecore
main
> loop.
>
> ----------------------------------------------
> In ecore_con_url.c
>
> while (curl_multi_perform(_curlm, &still_running) ==
> CURLM_CALL_MULTI_PERFORM) ;
> ----------------------------------------------
>
> curl_multi_perform() is CURL's asynchronous API.
> But above code hold an Ecore main loop.
> When it takes long time in libcurl, UI interaction is delayed.
>
> For example, If you have poor data connection.
> libcurl is trying to resolve DNS in this step.
> But it have to wait until timeout.
> At that time it looks like being locked.
>
> So I write a patch for fixing it.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@63636 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_con/ecore_con_url.c

index f6547de..4bf28d6 100644 (file)
@@ -1357,14 +1357,20 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
    int fd_max, fd;
    int flags, still_running;
    int completed_immediately = 0;
+   double start;
    CURLMcode ret;
 
    _url_con_list = eina_list_append(_url_con_list, url_con);
 
    url_con->active = EINA_TRUE;
    curl_multi_add_handle(_curlm, url_con->curl_easy);
-   /* This one can't be stopped, or the download never start. */
-   while (curl_multi_perform(_curlm, &still_running) == CURLM_CALL_MULTI_PERFORM) ;
+
+   start = ecore_time_get();
+   while (curl_multi_perform(_curlm, &still_running) == CURLM_CALL_MULTI_PERFORM)
+     if ((ecore_time_get() - start) > (0.7 * ecore_animator_frametime_get()))
+       {
+          break;
+       }
 
    completed_immediately = _ecore_con_url_process_completed_jobs(url_con);
 
@@ -1456,7 +1462,7 @@ _ecore_con_url_idler_handler(void *data)
    start = ecore_time_get();
    while (curl_multi_perform(_curlm, &still_running) == CURLM_CALL_MULTI_PERFORM)
      /* make this not more than a frametime to keep interactivity high */
-     if ((ecore_time_get() - start) > ecore_animator_frametime_get())
+     if ((ecore_time_get() - start) > (0.7 * ecore_animator_frametime_get()))
        {
           done = 0;
           break;