forked from enlightenment/efl
Eobj: Made weak ref a base class function.
SVN revision: 70436
This commit is contained in:
parent
3cc5c60d17
commit
9d03a70fa2
|
@ -619,39 +619,6 @@ EAPI void eobj_xunref(Eobj *obj, const Eobj *ref_obj);
|
|||
*/
|
||||
EAPI void eobj_del(Eobj *obj);
|
||||
|
||||
/**
|
||||
* @addtogroup Eobj_Weak_Ref Weak reference for Eobj objects.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Add a new weak reference to obj.
|
||||
* @param wref The pointer to use for the weak ref.
|
||||
* @param obj The object being referenced.
|
||||
* @return The object being referenced (obj).
|
||||
*
|
||||
* This function registers the object handle pointed by wref to obj so when
|
||||
* obj is deleted it'll be updated to NULL. This functions should be used
|
||||
* when you want to keep track of an object in a safe way, but you don't want
|
||||
* to prevent it from being freed.
|
||||
*
|
||||
* @see eobj_weak_ref_del()
|
||||
*/
|
||||
EAPI Eobj *eobj_weak_ref_add(Eobj **wref, const Eobj *obj);
|
||||
|
||||
/**
|
||||
* @brief Delete the weak reference passed.
|
||||
* @param wref the weak reference to free.
|
||||
*
|
||||
* @see eobj_weak_ref_add()
|
||||
*/
|
||||
EAPI void eobj_weak_ref_del(Eobj **wref);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup Eobj_Composite_Objects Composite Objects.
|
||||
* @{
|
||||
|
@ -873,6 +840,8 @@ enum {
|
|||
EOBJ_BASE_SUB_ID_DATA_SET,
|
||||
EOBJ_BASE_SUB_ID_DATA_GET,
|
||||
EOBJ_BASE_SUB_ID_DATA_DEL,
|
||||
EOBJ_BASE_SUB_ID_WREF_ADD,
|
||||
EOBJ_BASE_SUB_ID_WREF_DEL,
|
||||
EOBJ_BASE_SUB_ID_LAST
|
||||
};
|
||||
|
||||
|
@ -916,6 +885,29 @@ enum {
|
|||
*/
|
||||
#define eobj_base_data_del(key) EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_DEL), EOBJ_TYPECHECK(const char *, key)
|
||||
|
||||
/**
|
||||
* @def eobj_wref_add
|
||||
* @brief Add a new weak reference to obj.
|
||||
* @param wref The pointer to use for the weak ref.
|
||||
*
|
||||
* This function registers the object handle pointed by wref to obj so when
|
||||
* obj is deleted it'll be updated to NULL. This functions should be used
|
||||
* when you want to keep track of an object in a safe way, but you don't want
|
||||
* to prevent it from being freed.
|
||||
*
|
||||
* @see #eobj_wref_del
|
||||
*/
|
||||
#define eobj_wref_add(wref) EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_WREF_ADD), EOBJ_TYPECHECK(Eobj **, wref)
|
||||
|
||||
/**
|
||||
* @def eobj_wref_del
|
||||
* @brief Delete the weak reference passed.
|
||||
* @param wref the weak reference to free.
|
||||
*
|
||||
* @see #eobj_wref_add
|
||||
*/
|
||||
#define eobj_wref_del(wref) EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_WREF_DEL), EOBJ_TYPECHECK(Eobj **, wref)
|
||||
|
||||
/**
|
||||
* @var _EOBJ_EV_CALLBACK_ADD
|
||||
* see EOBJ_EV_CALLBACK_ADD
|
||||
|
|
|
@ -1097,40 +1097,6 @@ eobj_ref_get(const Eobj *obj)
|
|||
return obj->refcount;
|
||||
}
|
||||
|
||||
/* Weak reference. */
|
||||
Eina_Bool
|
||||
_eobj_weak_ref_cb(void *data, Eobj *obj EINA_UNUSED, const Eobj_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eobj **wref = data;
|
||||
*wref = NULL;
|
||||
|
||||
return EOBJ_CALLBACK_CONTINUE;
|
||||
}
|
||||
|
||||
EAPI Eobj *
|
||||
eobj_weak_ref_add(Eobj **wref, const Eobj *_obj)
|
||||
{
|
||||
Eobj *obj = (Eobj *) _obj;
|
||||
EOBJ_MAGIC_RETURN_VAL(obj, EOBJ_EINA_MAGIC, obj);
|
||||
|
||||
*wref = obj;
|
||||
eobj_event_callback_add(obj, EOBJ_EV_DEL, _eobj_weak_ref_cb, wref);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
eobj_weak_ref_del(Eobj **wref)
|
||||
{
|
||||
if (*wref)
|
||||
{
|
||||
eobj_event_callback_del(*wref, EOBJ_EV_DEL, _eobj_weak_ref_cb,
|
||||
wref);
|
||||
}
|
||||
}
|
||||
|
||||
/* EOF Weak reference. */
|
||||
|
||||
EAPI void
|
||||
eobj_del(Eobj *obj)
|
||||
{
|
||||
|
|
|
@ -114,6 +114,43 @@ _data_del(Eobj *obj EINA_UNUSED, void *class_data, va_list *list)
|
|||
}
|
||||
}
|
||||
|
||||
/* Weak reference. */
|
||||
static Eina_Bool
|
||||
_eobj_weak_ref_cb(void *data, Eobj *obj EINA_UNUSED, const Eobj_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eobj **wref = data;
|
||||
*wref = NULL;
|
||||
|
||||
return EOBJ_CALLBACK_CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
_wref_add(const Eobj *obj, const void *class_data EINA_UNUSED, va_list *list)
|
||||
{
|
||||
Eobj **wref = va_arg(*list, Eobj **);
|
||||
|
||||
*wref = (Eobj *) obj;
|
||||
/* FIXME: The cast and the one in the next func are both bad and should be
|
||||
* fixed once the event callback functions are fixed. */
|
||||
eobj_event_callback_add((Eobj *) obj, EOBJ_EV_DEL, _eobj_weak_ref_cb, wref);
|
||||
}
|
||||
|
||||
static void
|
||||
_wref_del(const Eobj *obj, const void *class_data EINA_UNUSED, va_list *list)
|
||||
{
|
||||
Eobj **wref = va_arg(*list, Eobj **);
|
||||
if (*wref != obj)
|
||||
{
|
||||
ERR("Wref is a weak ref to %p, while this function was called on %p.",
|
||||
*wref, obj);
|
||||
return;
|
||||
}
|
||||
eobj_event_callback_del((Eobj *) obj, EOBJ_EV_DEL, _eobj_weak_ref_cb, wref);
|
||||
}
|
||||
|
||||
/* EOF Weak reference. */
|
||||
|
||||
|
||||
/* EOBJ_BASE_CLASS stuff */
|
||||
#define MY_CLASS EOBJ_BASE_CLASS
|
||||
|
||||
|
@ -148,6 +185,8 @@ _class_constructor(Eobj_Class *klass)
|
|||
EOBJ_OP_FUNC(EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_SET), _data_set),
|
||||
EOBJ_OP_FUNC_CONST(EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_GET), _data_get),
|
||||
EOBJ_OP_FUNC(EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_DEL), _data_del),
|
||||
EOBJ_OP_FUNC_CONST(EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_WREF_ADD), _wref_add),
|
||||
EOBJ_OP_FUNC_CONST(EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_WREF_DEL), _wref_del),
|
||||
EOBJ_OP_FUNC_SENTINEL
|
||||
};
|
||||
|
||||
|
@ -158,6 +197,8 @@ static const Eobj_Op_Description op_desc[] = {
|
|||
EOBJ_OP_DESCRIPTION(EOBJ_BASE_SUB_ID_DATA_SET, "?", "Set data for key."),
|
||||
EOBJ_OP_DESCRIPTION_CONST(EOBJ_BASE_SUB_ID_DATA_GET, "?", "Get data for key."),
|
||||
EOBJ_OP_DESCRIPTION(EOBJ_BASE_SUB_ID_DATA_DEL, "?", "Del key."),
|
||||
EOBJ_OP_DESCRIPTION_CONST(EOBJ_BASE_SUB_ID_WREF_ADD, "?", "Add a weak ref to the object."),
|
||||
EOBJ_OP_DESCRIPTION_CONST(EOBJ_BASE_SUB_ID_WREF_DEL, "?", "Delete the weak ref."),
|
||||
EOBJ_OP_DESCRIPTION_SENTINEL
|
||||
};
|
||||
|
||||
|
|
|
@ -70,16 +70,16 @@ START_TEST(eobj_weak_reference)
|
|||
|
||||
Eobj *obj = eobj_add(SIMPLE_CLASS, NULL);
|
||||
Eobj *wref;
|
||||
eobj_weak_ref_add(&wref, obj);
|
||||
eobj_do(obj, eobj_wref_add(&wref));
|
||||
fail_if(!wref);
|
||||
|
||||
eobj_unref(obj);
|
||||
fail_if(wref);
|
||||
|
||||
eobj_weak_ref_del(&wref);
|
||||
eobj_do(obj, eobj_wref_del(&wref));
|
||||
|
||||
obj = eobj_add(SIMPLE_CLASS, NULL);
|
||||
eobj_weak_ref_add(&wref, obj);
|
||||
eobj_do(obj, eobj_wref_add(&wref));
|
||||
|
||||
eobj_ref(obj);
|
||||
fail_if(!wref);
|
||||
|
@ -90,12 +90,12 @@ START_TEST(eobj_weak_reference)
|
|||
eobj_unref(obj);
|
||||
fail_if(wref);
|
||||
|
||||
eobj_weak_ref_del(&wref);
|
||||
eobj_do(obj, eobj_wref_del(&wref));
|
||||
|
||||
obj = eobj_add(SIMPLE_CLASS, NULL);
|
||||
|
||||
eobj_weak_ref_add(&wref, obj);
|
||||
eobj_weak_ref_del(&wref);
|
||||
eobj_do(obj, eobj_wref_add(&wref));
|
||||
eobj_do(obj, eobj_wref_del(&wref));
|
||||
|
||||
eobj_unref(obj);
|
||||
|
||||
|
@ -283,9 +283,9 @@ START_TEST(eobj_magic_checks)
|
|||
fail_if(0 != eobj_ref_get((Eobj *) buf));
|
||||
|
||||
Eobj *wref = NULL;
|
||||
eobj_weak_ref_add(&wref, (Eobj *) buf);
|
||||
eobj_do((Eobj *) buf, eobj_wref_add(&wref));
|
||||
fail_if(wref);
|
||||
eobj_weak_ref_del(&wref);
|
||||
eobj_do(obj, eobj_wref_del(&wref));
|
||||
|
||||
eobj_del((Eobj *) buf);
|
||||
|
||||
|
|
Loading…
Reference in New Issue