diff --git a/legacy/eobj/lib/Eobj.h b/legacy/eobj/lib/Eobj.h index b6a40a8707..d8a508cb0d 100644 --- a/legacy/eobj/lib/Eobj.h +++ b/legacy/eobj/lib/Eobj.h @@ -534,45 +534,18 @@ EAPI void eobj_del(Eobj *obj); * @{ */ -/** - * @struct _Eobj_Weak_Ref - * This is exposed for performance, please use eobj_weak_ref_get() when you - * actually want to get the refed object. - */ -struct _Eobj_Weak_Ref -{ - Eobj *obj; /**< The object being referenced. */ -}; - -/** - * @typedef Eobj_Weak_Ref - * Weak reference type for Eobj. - */ -typedef struct _Eobj_Weak_Ref Eobj_Weak_Ref; - /** * @brief Create a new weak reference to obj. * @param obj The object being referenced. - * @return A new weak reference. + * @param wref The pointer to use for the weak ref. */ -EAPI Eobj_Weak_Ref *eobj_weak_ref_new(const Eobj *obj); +EAPI void eobj_weak_ref_add(const Eobj *obj, Eobj **wref); /** * @brief Free the weak reference passed. * @param wref the weak reference to free. */ -EAPI void eobj_weak_ref_free(Eobj_Weak_Ref *wref); - -/** - * @brief Get the referenced object from the weak reference. - * @param wref the weak reference to get the object from. - * @return The object referenced by wref. - */ -static inline Eobj * -eobj_weak_ref_get(const Eobj_Weak_Ref *wref) -{ - return wref->obj; -} +EAPI void eobj_weak_ref_del(Eobj **wref); /** * @} diff --git a/legacy/eobj/lib/eobj.c b/legacy/eobj/lib/eobj.c index aef1ebf3d5..f60824e47a 100644 --- a/legacy/eobj/lib/eobj.c +++ b/legacy/eobj/lib/eobj.c @@ -1083,35 +1083,30 @@ eobj_ref_get(const Eobj *obj) 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_Weak_Ref *wref = data; - wref->obj = NULL; + Eobj **wref = data; + *wref = NULL; return EOBJ_CALLBACK_CONTINUE; } -EAPI Eobj_Weak_Ref * -eobj_weak_ref_new(const Eobj *_obj) +EAPI void +eobj_weak_ref_add(const Eobj *_obj, Eobj **wref) { Eobj *obj = (Eobj *) _obj; - Eobj_Weak_Ref *wref = calloc(1, sizeof(*wref)); + EOBJ_MAGIC_RETURN(obj, EOBJ_EINA_MAGIC); - EOBJ_MAGIC_RETURN_VAL(obj, EOBJ_EINA_MAGIC, wref); - - wref->obj = obj; + *wref = obj; eobj_event_callback_add(obj, EOBJ_EV_DEL, _eobj_weak_ref_cb, wref); - - return wref; } EAPI void -eobj_weak_ref_free(Eobj_Weak_Ref *wref) +eobj_weak_ref_del(Eobj **wref) { - if (wref->obj) + if (*wref) { - eobj_event_callback_del_full(wref->obj, EOBJ_EV_DEL, _eobj_weak_ref_cb, + eobj_event_callback_del_full(*wref, EOBJ_EV_DEL, _eobj_weak_ref_cb, wref); } - free(wref); } /* EOF Weak reference. */ diff --git a/legacy/eobj/tests/eobj_test_general.c b/legacy/eobj/tests/eobj_test_general.c index b425a7334e..7b1b0f3f79 100644 --- a/legacy/eobj/tests/eobj_test_general.c +++ b/legacy/eobj/tests/eobj_test_general.c @@ -69,32 +69,33 @@ START_TEST(eobj_weak_reference) eobj_init(); Eobj *obj = eobj_add(SIMPLE_CLASS, NULL); - Eobj_Weak_Ref *wref = eobj_weak_ref_new(obj); - fail_if(!eobj_weak_ref_get(wref)); + Eobj *wref; + eobj_weak_ref_add(obj, &wref); + fail_if(!wref); eobj_unref(obj); - fail_if(eobj_weak_ref_get(wref)); + fail_if(wref); - eobj_weak_ref_free(wref); + eobj_weak_ref_del(&wref); obj = eobj_add(SIMPLE_CLASS, NULL); - wref = eobj_weak_ref_new(obj); + eobj_weak_ref_add(obj, &wref); eobj_ref(obj); - fail_if(!eobj_weak_ref_get(wref)); + fail_if(!wref); eobj_del(obj); - fail_if(eobj_weak_ref_get(wref)); + fail_if(wref); eobj_unref(obj); - fail_if(eobj_weak_ref_get(wref)); + fail_if(wref); - eobj_weak_ref_free(wref); + eobj_weak_ref_del(&wref); obj = eobj_add(SIMPLE_CLASS, NULL); - wref = eobj_weak_ref_new(obj); - eobj_weak_ref_free(wref); + eobj_weak_ref_add(obj, &wref); + eobj_weak_ref_del(&wref); eobj_unref(obj); @@ -275,9 +276,10 @@ START_TEST(eobj_magic_checks) fail_if(0 != eobj_ref_get((Eobj *) buf)); - Eobj_Weak_Ref *wref = eobj_weak_ref_new((Eobj *) buf); - fail_if(eobj_weak_ref_get(wref)); - eobj_weak_ref_free(wref); + Eobj *wref = NULL; + eobj_weak_ref_add((Eobj *) buf, &wref); + fail_if(wref); + eobj_weak_ref_del(&wref); eobj_del((Eobj *) buf);