> On March 31, 2015, 5:52 p.m., rmudgett wrote:
> > /trunk/main/astobj2.c, line 798
> > <https://reviewboard.asterisk.org/r/4108/diff/5/?file=71780#file71780line798>
> >
> >     I think you need to have a weakproxy destructor callback that performs 
> > a sanity check on the proxy object to ensure that it is not still linked 
> > with a real object.  
> >     
> >     Or even better, make the ao2_ref code do this check when it is about to 
> > destroy a weakproxy object.  This check can also destroy anything in the 
> > notify list for the case if the real object was not set but subscribers 
> > were.

Once linked to a real object the weakproxy cannot be destroyed until after no 
references to the real object exist.  Remember that until the real object is 
destroyed it holds a reference to the weakproxy.

As for subscriptions I will have to look into this more, but my intention for 
subscriptions is a way to request notification as soon as the weakproxy points 
to NULL.  So in the case of adding a subscription when no real object is 
linked, I think we should run the callback immediately and not add it to the 
subscription list.


> On March 31, 2015, 5:52 p.m., rmudgett wrote:
> > /trunk/main/astobj2.c, lines 450-451
> > <https://reviewboard.asterisk.org/r/4108/diff/5/?file=71780#file71780line450>
> >
> >     Isn't the shell game you are playing with the real object's ref count 
> > going to mess up the DEBUG_REF output?
> >     
> >     How about this code:
> >     Code assumes that weakproxy ref wasn't bumped when set above.
> >     if weakproxy
> >        if current_value == 1
> >           unlink real and weak
> >        unlock weakproxy
> >        if current_value == 1
> >           run weakproxy callbacks (locking between each callback or locking 
> > to run all)
> >           unref weakproxy
> >           unref real

Lets use realobj to represent the variable in the callers scope (non-ao2 code), 
user_data is the variable in internal_ao2_ref.  This shell game results in 
REF_DEBUG logs showing the 2nd to last reference being released by 
ao2_ref(user_data, -1) a couple lines below your finding, just prior to the 
user releasing the last reference.  REF_DEBUG is produced after 
internal_ao2_ref completes, so it's impossible for the unref's in this block to 
be logged after ao2_ref(realobj, -1).  So without this REF_DEBUG would say that 
the object was destroyed due to ao2_ref(user_data, -1) before the 2nd to last 
reference was released.

This REF_DEBUG output was verified using the provided test.


- Corey


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/4108/#review14995
-----------------------------------------------------------


On March 4, 2015, 4:43 p.m., Corey Farrell wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/4108/
> -----------------------------------------------------------
> 
> (Updated March 4, 2015, 4:43 p.m.)
> 
> 
> Review request for Asterisk Developers, George Joseph and rmudgett.
> 
> 
> Repository: Asterisk
> 
> 
> Description
> -------
> 
> This implements "weak" references.  The weakproxy object is a real ao2 with 
> normal reference counting of its own.  When a weakproxy is pointed to a 
> normal object they hold references to each other.  The normal object is 
> automatically freed when a single reference remains (the weakproxy).  The 
> weakproxy also supports subscriptions that will notify callbacks when the 
> normal object is about to be destroyed.
> 
> 
> Diffs
> -----
> 
>   /trunk/tests/test_astobj2_weaken.c PRE-CREATION 
>   /trunk/main/astobj2.c 432445 
>   /trunk/include/asterisk/astobj2.h 432445 
> 
> Diff: https://reviewboard.asterisk.org/r/4108/diff/
> 
> 
> Testing
> -------
> 
> Ran the included test with REF_DEBUG enabled under valgrind.  No reference 
> leaks or improper memory access.  Though this does not test for races, I 
> don't know of an automated way to do that.
> 
> 
> Thanks,
> 
> Corey Farrell
> 
>

-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Reply via email to