> On Aug. 12, 2015, 3:20 p.m., Alan Conway wrote:
> > I want to clarify my thoughts for discussion, I'm working on putting this
> > into code.
> >
> > DESIGN PRINCIPLES:
> >
> > 1. C++ is not python. In C++ it is normal to provide "raw" alloc/free style
> > pairs, esp. when wrapping C. Automation of memory management in C++ is done
> > by a "smart pointer" layer (e.g. shared_ptr, unique_ptr) that is *separate*
> > from the underlying raw access.
> >
> > 2. Proton refcounting should be considered an internal implementation
> > detail of proton, NOT a feature that we use in the C++ binding. If need to
> > refcount in the binding we should maintain our own refcounts to references
> > *from the binding*, not rely on pn refcounts.
> >
> > 3. I suggest something like this: for pn_foo we have
> > a. foo : public wrapper<pn_foo> {} behaves like a plain pn_foo* but has
> > convenience C++ member functions and "free()" member calling appropriate
> > pn_foo_free()
> > b. unique<foo> : behaves like foo but calls foo.free() in dtor
> > c. shared<foo> : behaves like foo but maintains a refcount (like
> > shared_ptr) and calls foo.free() on last ref.
> >
> > 4. Objects belonging to the binding itself that are not wrapper<pn_foo>
> > should have normal new/delete semantics, and be manageable by
> > std::shared_ptr, std::unique_ptr etc.
> >
> > Some justification for 2: Consider this from the public proton API doc for
> > pn_link_target:
> >
> > * The pointer returned by this operation is valid until the link
> > * object is freed.
> >
> > Note the text specificaly says the pointer valid *until the link is freed*.
> > It does *not* say you can incref the pointer to keep it around longer. It
> > so happens that right now that actually works but IMO that is an
> > implementation detail we should not rely on. In a future, simpler
> > implementation of proton as a more C-like library that is not so heavily
> > influenced by python it might NOT work. The python bindings rely on proton
> > refcounts because they were specifically designed to support python, I
> > don't think languages like C++ or Go should rely on them (and IMO this
> > detail of python and ruby-like languages should not have been pushed into
> > the C library, but should have been dealt with in those bindings) Go and
> > C++ which have their own interface with C should treat proton as a simple C
> > library.
> >
> > I suspect that simple 3a + 3b will cover most cases, I'm not sure we even
> > need 3c but it isn't that hard to do.
> >
> > ASIDE: We could do some really freaky C++ magic and make wrapper<pn_foo>
> > look exactly like a real C++ object with a real pointer (imaginary C++
> > objects occupying the same memory location as the pn_foo_*, casting their
> > `this` pointers with overloaded op delete and all that fun stuff) but I
> > think that would be, um, silly.
Here's some code to show what I mean, I created a new review from tip of
cjansen-cpp-client as otherwise the diffs would quite confusing.
https://reviews.apache.org/r/37408/
- Alan
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/37217/#review95090
-----------------------------------------------------------
On Aug. 7, 2015, 1:46 p.m., Cliff Jansen wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/37217/
> -----------------------------------------------------------
>
> (Updated Aug. 7, 2015, 1:46 p.m.)
>
>
> Review request for qpid, Alan Conway and Andrew Stitcher.
>
>
> Bugs: PROTON-865
> https://issues.apache.org/jira/browse/PROTON-865
>
>
> Repository: qpid-proton-git
>
>
> Description
> -------
>
> This is a mini refactor of a single class to see if the chosen direction for
> generally removing handle<foo> is sane.
>
>
> I chose the connection class to try based on medium complexity and
> interaction with other moving parts (not visible to the user, the
> connector/override and life cycle issues).
>
> The connection is now non copyable.
>
> If the connection "self-created" (i.e. an inbound connection from a listener,
> arriving via a reactor event, or implicit connection from
> container.create_receiver), it is not "owned", and its life ends when the
> pn_connection_t dies (dies for good, i.e. when it releases its attachment
> records).
>
> If the user creates the connection explicitly, it is "owned" and destructs as
> normal. It is unclear if the Python behavior should be preserved, where the
> connection lives on un-owned, or destruction means "all gone" with tear down
> of the transport and connector. I chose the latter as perhaps least surprise
> for the user.
>
> The Proton C++ code can use either model internally to taste.
>
> Perhaps the connection object should have a pin/unpin or incref/decref
> ability so that the user can hang onto it past the event delivery. As a
> hack, they can always do pn_incref(connection.pn_connection()) and decref it
> when done.
>
> It is not clear to me that the counted class will ever be used separately
> from the context<foo> class, so they might get rolled together in the future.
> The memory management is accomplished by a special proton metaclass that is
> refcounted, but neither allocates nor frees memory.
>
> connection::getZZZcontainer() is an unintended artifact of the refactor. I'm
> not sure why gcc is fussing over the original signature, but I don't wish to
> target its resolution in this review.
>
>
> Diffs
> -----
>
> examples/cpp/helloworld.cpp 34e5076
> examples/cpp/server.cpp 78b78d3
> proton-c/bindings/cpp/CMakeLists.txt d1b1ebc
> proton-c/bindings/cpp/include/proton/connection.hpp af3c585
> proton-c/bindings/cpp/include/proton/container.hpp a0ca59a
> proton-c/bindings/cpp/include/proton/context.hpp PRE-CREATION
> proton-c/bindings/cpp/include/proton/counted.hpp PRE-CREATION
> proton-c/bindings/cpp/src/blocking_connection.cpp c0c1477
> proton-c/bindings/cpp/src/blocking_connection_impl.hpp 11ff4fd
> proton-c/bindings/cpp/src/blocking_connection_impl.cpp 0e78541
> proton-c/bindings/cpp/src/connection.cpp 2b335a4
> proton-c/bindings/cpp/src/connection_impl.hpp 6450ef5
> proton-c/bindings/cpp/src/connection_impl.cpp e2f4608
> proton-c/bindings/cpp/src/connector.hpp ad373a9
> proton-c/bindings/cpp/src/connector.cpp 559a7fd
> proton-c/bindings/cpp/src/container.cpp a424c0b
> proton-c/bindings/cpp/src/container_impl.hpp 1ce27ee
> proton-c/bindings/cpp/src/container_impl.cpp e328251
> proton-c/bindings/cpp/src/context.cpp PRE-CREATION
> proton-c/bindings/cpp/src/contexts.cpp 98c502b
> proton-c/bindings/cpp/src/counted.cpp PRE-CREATION
> proton-c/bindings/cpp/src/link.cpp 2cef0a2
> proton-c/bindings/cpp/src/proton_event.cpp 46b43ee
> proton-c/bindings/cpp/src/session.cpp 5742f13
>
> Diff: https://reviews.apache.org/r/37217/diff/
>
>
> Testing
> -------
>
> passes ctest on rhel7
>
>
> Thanks,
>
> Cliff Jansen
>
>