> On Aug. 7, 2015, 2:54 p.m., Alan Conway wrote:
> > I would like to try something simpler (sorry!)
> > 
> > There are 2 things I'd like to separate:
> > 
> > 1. Clean, simple, no-value-add access to proton types.
> > 2. Separate convenience classes to make proton easier to use.
> > 
> > For 1. the existing proton_handle<> template is perfect. I'd rename it 
> > proton_ptr<> to clarify it has simple pointer semantics. The proton_ptr 
> > subclasses just provide C++ method syntax for C calls and do some argument 
> > wrapping for strings, wrapping pointers as proton_ptr<> etc. This is what 
> > we already do for most types. We do no extra memory management at this 
> > layer, we just document the proton rules: pointers are valid inside event 
> > handlers, outside they are valid until the relevant _close events 
> > (including close events for containing objects) - if you break the rules, 
> > core dump. If you open()/create() it yourself, you must call close() when 
> > you are done or leak. Stick to simple C-style rules, IMO we should NOT 
> > expose proton's refcounting unless someone threatens to gouge our eyes out. 
> > 
> > For 2. e.g. proton::container: we can do what we like - a handle is not be 
> > unreasonable here if we can't make it simpler than that. 
> > 
> > My concern with proton::connection is it mixes the two. I would prefer a 
> > proton::connection that is nothing but a proton_ptr<pn_connection_t>, 
> > looking at connection_impl.hpp it isn't much more than that - I think we 
> > could probably strip the rest away, maybe just by adding a container* as a 
> > context or whatever it is called on the pn_connection_t. 
> > 
> > We do any memory management magic needed in the value-add layer, e.g. 
> > proton::container can have handlers to track connection lifecycles and 
> > ensure we don't delete the container while there are still connections 
> > referencing it. We can do this because we have access to all the events 
> > etc. 
> > 
> > Does this sound feasible? My main point here is to have a clean and 
> > complete proton layer with standard C-style "follow the rules or core 
> > dump/leak", and build ease-of-use and memory safety on top of that. If we 
> > mix them we will go insane. Proton's refcounting should be considered an 
> > implementation detail of the proton lib, not something we try to pull up 
> > into C++. It works for python because it was designed for python, C++ is 
> > not the same animal.
> > 
> > This is what I did in Go and it works pretty well. My experience there is 
> > that if you want something like goroutine-safe access to proton, you really 
> > have to build it in terms of your lanugage concurrency rules. Working from 
> > simple pointer semantics and adding your own event handlers to manage 
> > lifecycle works fine. We could conceivably do a pthreads version of the go 
> > messaging API someday but not today :)

I think proton::message is also an exception to the above, there's no useful 
wrapping of pn_message_t, so this is an ease-of-use class. We could debate 
whether it should have handle or value semantics but a hidden implementation is 
a good thing either way.


- Alan


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/37217/#review94542
-----------------------------------------------------------


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
> 
>

Reply via email to