Boost logo

Boost Users :

Subject: Re: [Boost-users] Mixing signals2 and asio mechanism failing
From: Frank Mori Hess (fmh6jj_at_[hidden])
Date: 2013-10-20 10:51:49


On Sun, Oct 20, 2013 at 3:37 AM, ustulation <ustulation_at_[hidden]> wrote:

> class A
> {
> /* has signals2::signal(s) for callbacks, fired when completion-handler of
> various async operations are invoked (eg., async_read_until etc) */
> };
>
> class B
> {
> void registerListenersWith_A()
> {
> /* has member-function listeners submitted to signals of class A
> eg., auto
> self = shared_from_this();
> shared_ptr_A->someSig_A.connect([self]{self->mem_func_B();}); */
> }
> void disconnectListenersWith_A()
> {
> /* disconnect all boost::signals2::connection(s) made above */
> }
> };
>
> auto shared_ptr_A = std::make_shared< A >();
> {
> auto shared_ptr_B = std::make_shared< B >();
> give shared_ptr_B a copy of shared_ptr_A for use above.
> shared_ptr_B->registerListenersWith_A();
> //....some operations here.....
> shared_ptr_B->disconnectListenersWith_A();
> } //i want pointer managed by shared_ptr_B to be destroyed here in a
> thread-safe manner (ie., no pending calls remain from A to B etc.
>
>
I'd think about using weak_ptr to break your cyclic shared_ptr object
ownership between class A and B. Also, you can use the track() method on
slots to auto-disconnect the member function of class B when it's last
owning shared_ptr expires, rather than binding a shared_ptr into the slot.
 track() will also prevent the class B object from being destroyed
mid-invocation by creating a temporary shared_ptr.

That said, as long as you manually call disconnect at some point, the
disconnected slots in the signal will eventually be destroyed during
cleanup, either in a later signal::connect call, a later signal invocation,
or on signal destruction.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net