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.
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