Dear all,
When i run 'store' menu in elementary_test, i met some segfault.
it's due to inappropriate eina_lock ptr handling.
Thanks
Index: elementary/src/lib/elm_store.c
===================================================================
--- elementary/src/lib/elm_store.c (리비전 67007)
+++ elementary/src/lib/elm_store.c (작업 사본)
@@ -47,7 +47,7 @@
Ecore_Job *eval_job;
const Elm_Store_Item_Mapping *mapping;
void *data;
- Eina_Lock *lock;
+ Eina_Lock lock;
Eina_Bool live : 1;
Eina_Bool was_live : 1;
Eina_Bool realized : 1;
@@ -82,24 +82,24 @@
st->realized = eina_list_remove_list(st->realized, st->realized);
sti->realized = EINA_FALSE;
}
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
if (!sti->fetched)
{
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
if (sti->fetch_th)
{
ecore_thread_cancel(sti->fetch_th);
sti->fetch_th = NULL;
}
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
}
sti->fetched = EINA_FALSE;
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
if (st->cb.unfetch.func)
st->cb.unfetch.func(st->cb.unfetch.data, sti);
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
sti->data = NULL;
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
}
}
@@ -130,7 +130,7 @@
st->cb.unfetch.func(st->cb.unfetch.data, sti);
sti->data = NULL;
}
- eina_lock_free(sti->lock);
+ eina_lock_free(&sti->lock);
st->items = NULL;
free(sti);
}
@@ -145,21 +145,21 @@
_store_filesystem_fetch_do(void *data, Ecore_Thread *th __UNUSED__)
{
Elm_Store_Item *sti = data;
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
if (sti->data)
{
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
return;
}
if (!sti->fetched)
{
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
if (sti->store->cb.fetch.func)
sti->store->cb.fetch.func(sti->store->cb.fetch.data, sti);
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
sti->fetched = EINA_TRUE;
}
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
}
// ************************************************************************
//// * End of separate thread function. *
@@ -169,9 +169,9 @@
_store_filesystem_fetch_end(void *data, Ecore_Thread *th)
{
Elm_Store_Item *sti = data;
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
if (sti->data) elm_genlist_item_update(sti->item);
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
if (th == sti->fetch_th) sti->fetch_th = NULL;
}
@@ -180,10 +180,10 @@
_store_filesystem_fetch_cancel(void *data, Ecore_Thread *th)
{
Elm_Store_Item *sti = data;
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
if (th == sti->fetch_th) sti->fetch_th = NULL;
if (sti->data) elm_genlist_item_update(sti->item);
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
}
static void
@@ -266,7 +266,7 @@
{
Elm_Store_Item *sti = data;
const char *s = "";
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
if (sti->data)
{
const Elm_Store_Item_Mapping *m = _store_item_mapping_find(sti, part);
@@ -286,7 +286,7 @@
}
}
}
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
return s ? strdup(s) : NULL;
}
@@ -294,7 +294,7 @@
_store_item_content_get(void *data, Evas_Object *obj, const char *part)
{
Elm_Store_Item *sti = data;
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
if (sti->data)
{
const Elm_Store_Item_Mapping *m = _store_item_mapping_find(sti, part);
@@ -340,11 +340,11 @@
default:
break;
}
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
return ic;
}
}
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
return NULL;
}
@@ -442,7 +442,7 @@
sti = calloc(1, sizeof(Elm_Store_Item_Filesystem));
if (!sti) goto done;
- eina_lock_new(sti->base.lock);
+ eina_lock_new(&sti->base.lock);
EINA_MAGIC_SET(&(sti->base), ELM_STORE_ITEM_MAGIC);
sti->base.store = st;
sti->base.data = info->base.data;
@@ -553,7 +553,7 @@
st->cb.unfetch.func(st->cb.unfetch.data, sti);
sti->data = NULL;
}
- eina_lock_free(sti->lock);
+ eina_lock_free(&sti->lock);
free(sti);
}
if (st->genlist)
@@ -688,9 +688,9 @@
elm_store_item_data_set(Elm_Store_Item *sti, void *data)
{
if (!EINA_MAGIC_CHECK(sti, ELM_STORE_ITEM_MAGIC)) return;
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
sti->data = data;
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
}
EAPI void *
@@ -698,9 +698,9 @@
{
if (!EINA_MAGIC_CHECK(sti, ELM_STORE_ITEM_MAGIC)) return NULL;
void *d;
- eina_lock_take(sti->lock);
+ eina_lock_take(&sti->lock);
d = sti->data;
- eina_lock_release(sti->lock);
+ eina_lock_release(&sti->lock);
return d;
}
------------------------------------------------------------------------------
Write once. Port to many.
Get the SDK and tools to simplify cross-platform app development. Create
new or port existing apps to sell to consumers worldwide. Explore the
Intel AppUpSM program developer opportunity. appdeveloper.intel.com/join
http://p.sf.net/sfu/intel-appdev
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel