From c8a62c0cb293b5f3679ffe22dc1cd2ce4764d462 Mon Sep 17 00:00:00 2001 From: Daniel Juyung Seo Date: Wed, 28 Sep 2011 05:30:57 +0000 Subject: [PATCH] ecore ecore_con_url.c: Applied ui interactoin bug fix patch from Kim Yunhan On Wed, Sep 21, 2011 at 10:51 PM, Kim Yunhan 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. SVN revision: 63636 --- legacy/ecore/src/lib/ecore_con/ecore_con_url.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con_url.c b/legacy/ecore/src/lib/ecore_con/ecore_con_url.c index f6547deba5..4bf28d68e1 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con_url.c +++ b/legacy/ecore/src/lib/ecore_con/ecore_con_url.c @@ -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;