forked from enlightenment/efl
eio-model: Fixed concurrent access to filter_cb and monitoring empty directories
Added a spinlock, since contetion should be non-existant. And removed wrong if.
This commit is contained in:
parent
22cfae5b8c
commit
cdd597cb56
|
@ -148,19 +148,16 @@ _efl_model_evt_added_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void
|
||||||
Efl_Model_Children_Event cevt;
|
Efl_Model_Children_Event cevt;
|
||||||
Eina_Value path;
|
Eina_Value path;
|
||||||
|
|
||||||
if (priv->children_list)
|
cevt.child = eo_add_ref(EIO_MODEL_CLASS, priv->obj, eio_model_path_set(evt->filename));
|
||||||
{
|
priv->children_list = eina_list_append(priv->children_list, cevt.child);
|
||||||
cevt.child = eo_add_ref(EIO_MODEL_CLASS, priv->obj, eio_model_path_set(evt->filename));
|
cevt.index = eina_list_count(priv->children_list);
|
||||||
priv->children_list = eina_list_append(priv->children_list, cevt.child);
|
|
||||||
cevt.index = eina_list_count(priv->children_list);
|
|
||||||
|
|
||||||
eina_value_setup(&path, EINA_VALUE_TYPE_STRING);
|
eina_value_setup(&path, EINA_VALUE_TYPE_STRING);
|
||||||
eina_value_set(&path, evt->filename);
|
eina_value_set(&path, evt->filename);
|
||||||
eo_do(cevt.child, eio_model_children_filter_set(priv->filter_cb, priv->filter_userdata));
|
eo_do(cevt.child, eio_model_children_filter_set(priv->filter_cb, priv->filter_userdata));
|
||||||
eina_value_flush(&path);
|
eina_value_flush(&path);
|
||||||
|
|
||||||
eo_do(priv->obj, eo_event_callback_call(EFL_MODEL_BASE_EVENT_CHILD_ADDED, &cevt));
|
eo_do(priv->obj, eo_event_callback_call(EFL_MODEL_BASE_EVENT_CHILD_ADDED, &cevt));
|
||||||
}
|
|
||||||
|
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -391,10 +388,15 @@ _eio_filter_children_load_cb(void *data, Eio_File *handler, const Eina_File_Dire
|
||||||
Eio_Model_Data *priv = data;
|
Eio_Model_Data *priv = data;
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(priv, EINA_FALSE);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(priv, EINA_FALSE);
|
||||||
|
|
||||||
|
eina_spinlock_take(&priv->filter_lock);
|
||||||
if (priv->filter_cb)
|
if (priv->filter_cb)
|
||||||
{
|
{
|
||||||
return priv->filter_cb(priv->filter_userdata, handler, info);
|
Eina_Bool r = priv->filter_cb(priv->filter_userdata, handler, info);
|
||||||
|
eina_spinlock_release(&priv->filter_lock);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
eina_spinlock_release(&priv->filter_lock);
|
||||||
|
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -407,8 +409,10 @@ _eio_main_children_load_cb(void *data, Eio_File *handler EINA_UNUSED, const Eina
|
||||||
EINA_SAFETY_ON_NULL_RETURN(priv);
|
EINA_SAFETY_ON_NULL_RETURN(priv);
|
||||||
|
|
||||||
child = eo_add(MY_CLASS, NULL, eio_model_path_set(info->path));
|
child = eo_add(MY_CLASS, NULL, eio_model_path_set(info->path));
|
||||||
|
eina_spinlock_take(&priv->filter_lock);
|
||||||
if (priv->filter_cb)
|
if (priv->filter_cb)
|
||||||
eo_do(child, eio_model_children_filter_set(priv->filter_cb, priv->filter_userdata));
|
eo_do(child, eio_model_children_filter_set(priv->filter_cb, priv->filter_userdata));
|
||||||
|
eina_spinlock_release(&priv->filter_lock);
|
||||||
|
|
||||||
priv->children_list = eina_list_append(priv->children_list, child);
|
priv->children_list = eina_list_append(priv->children_list, child);
|
||||||
}
|
}
|
||||||
|
@ -506,8 +510,12 @@ _eio_model_efl_model_base_unload(Eo *obj EINA_UNUSED, Eio_Model_Data *priv)
|
||||||
static void
|
static void
|
||||||
_eio_model_children_filter_set(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, Eio_Filter_Direct_Cb filter_cb, void *data)
|
_eio_model_children_filter_set(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, Eio_Filter_Direct_Cb filter_cb, void *data)
|
||||||
{
|
{
|
||||||
|
eina_spinlock_take(&priv->filter_lock);
|
||||||
|
|
||||||
priv->filter_cb = filter_cb;
|
priv->filter_cb = filter_cb;
|
||||||
priv->filter_userdata = data;
|
priv->filter_userdata = data;
|
||||||
|
|
||||||
|
eina_spinlock_release(&priv->filter_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -637,6 +645,7 @@ _eio_model_eo_base_constructor(Eo *obj, Eio_Model_Data *priv)
|
||||||
|
|
||||||
priv->load.status = EFL_MODEL_LOAD_STATUS_UNLOADED;
|
priv->load.status = EFL_MODEL_LOAD_STATUS_UNLOADED;
|
||||||
priv->monitor = NULL;
|
priv->monitor = NULL;
|
||||||
|
eina_spinlock_new(&priv->filter_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -660,6 +669,8 @@ _eio_model_eo_base_destructor(Eo *obj , Eio_Model_Data *priv)
|
||||||
if (priv->monitor)
|
if (priv->monitor)
|
||||||
eio_monitor_del(priv->monitor);
|
eio_monitor_del(priv->monitor);
|
||||||
|
|
||||||
|
eina_spinlock_free(&priv->filter_lock);
|
||||||
|
|
||||||
if (priv->properties_name)
|
if (priv->properties_name)
|
||||||
eina_array_free(priv->properties_name);
|
eina_array_free(priv->properties_name);
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@ struct _Eio_Model_Data
|
||||||
int cb_count_child_del; /**< monitor reference counter for child del event*/
|
int cb_count_child_del; /**< monitor reference counter for child del event*/
|
||||||
Eio_Filter_Direct_Cb filter_cb;
|
Eio_Filter_Direct_Cb filter_cb;
|
||||||
void *filter_userdata;
|
void *filter_userdata;
|
||||||
|
Eina_Spinlock filter_lock; /**< filter callback is called from another thread */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue