On Wed, 07 Sep 2016 11:43:12 -0700 Cedric BAIL <[email protected]> said:

what? it was doing legacy calls (thus eo calls) from a thread without a
begin/end around it or any kind of proper "send result back to mainloop"?

BAD CODE! BAD!

i'm so happy this change found it! :) good eo. GOOD BOY. here. have a codesnack.

> cedric pushed a commit to branch master.
> 
> http://git.enlightenment.org/core/efl.git/commit/?id=e6a810efa75ac4e6941964a8737beb03f83bb2fa
> 
> commit e6a810efa75ac4e6941964a8737beb03f83bb2fa
> Author: Cedric BAIL <[email protected]>
> Date:   Wed Sep 7 11:42:29 2016 -0700
> 
>     elementary: fix call to efl_data_scope_get from another thread.
>     
>     This should fix the breakage on elm_suite.
> ---
>  src/lib/elementary/efl_ui_image.c        | 30 +++++++++++++-----------------
>  src/lib/elementary/efl_ui_widget_image.h |  1 +
>  2 files changed, 14 insertions(+), 17 deletions(-)
> 
> diff --git a/src/lib/elementary/efl_ui_image.c
> b/src/lib/elementary/efl_ui_image.c index 3c697aa..0ddab23 100644
> --- a/src/lib/elementary/efl_ui_image.c
> +++ b/src/lib/elementary/efl_ui_image.c
> @@ -243,14 +243,12 @@ _async_open_data_free(Async_Open_Data *data)
>  static void
>  _efl_ui_image_async_open_do(void *data, Ecore_Thread *thread EINA_UNUSED)
>  {
> -   Evas_Object *obj = data;
> +   Efl_Ui_Image_Data * sd = data;
>     Eina_File *f;
>     Async_Open_Data *todo, *done;
>     void *map = NULL;
>     unsigned int buf;
>  
> -   EFL_UI_IMAGE_DATA_GET(obj, sd);
> -
>     eina_spinlock_take(&sd->async.lck);
>     todo = sd->async.todo;
>     done = sd->async.done;
> @@ -332,8 +330,7 @@ begin:
>  static void
>  _efl_ui_image_async_open_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
>  {
> -   Evas_Object *obj = data;
> -   EFL_UI_IMAGE_DATA_GET(obj, sd);
> +   Efl_Ui_Image_Data * sd = data;
>  
>     DBG("Async open thread was canceled");
>     sd->async.th = NULL;
> @@ -345,15 +342,13 @@ _efl_ui_image_async_open_cancel(void *data,
> Ecore_Thread *thread EINA_UNUSED) static void
>  _efl_ui_image_async_open_done(void *data, Ecore_Thread *thread EINA_UNUSED)
>  {
> -   Evas_Object *obj = data;
> +   Efl_Ui_Image_Data * sd = data;
>     Eina_Stringshare *file, *key;
>     Async_Open_Data *done;
>     Eina_Bool ok;
>     Eina_File *f;
>     void *map;
>  
> -   EFL_UI_IMAGE_DATA_GET(obj, sd);
> -
>     // async open thread can't be running now
>     // locking anyways to be sure (memory barrier), see CID 1343345
>     eina_spinlock_take(&sd->async.lck);
> @@ -366,7 +361,7 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread
> *thread EINA_UNUSED) eina_spinlock_release(&sd->async.lck);
>          sd->async.th = ecore_thread_run(_efl_ui_image_async_open_do,
>                                          _efl_ui_image_async_open_done,
> -                                        _efl_ui_image_async_open_cancel,
> obj);
> +                                        _efl_ui_image_async_open_cancel, sd);
>  
>          return;
>       }
> @@ -380,7 +375,7 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread
> *thread EINA_UNUSED) ERR("Async open failed for an unknown reason.");
>          sd->async_failed = EINA_TRUE;
>          eina_spinlock_release(&sd->async.lck);
> -        efl_event_callback_legacy_call(obj, EFL_FILE_EVENT_ASYNC_ERROR,
> NULL);
> +        efl_event_callback_legacy_call(sd->self, EFL_FILE_EVENT_ASYNC_ERROR,
> NULL); return;
>       }
>  
> @@ -401,7 +396,7 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread
> *thread EINA_UNUSED) if (sd->edje)
>            ok = edje_object_mmap_set(sd->img, f, key);
>          else
> -          ok = _efl_ui_image_smart_internal_file_set(obj, sd, file, f, key);
> +          ok = _efl_ui_image_smart_internal_file_set(sd->self, sd, file, f,
> key); }
>  
>     if (ok)
> @@ -410,15 +405,15 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread
> *thread EINA_UNUSED) sd->async_failed = EINA_FALSE;
>          ELM_SAFE_FREE(sd->async.file, eina_stringshare_del);
>          ELM_SAFE_FREE(sd->async.key, eina_stringshare_del);
> -        efl_event_callback_legacy_call(obj, EFL_FILE_EVENT_ASYNC_OPENED,
> NULL);
> -        _efl_ui_image_internal_sizing_eval(obj, sd);
> +        efl_event_callback_legacy_call(sd->self,
> EFL_FILE_EVENT_ASYNC_OPENED, NULL);
> +        _efl_ui_image_internal_sizing_eval(sd->self, sd);
>       }
>     else
>       {
>          // TODO: Implement Efl.File async,error event_info type
>          sd->async_failed = EINA_TRUE;
>          // keep file,key around for file_get
> -        efl_event_callback_legacy_call(obj, EFL_FILE_EVENT_ASYNC_ERROR,
> NULL);
> +        efl_event_callback_legacy_call(sd->self, EFL_FILE_EVENT_ASYNC_ERROR,
> NULL); }
>  
>     // close f, map and free strings
> @@ -426,8 +421,8 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread
> *thread EINA_UNUSED) }
>  
>  static Eina_Bool
> -_efl_ui_image_async_file_set(Eo *obj, Efl_Ui_Image_Data *sd,
> -                          const char *file, const Eina_File *f, const char
> *key) +_efl_ui_image_async_file_set(Eo *obj EINA_UNUSED, Efl_Ui_Image_Data
> *sd,
> +                             const char *file, const Eina_File *f, const
> char *key) {
>     Async_Open_Data *todo;
>     Eina_Bool was_running;
> @@ -448,7 +443,7 @@ _efl_ui_image_async_file_set(Eo *obj, Efl_Ui_Image_Data
> *sd, was_running = EINA_FALSE;
>          sd->async.th = ecore_thread_run(_efl_ui_image_async_open_do,
>                                          _efl_ui_image_async_open_done,
> -                                        _efl_ui_image_async_open_cancel,
> obj);
> +                                        _efl_ui_image_async_open_cancel, sd);
>       }
>     else was_running = EINA_TRUE;
>  
> @@ -882,6 +877,7 @@ _efl_ui_image_efl_object_constructor(Eo *obj,
> Efl_Ui_Image_Data *pd) elm_interface_atspi_accessible_role_set(obj,
> ELM_ATSPI_ROLE_IMAGE); 
>     pd->scale_type = EFL_UI_IMAGE_SCALE_TYPE_FIT_INSIDE;
> +   pd->self = obj;
>  
>     return obj;
>  }
> diff --git a/src/lib/elementary/efl_ui_widget_image.h
> b/src/lib/elementary/efl_ui_widget_image.h index a0da68a..209d65a 100644
> --- a/src/lib/elementary/efl_ui_widget_image.h
> +++ b/src/lib/elementary/efl_ui_widget_image.h
> @@ -43,6 +43,7 @@ typedef enum
>  typedef struct _Efl_Ui_Image_Data Efl_Ui_Image_Data;
>  struct _Efl_Ui_Image_Data
>  {
> +   Eo                   *self;
>     Evas_Object          *hit_rect;
>     Evas_Object          *img;
>     Evas_Object          *prev_img;
> 
> -- 
> 
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    [email protected]


------------------------------------------------------------------------------
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to