diff --git a/legacy/eobj/lib/Eobj.h b/legacy/eobj/lib/Eobj.h index 887964eac6..662d686f22 100644 --- a/legacy/eobj/lib/Eobj.h +++ b/legacy/eobj/lib/Eobj.h @@ -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 diff --git a/legacy/eobj/lib/eobj.c b/legacy/eobj/lib/eobj.c index b271627ee6..1222b6d383 100644 --- a/legacy/eobj/lib/eobj.c +++ b/legacy/eobj/lib/eobj.c @@ -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) { diff --git a/legacy/eobj/lib/eobj_base_class.c b/legacy/eobj/lib/eobj_base_class.c index 22c1dbf384..47331e8f02 100644 --- a/legacy/eobj/lib/eobj_base_class.c +++ b/legacy/eobj/lib/eobj_base_class.c @@ -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 }; diff --git a/legacy/eobj/tests/eobj_test_general.c b/legacy/eobj/tests/eobj_test_general.c index c1e5c278b4..790f3f4fd4 100644 --- a/legacy/eobj/tests/eobj_test_general.c +++ b/legacy/eobj/tests/eobj_test_general.c @@ -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);