forked from enlightenment/efl
elementary: fix call to efl_data_scope_get from another thread.
This should fix the breakage on elm_suite.
This commit is contained in:
parent
2f1d23648a
commit
e6a810efa7
|
@ -243,14 +243,12 @@ _async_open_data_free(Async_Open_Data *data)
|
||||||
static void
|
static void
|
||||||
_efl_ui_image_async_open_do(void *data, Ecore_Thread *thread EINA_UNUSED)
|
_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;
|
Eina_File *f;
|
||||||
Async_Open_Data *todo, *done;
|
Async_Open_Data *todo, *done;
|
||||||
void *map = NULL;
|
void *map = NULL;
|
||||||
unsigned int buf;
|
unsigned int buf;
|
||||||
|
|
||||||
EFL_UI_IMAGE_DATA_GET(obj, sd);
|
|
||||||
|
|
||||||
eina_spinlock_take(&sd->async.lck);
|
eina_spinlock_take(&sd->async.lck);
|
||||||
todo = sd->async.todo;
|
todo = sd->async.todo;
|
||||||
done = sd->async.done;
|
done = sd->async.done;
|
||||||
|
@ -332,8 +330,7 @@ begin:
|
||||||
static void
|
static void
|
||||||
_efl_ui_image_async_open_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
|
_efl_ui_image_async_open_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Evas_Object *obj = data;
|
Efl_Ui_Image_Data * sd = data;
|
||||||
EFL_UI_IMAGE_DATA_GET(obj, sd);
|
|
||||||
|
|
||||||
DBG("Async open thread was canceled");
|
DBG("Async open thread was canceled");
|
||||||
sd->async.th = NULL;
|
sd->async.th = NULL;
|
||||||
|
@ -345,15 +342,13 @@ _efl_ui_image_async_open_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
static void
|
static void
|
||||||
_efl_ui_image_async_open_done(void *data, Ecore_Thread *thread EINA_UNUSED)
|
_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;
|
Eina_Stringshare *file, *key;
|
||||||
Async_Open_Data *done;
|
Async_Open_Data *done;
|
||||||
Eina_Bool ok;
|
Eina_Bool ok;
|
||||||
Eina_File *f;
|
Eina_File *f;
|
||||||
void *map;
|
void *map;
|
||||||
|
|
||||||
EFL_UI_IMAGE_DATA_GET(obj, sd);
|
|
||||||
|
|
||||||
// async open thread can't be running now
|
// async open thread can't be running now
|
||||||
// locking anyways to be sure (memory barrier), see CID 1343345
|
// locking anyways to be sure (memory barrier), see CID 1343345
|
||||||
eina_spinlock_take(&sd->async.lck);
|
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);
|
eina_spinlock_release(&sd->async.lck);
|
||||||
sd->async.th = ecore_thread_run(_efl_ui_image_async_open_do,
|
sd->async.th = ecore_thread_run(_efl_ui_image_async_open_do,
|
||||||
_efl_ui_image_async_open_done,
|
_efl_ui_image_async_open_done,
|
||||||
_efl_ui_image_async_open_cancel, obj);
|
_efl_ui_image_async_open_cancel, sd);
|
||||||
|
|
||||||
return;
|
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.");
|
ERR("Async open failed for an unknown reason.");
|
||||||
sd->async_failed = EINA_TRUE;
|
sd->async_failed = EINA_TRUE;
|
||||||
eina_spinlock_release(&sd->async.lck);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,7 +396,7 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
if (sd->edje)
|
if (sd->edje)
|
||||||
ok = edje_object_mmap_set(sd->img, f, key);
|
ok = edje_object_mmap_set(sd->img, f, key);
|
||||||
else
|
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)
|
if (ok)
|
||||||
|
@ -410,15 +405,15 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
sd->async_failed = EINA_FALSE;
|
sd->async_failed = EINA_FALSE;
|
||||||
ELM_SAFE_FREE(sd->async.file, eina_stringshare_del);
|
ELM_SAFE_FREE(sd->async.file, eina_stringshare_del);
|
||||||
ELM_SAFE_FREE(sd->async.key, 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_event_callback_legacy_call(sd->self, EFL_FILE_EVENT_ASYNC_OPENED, NULL);
|
||||||
_efl_ui_image_internal_sizing_eval(obj, sd);
|
_efl_ui_image_internal_sizing_eval(sd->self, sd);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO: Implement Efl.File async,error event_info type
|
// TODO: Implement Efl.File async,error event_info type
|
||||||
sd->async_failed = EINA_TRUE;
|
sd->async_failed = EINA_TRUE;
|
||||||
// keep file,key around for file_get
|
// 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
|
// close f, map and free strings
|
||||||
|
@ -426,7 +421,7 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread *thread EINA_UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_efl_ui_image_async_file_set(Eo *obj, Efl_Ui_Image_Data *sd,
|
_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)
|
const char *file, const Eina_File *f, const char *key)
|
||||||
{
|
{
|
||||||
Async_Open_Data *todo;
|
Async_Open_Data *todo;
|
||||||
|
@ -448,7 +443,7 @@ _efl_ui_image_async_file_set(Eo *obj, Efl_Ui_Image_Data *sd,
|
||||||
was_running = EINA_FALSE;
|
was_running = EINA_FALSE;
|
||||||
sd->async.th = ecore_thread_run(_efl_ui_image_async_open_do,
|
sd->async.th = ecore_thread_run(_efl_ui_image_async_open_do,
|
||||||
_efl_ui_image_async_open_done,
|
_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;
|
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);
|
elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_IMAGE);
|
||||||
|
|
||||||
pd->scale_type = EFL_UI_IMAGE_SCALE_TYPE_FIT_INSIDE;
|
pd->scale_type = EFL_UI_IMAGE_SCALE_TYPE_FIT_INSIDE;
|
||||||
|
pd->self = obj;
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ typedef enum
|
||||||
typedef struct _Efl_Ui_Image_Data Efl_Ui_Image_Data;
|
typedef struct _Efl_Ui_Image_Data Efl_Ui_Image_Data;
|
||||||
struct _Efl_Ui_Image_Data
|
struct _Efl_Ui_Image_Data
|
||||||
{
|
{
|
||||||
|
Eo *self;
|
||||||
Evas_Object *hit_rect;
|
Evas_Object *hit_rect;
|
||||||
Evas_Object *img;
|
Evas_Object *img;
|
||||||
Evas_Object *prev_img;
|
Evas_Object *prev_img;
|
||||||
|
|
Loading…
Reference in New Issue