On Tue, Dec 6, 2016 at 10:50 PM, Daniel Zaoui <daniel.za...@samsung.com> wrote:
> Hey borker,
>
> You should run Genlist 3. It is stuck on a lock when loading an image. git 
> bisect shows this patch as causing the issue.

Thanks for the heads up, will check it.

> Enjoy
> Daniel
>
> On Tue, 06 Dec 2016 16:34:54 -0800
> Cedric BAIL <cedric.b...@free.fr> wrote:
>
>> cedric pushed a commit to branch master.
>>
>> http://git.enlightenment.org/core/efl.git/commit/?id=34758ad4f5eb1f036990faa7bfe8b258d1d4f497
>>
>> commit 34758ad4f5eb1f036990faa7bfe8b258d1d4f497
>> Author: Cedric BAIL <ced...@osg.samsung.com>
>> Date:   Mon Dec 5 16:57:46 2016 -0800
>>
>>     evas: switch to use Ecore_Thread instead of half done Evas thread
>> infrastructure. ---
>>  src/lib/evas/cache/evas_preload.c | 199
>> ++++++++++---------------------------- 1 file changed, 51
>> insertions(+), 148 deletions(-)
>>
>> diff --git a/src/lib/evas/cache/evas_preload.c
>> b/src/lib/evas/cache/evas_preload.c index ecd3464..cd299e6 100644
>> --- a/src/lib/evas/cache/evas_preload.c
>> +++ b/src/lib/evas/cache/evas_preload.c
>> @@ -11,135 +11,87 @@
>>  #include "evas_private.h"
>>  #include "Evas.h"
>>
>> -static int _threads_max = 0;
>> -
>> -typedef struct _Evas_Preload_Pthread_Worker
>> Evas_Preload_Pthread_Worker; -typedef struct
>> _Evas_Preload_Pthread_Data Evas_Preload_Pthread_Data; +#include
>> "Ecore.h"
>> +typedef struct _Evas_Preload_Pthread Evas_Preload_Pthread;
>>  typedef void (*_evas_preload_pthread_func)(void *data);
>>
>> -struct _Evas_Preload_Pthread_Worker
>> +struct _Evas_Preload_Pthread
>>  {
>>     EINA_INLIST;
>>
>> +   Ecore_Thread *thread;
>> +
>>     _evas_preload_pthread_func func_heavy;
>>     _evas_preload_pthread_func func_end;
>>     _evas_preload_pthread_func func_cancel;
>>     void *data;
>> -   Eina_Bool cancel : 1;
>> -};
>> -
>> -struct _Evas_Preload_Pthread_Data
>> -{
>> -   Eina_Thread thread;
>>  };
>>
>> -static int _threads_count = 0;
>> -static Evas_Preload_Pthread_Worker *_workers = NULL;
>> -
>> -static LK(_mutex);
>> +static Eina_Inlist *works = NULL;
>>
>>  static void
>> -_evas_preload_thread_end(void *data)
>> +_evas_preload_thread_work_free(Evas_Preload_Pthread *work)
>>  {
>> -   Evas_Preload_Pthread_Data *pth = data;
>> -   Evas_Preload_Pthread_Data *p = NULL;
>> +   works = eina_inlist_remove(works, EINA_INLIST_GET(work));
>>
>> -   if ((p = eina_thread_join(pth->thread))) free(p);
>> -   else return;
>> -   eina_threads_shutdown();
>> +   free(work);
>>  }
>>
>>  static void
>> -_evas_preload_thread_done(void *target EINA_UNUSED,
>> Evas_Callback_Type type EINA_UNUSED, void *event_info)
>> +_evas_preload_thread_success(void *data, Ecore_Thread *thread
>> EINA_UNUSED) {
>> -   Evas_Preload_Pthread_Worker *work = event_info;
>> -   if (work->cancel)
>> -     {
>> -        if (work->func_cancel) work->func_cancel(work->data);
>> -     }
>> -   else
>> -      work->func_end(work->data);
>> +   Evas_Preload_Pthread *work = data;
>>
>> -   free(work);
>> +   work->func_end(work->data);
>> +
>> +    _evas_preload_thread_work_free(work);
>>  }
>>
>> -static void *
>> -_evas_preload_thread_worker(void *data, Eina_Thread thread
>> EINA_UNUSED) +static void
>> +_evas_preload_thread_fail(void *data, Ecore_Thread *thread
>> EINA_UNUSED) {
>> -   Evas_Preload_Pthread_Data *pth = data;
>> -   Evas_Preload_Pthread_Worker *work;
>> -
>> -   eina_thread_name_set(eina_thread_self(), "Eevas-preload");
>> -on_error:
>> -   for (;;)
>> -     {
>> -        LKL(_mutex);
>> -        if (!_workers)
>> -          {
>> -             LKU(_mutex);
>> -             break;
>> -          }
>> +   Evas_Preload_Pthread *work = data;
>>
>> -        work = _workers;
>> -        _workers =
>> EINA_INLIST_CONTAINER_GET(eina_inlist_remove(EINA_INLIST_GET(_workers),
>> EINA_INLIST_GET(_workers)), Evas_Preload_Pthread_Worker);
>> -        LKU(_mutex);
>> +   if (work->func_cancel) work->func_cancel(work->data);
>>
>> -        if (work->func_heavy) work->func_heavy(work->data);
>> -        evas_async_events_put(pth, 0, work,
>> _evas_preload_thread_done);
>> -     }
>> -
>> -   LKL(_mutex);
>> -   if (_workers)
>> -     {
>> -        LKU(_mutex);
>> -        goto on_error;
>> -     }
>> -   _threads_count--;
>> -   LKU(_mutex);
>> +   _evas_preload_thread_work_free(work);
>> +}
>>
>> -   // dummy worker to wake things up
>> -   work = malloc(sizeof(Evas_Preload_Pthread_Worker));
>> -   if (!work) return NULL;
>> +static void
>> +_evas_preload_thread_worker(void *data, Ecore_Thread *thread)
>> +{
>> +   Evas_Preload_Pthread *work = data;
>>
>> -   work->data = pth;
>> -   work->func_heavy = NULL;
>> -   work->func_end = (_evas_preload_pthread_func)
>> _evas_preload_thread_end;
>> -   work->func_cancel = NULL;
>> -   work->cancel = EINA_FALSE;
>> +   work->thread = thread;
>>
>> -   evas_async_events_put(pth, 0, work, _evas_preload_thread_done);
>> -   return pth;
>> +   work->func_heavy(work->data);
>>  }
>>
>>  void
>>  _evas_preload_thread_init(void)
>>  {
>> -   _threads_max = eina_cpu_count();
>> -   if (_threads_max < 1) _threads_max = 1;
>> -
>> -   LKI(_mutex);
>> +   ecore_init();
>>  }
>>
>>  void
>>  _evas_preload_thread_shutdown(void)
>>  {
>> -   /* FIXME: If function are still running in the background, should
>> we kill them ? */
>> -   Evas_Preload_Pthread_Worker *work;
>> +   Evas_Preload_Pthread *work;
>> +
>> +   EINA_INLIST_FOREACH(works, work)
>> +     ecore_thread_cancel(work->thread);
>>
>> -   /* Force processing of async events. */
>> -   evas_async_events_process();
>> -   LKL(_mutex);
>> -   while (_workers)
>> +   while (works)
>>       {
>> -        work = _workers;
>> -        _workers =
>> EINA_INLIST_CONTAINER_GET(eina_inlist_remove(EINA_INLIST_GET(_workers),
>> EINA_INLIST_GET(_workers)), Evas_Preload_Pthread_Worker);
>> -        if (work->func_cancel) work->func_cancel(work->data);
>> -        free(work);
>> +        work = (Evas_Preload_Pthread*) works;
>> +        if (!ecore_thread_wait(work->thread, 1))
>> +          {
>> +             ERR("Can not wait any longer on Evas thread to be done
>> during shutdown. This might lead to a crash.");
>> +             works = eina_inlist_remove(works, works);
>> +          }
>>       }
>> -   LKU(_mutex);
>> -
>> -   LKD(_mutex);
>> +   ecore_shutdown();
>>  }
>>
>>  Evas_Preload_Pthread *
>> @@ -148,10 +100,9 @@ evas_preload_thread_run(void (*func_heavy) (void
>> *data), void (*func_cancel) (void *data),
>>                          const void *data)
>>  {
>> -   Evas_Preload_Pthread_Worker *work;
>> -   Evas_Preload_Pthread_Data *pth;
>> +   Evas_Preload_Pthread *work;
>>
>> -   work = malloc(sizeof(Evas_Preload_Pthread_Worker));
>> +   work = malloc(sizeof(Evas_Preload_Pthread));
>>     if (!work)
>>       {
>>          func_cancel((void *)data);
>> @@ -161,70 +112,22 @@ evas_preload_thread_run(void (*func_heavy)
>> (void *data), work->func_heavy = func_heavy;
>>     work->func_end = func_end;
>>     work->func_cancel = func_cancel;
>> -   work->cancel = EINA_FALSE;
>>     work->data = (void *)data;
>>
>> -   LKL(_mutex);
>> -   _workers = (Evas_Preload_Pthread_Worker
>> *)eina_inlist_append(EINA_INLIST_GET(_workers),
>> EINA_INLIST_GET(work));
>> -   if (_threads_count == _threads_max)
>> -     {
>> -        LKU(_mutex);
>> -        return (Evas_Preload_Pthread *)work;
>> -     }
>> -   LKU(_mutex);
>> -
>> -   /* One more thread could be created. */
>> -   pth = malloc(sizeof(Evas_Preload_Pthread_Data));
>> -   if (!pth) goto on_error;
>> -
>> -   eina_threads_init();
>> -
>> -   if (eina_thread_create(&pth->thread, EINA_THREAD_BACKGROUND, -1,
>> _evas_preload_thread_worker, pth))
>> -     {
>> -        LKL(_mutex);
>> -        _threads_count++;
>> -        LKU(_mutex);
>> -        return (Evas_Preload_Pthread*)work;
>> -     }
>> +   work->thread = ecore_thread_run(_evas_preload_thread_worker,
>> +                                   _evas_preload_thread_success,
>> +                                   _evas_preload_thread_fail,
>> +                                   work);
>> +   if (!work->thread)
>> +     return NULL;
>>
>> -   eina_threads_shutdown();
>> +   works = eina_inlist_prepend(works, EINA_INLIST_GET(work));
>>
>> -on_error:
>> -   LKL(_mutex);
>> -   if (_threads_count == 0)
>> -     {
>> -        _workers =
>> EINA_INLIST_CONTAINER_GET(eina_inlist_remove(EINA_INLIST_GET(_workers),
>> EINA_INLIST_GET(work)), Evas_Preload_Pthread_Worker);
>> -        LKU(_mutex);
>> -        if (work->func_cancel) work->func_cancel(work->data);
>> -        free(work);
>> -        return NULL;
>> -     }
>> -   LKU(_mutex);
>> -   return NULL;
>> +   return work;
>>  }
>>
>>  Eina_Bool
>> -evas_preload_thread_cancel(Evas_Preload_Pthread *thread)
>> +evas_preload_thread_cancel(Evas_Preload_Pthread *work)
>>  {
>> -   Evas_Preload_Pthread_Worker *work;
>> -
>> -   if (!thread) return EINA_TRUE;
>> -   LKL(_mutex);
>> -   EINA_INLIST_FOREACH(_workers, work)
>> -     {
>> -        if (work == (Evas_Preload_Pthread_Worker *)thread)
>> -          {
>> -             _workers =
>> EINA_INLIST_CONTAINER_GET(eina_inlist_remove(EINA_INLIST_GET(_workers),
>> EINA_INLIST_GET(work)), Evas_Preload_Pthread_Worker);
>> -             LKU(_mutex);
>> -             if (work->func_cancel) work->func_cancel(work->data);
>> -             free(work);
>> -             return EINA_TRUE;
>> -          }
>> -     }
>> -   LKU(_mutex);
>> -
>> -   /* Delay the destruction */
>> -   work = (Evas_Preload_Pthread_Worker *)thread;
>> -   work->cancel = EINA_TRUE;
>> -   return EINA_FALSE;
>> +   return ecore_thread_cancel(work->thread);
>>  }
>>
>
>
> ------------------------------------------------------------------------------
> Developer Access Program for Intel Xeon Phi Processors
> Access to Intel Xeon Phi processor-based developer platforms.
> With one year of Intel Parallel Studio XE.
> Training and support from Colfax.
> Order your platform today.http://sdm.link/xeonphi
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel



-- 
Cedric BAIL

------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/xeonphi
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to