You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2015/12/04 18:00:37 UTC

qpid-proton git commit: PROTON-1068: c++ remove counted_ptr and context types from public API

Repository: qpid-proton
Updated Branches:
  refs/heads/cpp-memory-cleanup [created] 5045ec032


PROTON-1068: c++ remove counted_ptr and context types from public API

- got rid of proton::counted base class
- remove mention of internal context types and functions from public headers.
- c++ rename data::op==, = and < to avoid clashes with object<> ops.
- replace complex exteranl counted_ptr with simple, internal-only pn_ptr
- simpler pn_class for C++ contexts, holds C++ value without an extra allocation.
- removed operator bool, made op == and < operators friends
- removed owned_object<>: equivalent to "take_ownership" constructor and move operator.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/5045ec03
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/5045ec03
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/5045ec03

Branch: refs/heads/cpp-memory-cleanup
Commit: 5045ec0320441089fe61d4b338d3b89da77da45a
Parents: 8501509
Author: Alan Conway <ac...@redhat.com>
Authored: Fri Nov 27 12:43:49 2015 -0500
Committer: Alan Conway <ac...@redhat.com>
Committed: Fri Dec 4 11:43:14 2015 -0500

----------------------------------------------------------------------
 proton-c/bindings/cpp/CMakeLists.txt            |   1 -
 .../cpp/include/proton/blocking_link.hpp        |   1 -
 .../bindings/cpp/include/proton/connection.hpp  |  12 +-
 .../bindings/cpp/include/proton/counted.hpp     |  48 --------
 .../bindings/cpp/include/proton/counted_ptr.hpp | 117 -------------------
 proton-c/bindings/cpp/include/proton/data.hpp   |  17 +--
 .../bindings/cpp/include/proton/handler.hpp     |   3 +-
 proton-c/bindings/cpp/include/proton/object.hpp | 105 ++++++-----------
 .../bindings/cpp/include/proton/reactor.hpp     |   7 +-
 proton-c/bindings/cpp/include/proton/value.hpp  |   4 +-
 proton-c/bindings/cpp/src/connection.cpp        |   9 +-
 .../bindings/cpp/src/connection_options.cpp     |   3 +-
 proton-c/bindings/cpp/src/container_impl.cpp    |  41 +++----
 proton-c/bindings/cpp/src/container_impl.hpp    |   2 +-
 proton-c/bindings/cpp/src/contexts.cpp          |  82 +++++--------
 proton-c/bindings/cpp/src/contexts.hpp          |  51 +++++---
 proton-c/bindings/cpp/src/counted_ptr.cpp       |  32 -----
 proton-c/bindings/cpp/src/data.cpp              |   8 +-
 proton-c/bindings/cpp/src/decoder.cpp           |   2 +-
 proton-c/bindings/cpp/src/encoder.cpp           |   2 +-
 proton-c/bindings/cpp/src/link.cpp              |   4 +-
 proton-c/bindings/cpp/src/message.cpp           |   8 +-
 proton-c/bindings/cpp/src/messaging_adapter.cpp |   2 +-
 proton-c/bindings/cpp/src/object.cpp            |   8 +-
 proton-c/bindings/cpp/src/reactor.cpp           |   9 +-
 proton-c/bindings/cpp/src/session.cpp           |   2 +-
 proton-c/bindings/cpp/src/value.cpp             |   8 +-
 27 files changed, 170 insertions(+), 418 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/CMakeLists.txt b/proton-c/bindings/cpp/CMakeLists.txt
index bcdc61b..6352f66 100644
--- a/proton-c/bindings/cpp/CMakeLists.txt
+++ b/proton-c/bindings/cpp/CMakeLists.txt
@@ -37,7 +37,6 @@ set(qpid-proton-cpp-source
   src/connector.cpp
   src/container.cpp
   src/container_impl.cpp
-  src/counted_ptr.cpp
   src/contexts.cpp
   src/data.cpp
   src/decoder.cpp

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/blocking_link.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/blocking_link.hpp b/proton-c/bindings/cpp/include/proton/blocking_link.hpp
index 2b0a089..ba584af 100644
--- a/proton-c/bindings/cpp/include/proton/blocking_link.hpp
+++ b/proton-c/bindings/cpp/include/proton/blocking_link.hpp
@@ -22,7 +22,6 @@
  *
  */
 #include "proton/export.hpp"
-#include "proton/counted_ptr.hpp"
 #include "proton/duration.hpp"
 #include "proton/link.hpp"
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/connection.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/connection.hpp b/proton-c/bindings/cpp/include/proton/connection.hpp
index 338e542..7a9cf74 100644
--- a/proton-c/bindings/cpp/include/proton/connection.hpp
+++ b/proton-c/bindings/cpp/include/proton/connection.hpp
@@ -34,7 +34,6 @@ struct pn_connection_t;
 
 namespace proton {
 
-struct connection_context;
 class handler;
 class engine;
 
@@ -44,9 +43,6 @@ class connection : public object<pn_connection_t>, endpoint
   public:
     connection(pn_connection_t* c=0) : object<pn_connection_t>(c) {}
 
-    /// Get the connection context object from the connection
-    PN_CPP_EXTERN connection_context& context() const;
-
     /// Get the event_loop, can be a container or an engine.
     PN_CPP_EXTERN class event_loop &event_loop() const;
 
@@ -111,10 +107,10 @@ class connection : public object<pn_connection_t>, endpoint
     PN_CPP_EXTERN void user(const std::string &);
     PN_CPP_EXTERN void password(const std::string &);
 
-    
-    friend class connection_options;
-    friend class connector;
-    friend class transport;
+  friend class connection_context;
+  friend class connection_options;
+  friend class connector;
+  friend class transport;
 };
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/counted.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/counted.hpp b/proton-c/bindings/cpp/include/proton/counted.hpp
deleted file mode 100644
index 2195d93..0000000
--- a/proton-c/bindings/cpp/include/proton/counted.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef COUNTED_HPP
-#define COUNTED_HPP
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-namespace proton {
-
-/// Base class for reference counted objects other than proton struct facade types.
-class counted {
-  protected:
-    counted() : refcount_(0) {}
-    virtual ~counted() {}
-
-  private:
-    counted(const counted&);
-    counted& operator=(const counted&);
-    mutable int refcount_;
-
-    // TODO aconway 2015-08-27: atomic operations.
-    void incref() const { ++refcount_; }
-    void decref() const { if (--refcount_ == 0) delete this; }
-
-  friend void incref(const counted*);
-  friend void decref(const counted*);
-  template <class T> friend class counted_ptr;
-};
-
-inline void incref(const counted* p) { if (p) p->incref(); }
-inline void decref(const counted* p) { if (p) p->decref(); }
-
-}
-#endif // COUNTED_HPP

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/counted_ptr.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/counted_ptr.hpp b/proton-c/bindings/cpp/include/proton/counted_ptr.hpp
deleted file mode 100644
index 0865e4a..0000000
--- a/proton-c/bindings/cpp/include/proton/counted_ptr.hpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#ifndef COUNTED_PTR_HPP
-#define COUNTED_PTR_HPP
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "proton/config.hpp"
-#include "proton/comparable.hpp"
-
-#if PN_HAS_BOOST
-#include <boost/shared_ptr.hpp>
-#include <boost/intrusive_ptr.hpp>
-#endif
-
-#include <memory>
-
-namespace proton {
-
-///@cond INTERNAL
-
-// Default refcounting uses pn_incref, pn_decref. Other types must define
-// their own incref/decref overloads.
-PN_CPP_EXTERN void incref(const void*);
-PN_CPP_EXTERN void decref(const void*);
-
-///@endcond
-
-/**
- * Smart pointer for reference counted objects derived from `proton::counted`
- * or `proton::pn_counted`
- */
-template <class T> class counted_ptr : public proton::comparable<counted_ptr<T> > {
-  public:
-    typedef T element_type;
-
-    explicit counted_ptr(T *p = 0, bool add_ref = true) : ptr_(p) {
-        if (add_ref) incref(ptr_);
-    }
-
-    counted_ptr(const counted_ptr<T>& p) : ptr_(p.ptr_) { incref(ptr_); }
-
-    // TODO aconway 2015-08-20: C++11 move constructor
-
-    ~counted_ptr() { decref(ptr_); }
-
-    void swap(counted_ptr& x) { std::swap(ptr_, x.ptr_); }
-
-    counted_ptr<T>& operator=(const counted_ptr<T>& p) {
-        counted_ptr<T>(p.get()).swap(*this);
-        return *this;
-    }
-
-    void reset(T* p=0, bool add_ref = true) {
-        counted_ptr<T>(p, add_ref).swap(*this);
-    }
-
-    T* release() {
-        T* ret = ptr_;
-        ptr_ = 0;
-        return ret;
-    }
-
-    T* get() const { return ptr_; }
-    T* operator->() const { return ptr_; }
-    T& operator*() const { return *ptr_; }
-    operator bool() const { return !!ptr_; }
-    bool operator!() const { return !ptr_; }
-
-    template <class U> operator counted_ptr<U>() const { return counted_ptr<U>(get()); }
-    template <class U> bool operator==(const counted_ptr<U>& x) { return get() == x.get(); }
-    template <class U> bool operator<(const counted_ptr<U>& x) { return get() < x.get(); }
-
-#if PN_HAS_STD_PTR
-    // TODO aconway 2015-08-21: need weak pointer context for efficient shared_ptr
-    operator std::shared_ptr<T>() { return std::shared_ptr<T>(dup()); }
-    operator std::shared_ptr<const T>() const { return std::shared_ptr<const T>(dup()); }
-    operator std::unique_ptr<T>() { return std::unique_ptr<T>(dup()); }
-    operator std::unique_ptr<const T>() const { return std::unique_ptr<const T>(dup()); }
-#endif
-#if PN_HAS_BOOST
-    // TODO aconway 2015-08-21: need weak pointer context for efficient shared_ptr
-    operator boost::shared_ptr<T>() { return boost::shared_ptr<T>(dup()); }
-    operator boost::shared_ptr<const T>() const { return boost::shared_ptr<const T>(dup()); }
-    operator boost::intrusive_ptr<T>() { return boost::intrusive_ptr<T>(ptr_); }
-    operator boost::intrusive_ptr<const T>() const { return boost::intrusive_ptr<const T>(ptr_); }
-#endif
-
-  private:
-    T* dup() { incref(ptr_); return ptr_; }
-    const T* dup() const { incref(ptr_); return ptr_; }
-
-    T* ptr_;
-};
-
-#if PN_HAS_BOOST
-template <class T> inline void intrusive_ptr_add_ref(const T* p) { if (p) incref(p); }
-template <class T> inline void intrusive_ptr_release(const T* p) { if (p) decref(p); }
-#endif
-
-}
-
-#endif // COUNTED_PTR_HPP

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/data.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/data.hpp b/proton-c/bindings/cpp/include/proton/data.hpp
index e74b77b..c2ffd3c 100644
--- a/proton-c/bindings/cpp/include/proton/data.hpp
+++ b/proton-c/bindings/cpp/include/proton/data.hpp
@@ -40,15 +40,15 @@ class data;
 class data : public object<pn_data_t> {
   public:
     data(pn_data_t* d) : object<pn_data_t>(d) {}
-    data(owned_object<pn_data_t> d) : object<pn_data_t>(d) {}
 
-    PN_CPP_EXTERN static owned_object<pn_data_t> create();
+    data& operator=(const data&);      // FIXME aconway 2015-12-01:
 
-    PN_CPP_EXTERN data& operator=(const data&);
+    PN_CPP_EXTERN static data create();
 
-    template<class T> data& operator=(const T &t) {
-        clear(); encoder() << t; return *this;
-    }
+    // Copy the contents of another data object t this one.
+    PN_CPP_EXTERN data& copy(const data&);
+
+    template<class T> data& copy(T &t) { clear(); encoder() << t; return *this; }
 
     /** Clear the data. */
     PN_CPP_EXTERN void clear();
@@ -86,13 +86,14 @@ class data : public object<pn_data_t> {
 
     template<class T> T get() const { T t; get(t); return t; }
 
-    PN_CPP_EXTERN bool operator==(const data& x) const;
-    PN_CPP_EXTERN bool operator<(const data& x) const;
+    PN_CPP_EXTERN bool equal(const data& x) const;
+    PN_CPP_EXTERN bool less(const data& x) const;
 
     /** Human readable representation of data. */
   friend PN_CPP_EXTERN std::ostream& operator<<(std::ostream&, const data&);
   friend class value;
   private:
+    data(pn_ptr<pn_data_t> d) : object<pn_data_t>(d) {}
     class decoder decoder() const { return const_cast<data*>(this)->decoder(); }
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/handler.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/handler.hpp b/proton-c/bindings/cpp/include/proton/handler.hpp
index 70da48b..6680d70 100644
--- a/proton-c/bindings/cpp/include/proton/handler.hpp
+++ b/proton-c/bindings/cpp/include/proton/handler.hpp
@@ -22,7 +22,6 @@
  *
  */
 #include "proton/export.hpp"
-#include "proton/counted_ptr.hpp"
 #include "proton/event.hpp"
 #include "proton/event.h"
 #include "proton/reactor.h"
@@ -58,7 +57,7 @@ class handler : public std::vector<handler*> {
     PN_CPP_EXTERN virtual void add_child_handler(handler &h);
 
   private:
-    counted_ptr<pn_handler_t> pn_handler_;
+    pn_ptr<pn_handler_t> pn_handler_;
     friend class container_impl;
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/object.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/object.hpp b/proton-c/bindings/cpp/include/proton/object.hpp
index 118f40d..0da20ae 100644
--- a/proton-c/bindings/cpp/include/proton/object.hpp
+++ b/proton-c/bindings/cpp/include/proton/object.hpp
@@ -21,93 +21,64 @@
 
 #include "proton/config.hpp"
 #include "proton/export.hpp"
+#include "proton/comparable.hpp"
 
 #include <memory>
 
 namespace proton {
 
-/**
- * Base class for proton object types
- *
- * Automatically perform memory management for pn_object based types.
- *
- * Note that for the memory management to work correctly no class
- * inheriting from this should define any data members of its own.
- * 
- * This is ok because the entire purpose of this class is to provide
- * and manage the underlying pointer to the proton-c object.
- * 
- * So any class using this one needs to be merely a thin wrapping of
- * the proton-c object with no data members of it's own. Anything that internally
- * needs extra data members and a proton-c object must use an inheritor of
- * object<> as a data member - it must not inherit and add data members.
- * 
- */
-class object_base {
-  public:
-    object_base() : object_(0) {}
-    object_base(void* o) : object_(o) {}
-    object_base(const object_base& o) : object_(o.object_) { incref(); }
-
-    #ifdef PN_HAS_CPP11
-    object_base(object_base&& o) : object_base() { *this = o; }
-    #endif
+///@cond INTERNAL
+class pn_ptr_base {
+  protected:
+    static void incref(void* p);
+    static void decref(void* p);
+};
 
-    ~object_base() { decref(); };
+template <class T> class pn_ptr : public comparable<pn_ptr<T> >, private pn_ptr_base {
+  public:
+    pn_ptr() : ptr_(0) {}
+    pn_ptr(T* p) : ptr_(p) { incref(ptr_); }
+    pn_ptr(const pn_ptr& o) : ptr_(o.ptr_) { incref(ptr_); }
 
-    object_base& operator=(object_base o)
-    { std::swap(object_, o.object_); return *this; }
+#ifdef PN_HAS_CPP11
+    pn_ptr(pn_ptr&& o) : ptr_(0) { std::swap(ptr_, o.ptr_); }
+#endif
 
-    bool operator!() const { return !object_; }
+    ~pn_ptr() { decref(ptr_); };
 
-  private:
-    PN_CPP_EXTERN void incref() const;
-    PN_CPP_EXTERN void decref() const;
+    static pn_ptr<T> take(T* p) { return pn_ptr<T>(p, true); }
 
-    void* object_;
+    pn_ptr& operator=(pn_ptr o) { std::swap(ptr_, o.ptr_); return *this; }
 
-  template <class T>
-  friend class object;
-  template <class T>
-  friend class owned_object;
-  friend bool operator==(const object_base&, const object_base&);
-};
+    T* get() const { return ptr_; }
+    bool operator!() const { return !ptr_; }
 
-template <class T>
-class owned_object : public object_base {
-  public:
-    owned_object(T* o) : object_base(o) {};
+  friend bool operator==(const pn_ptr& a, const pn_ptr& b) { return a.ptr_ == b.ptr_; }
+  friend bool operator<(const pn_ptr& a, const pn_ptr& b) { return a.ptr_ < b.ptr_; }
 
-  protected:
-    T* pn_object() const { return static_cast<T*>(object_); }
-
-  template <class U>
-  friend class object;
+  private:
+    pn_ptr(T* p, bool) : ptr_(p) {}
+    T *ptr_;
 };
+///@endcond INTERNAL
 
-template <class T>
-class object : public object_base {
+/**
+ * Base class for proton object types
+ */
+template <class T> class object : public comparable<object<T> > {
   public:
-    object(T* o, bool take_own=false) : object_base(o) { if (!take_own) incref(); };
-    object(owned_object<T> o) : object_base(o.object_) { o.object_=0; };
+    bool operator!() const { return !object_; }
 
-    object& operator=(owned_object<T> o)
-    { object_ = o.object_; o = 0; return *this; }
+  friend bool operator==(const object& a, const object& b) { return a.object_ == b.object_; }
+  friend bool operator<(const object& a, const object& b) { return a.object_ < b.object_; }
 
   protected:
-    static const bool take_ownership = true;
-    T* pn_object() const { return static_cast<T*>(object_); }
-};
-
-inline
-bool operator==(const object_base& o1, const object_base& o2) {
-    return o1.object_==o2.object_;
-}
+    object(pn_ptr<T> o) : object_(o) {}
+    T* pn_object() const { return object_.get(); }
 
-inline
-bool operator!=(const object_base& o1, const object_base& o2) {
-    return !(o1==o2);
-}
+  private:
+    pn_ptr<T> object_;
+};
 
 }
 #endif // OBJECT_HPP

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/reactor.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/reactor.hpp b/proton-c/bindings/cpp/include/proton/reactor.hpp
index fa7d633..7592a14 100644
--- a/proton-c/bindings/cpp/include/proton/reactor.hpp
+++ b/proton-c/bindings/cpp/include/proton/reactor.hpp
@@ -67,7 +67,7 @@ class reactor : public object<pn_reactor_t> {
 
     PN_CPP_EXTERN amqp_timestamp mark();
     PN_CPP_EXTERN amqp_timestamp now();
-    
+
     PN_CPP_EXTERN task schedule(int, pn_handler_t*);
 
     class connection connection(pn_handler_t*) const;
@@ -86,9 +86,8 @@ class reactor : public object<pn_reactor_t> {
     PN_CPP_EXTERN bool quiesced();
     PN_CPP_EXTERN void yield();
 
-    void container_context(container&);
-
-    friend class container_impl;
+  friend class container_impl;
+  friend class container_context;
 };
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/include/proton/value.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/value.hpp b/proton-c/bindings/cpp/include/proton/value.hpp
index 661de51..c33eea1 100644
--- a/proton-c/bindings/cpp/include/proton/value.hpp
+++ b/proton-c/bindings/cpp/include/proton/value.hpp
@@ -46,10 +46,10 @@ class value : public comparable<value> {
     PN_CPP_EXTERN value(const value& x);
     // TODO: Should enumerate specifically all the pointer types that can convert to value
     // to avoid accidental conversions to bool this will require enable_if<> or the like
-    template <class T> value(const T& x) : data_(data::create()) { data_ = x; }
+    template <class T> value(const T& x) : data_(data::create()) { data_.copy(x); }
 
     PN_CPP_EXTERN value& operator=(const value& x);
-    template <class T> value& operator=(const T& x) { data_ = x; return *this; }
+    template <class T> value& operator=(const T& x) { data_.copy(x); return *this; }
 
     PN_CPP_EXTERN void clear();
     PN_CPP_EXTERN bool empty() const;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/connection.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/connection.cpp b/proton-c/bindings/cpp/src/connection.cpp
index 508a013..41c56f6 100644
--- a/proton-c/bindings/cpp/src/connection.cpp
+++ b/proton-c/bindings/cpp/src/connection.cpp
@@ -38,14 +38,13 @@
 
 namespace proton {
 
-connection_context& connection::context() const { return connection_context::get(pn_object()); }
-
 transport connection::transport() const {
     return pn_connection_transport(pn_object());
 }
 
 void connection::open() {
-    connector *connector = dynamic_cast<class connector*>(context().handler.get());
+    connector *connector = dynamic_cast<class connector*>(
+        connection_context::get(pn_object()).handler.get());
     if (connector)
         connector->apply_options();
     // Inbound connections should already be configured.
@@ -74,7 +73,7 @@ void connection::container_id(const std::string& id) {
 }
 
 container& connection::container() const {
-    return container_context(pn_object_reactor(pn_object()));
+    return container_context::get(pn_object_reactor(pn_object()));
 }
 
 link_range connection::find_links(endpoint::state mask) const {
@@ -88,7 +87,7 @@ session_range connection::find_sessions(endpoint::state mask) const {
 session connection::open_session() { return pn_session(pn_object()); }
 
 session connection::default_session() {
-    struct connection_context& ctx = connection_context::get(pn_object());
+    connection_context& ctx = connection_context::get(pn_object());
     if (!ctx.default_session) {
         // Note we can't use a proton::session here because we don't want to own
         // a session reference. The connection owns the session, owning it here as well

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/connection_options.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/connection_options.cpp b/proton-c/bindings/cpp/src/connection_options.cpp
index 141ffc9..6b72c9c 100644
--- a/proton-c/bindings/cpp/src/connection_options.cpp
+++ b/proton-c/bindings/cpp/src/connection_options.cpp
@@ -62,7 +62,8 @@ class connection_options::impl {
     void apply(connection& c) {
         pn_connection_t *pnc = connection_options::pn_connection(c);
         pn_transport_t *pnt = pn_connection_transport(pnc);
-        connector *outbound = dynamic_cast<connector*>(c.context().handler.get());
+        connector *outbound = dynamic_cast<connector*>(
+            connection_context::get(c).handler.get());
         bool uninit = (c.state() & endpoint::LOCAL_UNINIT);
 
         // pnt is NULL between reconnect attempts.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/container_impl.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/container_impl.cpp b/proton-c/bindings/cpp/src/container_impl.cpp
index 7d64ebc..f83e0a6 100644
--- a/proton-c/bindings/cpp/src/container_impl.cpp
+++ b/proton-c/bindings/cpp/src/container_impl.cpp
@@ -81,7 +81,7 @@ struct handler_context {
 class override_handler : public handler
 {
   public:
-    counted_ptr<pn_handler_t> base_handler;
+    pn_ptr<pn_handler_t> base_handler;
     container_impl &container_impl_;
 
     override_handler(pn_handler_t *h, container_impl &c) : base_handler(h), container_impl_(c) {}
@@ -113,19 +113,17 @@ class override_handler : public handler
 
 } // namespace
 
-counted_ptr<pn_handler_t> container_impl::cpp_handler(handler *h)
-{
-    if (h->pn_handler_)
-        return h->pn_handler_;
-    counted_ptr<pn_handler_t> handler(
-        pn_handler_new(&handler_context::dispatch, sizeof(struct handler_context),
-                       &handler_context::cleanup),
-        false);
-    handler_context &hc = handler_context::get(handler.get());
-    hc.container_ = &container_;
-    hc.handler_ = h;
-    h->pn_handler_ = handler;
-    return handler;
+pn_ptr<pn_handler_t> container_impl::cpp_handler(handler *h) {
+    if (!h->pn_handler_) {
+        h->pn_handler_ = pn_ptr<pn_handler_t>::take(
+            pn_handler_new(&handler_context::dispatch,
+                           sizeof(struct handler_context),
+                           &handler_context::cleanup));
+        handler_context &hc = handler_context::get(h->pn_handler_.get());
+        hc.container_ = &container_;
+        hc.handler_ = h;
+    }
+    return h->pn_handler_;
 }
 
 container_impl::container_impl(container& c, handler *h, const std::string& id) :
@@ -133,16 +131,15 @@ container_impl::container_impl(container& c, handler *h, const std::string& id)
     link_id_(0)
 {
     if (id_.empty()) id_ = uuid().str();
-    reactor_.container_context(container_);
+    container_context::set(reactor_, container_);
 
     // Set our own global handler that "subclasses" the existing one
     pn_handler_t *global_handler = reactor_.pn_global_handler();
     override_handler_.reset(new override_handler(global_handler, *this));
-    counted_ptr<pn_handler_t> cpp_global_handler(cpp_handler(override_handler_.get()));
+    pn_ptr<pn_handler_t> cpp_global_handler(cpp_handler(override_handler_.get()));
     reactor_.pn_global_handler(cpp_global_handler.get());
     if (handler_) {
-        counted_ptr<pn_handler_t> pn_handler(cpp_handler(handler_));
-        reactor_.pn_handler(pn_handler.get());
+        reactor_.pn_handler(cpp_handler(handler_).get());
     }
 
 
@@ -159,11 +156,11 @@ connection container_impl::connect(const proton::url &url, const connection_opti
     opts.override(user_opts);
     handler *h = opts.handler();
 
-    counted_ptr<pn_handler_t> chandler = h ? cpp_handler(h) : counted_ptr<pn_handler_t>();
+    pn_ptr<pn_handler_t> chandler = h ? cpp_handler(h) : pn_ptr<pn_handler_t>();
     connection conn(reactor_.connection(chandler.get()));
     pn_unique_ptr<connector> ctor(new connector(conn, opts));
     ctor->address(url);  // TODO: url vector
-    connection_context& cc(conn.context());
+    connection_context& cc(connection_context::get(conn));
     cc.container_impl = this;
     cc.handler.reset(ctor.release());
     conn.open();
@@ -194,7 +191,7 @@ acceptor container_impl::listen(const proton::url& url) {
     opts.override(user_opts);
 #endif
     handler *h = opts.handler();
-    counted_ptr<pn_handler_t> chandler = h ? cpp_handler(h) : counted_ptr<pn_handler_t>();
+    pn_ptr<pn_handler_t> chandler = h ? cpp_handler(h) : pn_ptr<pn_handler_t>();
     pn_acceptor_t *acptr = pn_reactor_acceptor(reactor_.pn_object(), url.host().c_str(), url.port().c_str(), chandler.get());
     if (!acptr)
         throw error(MSG("accept fail: " <<
@@ -221,7 +218,7 @@ std::string container_impl::next_link_name() {
 }
 
 task container_impl::schedule(int delay, handler *h) {
-    counted_ptr<pn_handler_t> task_handler;
+    pn_ptr<pn_handler_t> task_handler;
     if (h)
         task_handler = cpp_handler(h);
     return reactor_.schedule(delay, task_handler.get());

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/container_impl.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/container_impl.hpp b/proton-c/bindings/cpp/src/container_impl.hpp
index d9401d0..4a89ab3 100644
--- a/proton-c/bindings/cpp/src/container_impl.hpp
+++ b/proton-c/bindings/cpp/src/container_impl.hpp
@@ -62,7 +62,7 @@ class container_impl
 
     void configure_server_connection(connection &c);
     task schedule(int delay, handler *h);
-    counted_ptr<pn_handler_t> cpp_handler(handler *h);
+    pn_ptr<pn_handler_t> cpp_handler(handler *h);
 
     std::string next_link_name();
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/contexts.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/contexts.cpp b/proton-c/bindings/cpp/src/contexts.cpp
index 4d17e54..0ea4262 100644
--- a/proton-c/bindings/cpp/src/contexts.cpp
+++ b/proton-c/bindings/cpp/src/contexts.cpp
@@ -30,87 +30,63 @@
 #include "proton/session.h"
 #include "proton/link.h"
 
+#include <typeinfo>
+
 namespace proton {
 
 namespace {
-
-// A proton class for counted c++ objects used as proton attachments
-extern pn_class_t* COUNTED_CONTEXT;
-#define CID_cpp_context CID_pn_void
-static const pn_class_t *cpp_context_reify(void *object) { return COUNTED_CONTEXT; }
-#define cpp_context_new NULL
-#define cpp_context_free NULL
+void cpp_context_finalize(void* v) { reinterpret_cast<context*>(v)->~context(); }
+#define CID_cpp_context CID_pn_object
+#define cpp_context_reify pn_object_reify
 #define cpp_context_initialize NULL
-void cpp_context_incref(void* p) { proton::incref(reinterpret_cast<counted*>(p)); }
-void cpp_context_decref(void* p) { proton::decref(reinterpret_cast<counted*>(p)); }
-// Always return 1 to prevent the class finalizer logic running after we are deleted.
-int cpp_context_refcount(void* p) { return 1; }
-#define cpp_context_finalize NULL
+#define cpp_context_finalize cpp_context_finalize
 #define cpp_context_hashcode NULL
 #define cpp_context_compare NULL
 #define cpp_context_inspect NULL
+pn_class_t cpp_context_class = PN_CLASS(cpp_context);
 
-pn_class_t COUNTED_CONTEXT_ = PN_METACLASS(cpp_context);
-pn_class_t *COUNTED_CONTEXT = &COUNTED_CONTEXT_;
+// Handles
+PN_HANDLE(CONNECTION_CONTEXT)
+PN_HANDLE(CONTAINER_CONTEXT)
 }
 
+context::~context() {}
+void *context::alloc(size_t n) { return pn_object_new(&cpp_context_class, n); }
+pn_class_t* context::pn_class() { return &cpp_context_class; }
 
-void set_context(pn_record_t* record, pn_handle_t handle, counted* value)
+void set_context(pn_record_t* record, pn_handle_t handle, const pn_class_t *clazz, void* value)
 {
-    pn_record_def(record, handle, COUNTED_CONTEXT);
+    pn_record_def(record, handle, clazz);
     pn_record_set(record, handle, value);
 }
 
-counted* get_context(pn_record_t* record, pn_handle_t handle) {
-    return reinterpret_cast<counted*>(pn_record_get(record, handle));
+template <class T>
+T* get_context(pn_record_t* record, pn_handle_t handle) {
+    return reinterpret_cast<T*>(pn_record_get(record, handle));
 }
 
-// Connection context
-
-PN_HANDLE(CONNECTION_CONTEXT)
-
-connection_context::connection_context() : default_session(), container_impl() {}
-connection_context::~connection_context() {}
 
-struct connection_context& connection_context::get(pn_connection_t* c) {
-    connection_context* ctx = reinterpret_cast<connection_context*>(
-        get_context(pn_connection_attachments(c), CONNECTION_CONTEXT));
+connection_context& connection_context::get(pn_connection_t* c) {
+    connection_context* ctx =
+        get_context<connection_context>(pn_connection_attachments(c), CONNECTION_CONTEXT);
     if (!ctx) {
-        ctx = new connection_context();
-        set_context(pn_connection_attachments(c), CONNECTION_CONTEXT, ctx);
+        ctx =  context::create<connection_context>();
+        set_context(pn_connection_attachments(c), CONNECTION_CONTEXT, context::pn_class(), ctx);
+        pn_decref(ctx);
     }
     return *ctx;
 }
 
-PN_HANDLE(CONTAINER_CONTEXT)
+connection_context& connection_context::get(const connection& c) { return get(c.pn_object()); }
 
-void container_context(pn_reactor_t *r, container& c) {
-    pn_record_t *record = pn_reactor_attachments(r);
-    pn_record_def(record, CONTAINER_CONTEXT, PN_VOID);
-    pn_record_set(record, CONTAINER_CONTEXT, &c);
+void container_context::set(const reactor& r, container& c) {
+    set_context(pn_reactor_attachments(r.pn_object()), CONTAINER_CONTEXT, PN_VOID, &c);
 }
 
-container &container_context(pn_reactor_t *pn_reactor) {
-    pn_record_t *record = pn_reactor_attachments(pn_reactor);
-    container *ctx = reinterpret_cast<container*>(pn_record_get(record, CONTAINER_CONTEXT));
+container &container_context::get(pn_reactor_t *pn_reactor) {
+    container *ctx = get_context<container>(pn_reactor_attachments(pn_reactor), CONTAINER_CONTEXT);
     if (!ctx) throw error(MSG("Reactor has no C++ container context"));
     return *ctx;
 }
 
-PN_HANDLE(EVENT_CONTEXT)
-
-void event_context(pn_event_t *pn_event, pn_message_t *m) {
-    pn_record_t *record = pn_event_attachments(pn_event);
-    pn_record_def(record, EVENT_CONTEXT, PN_OBJECT); // refcount it for life of the event
-    pn_record_set(record, EVENT_CONTEXT, m);
-}
-
-pn_message_t *event_context(pn_event_t *pn_event) {
-    if (!pn_event) return NULL;
-    pn_record_t *record = pn_event_attachments(pn_event);
-    pn_message_t *ctx = (pn_message_t *) pn_record_get(record, EVENT_CONTEXT);
-    return ctx;
-}
-
-
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/contexts.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/contexts.hpp b/proton-c/bindings/cpp/src/contexts.hpp
index a0e6cf6..c12d8bd 100644
--- a/proton-c/bindings/cpp/src/contexts.hpp
+++ b/proton-c/bindings/cpp/src/contexts.hpp
@@ -22,27 +22,45 @@
  *
  */
 
-#include "proton/counted.hpp"
 #include "proton/pn_unique_ptr.hpp"
-#include "proton/reactor.h"
-#include "proton/session.hpp"
+#include "proton/message.hpp"
+#include "proton/connection.hpp"
+#include "proton/container.hpp"
+#include "proton/handler.hpp"
 
-#include <proton/message.h>
+struct pn_session_t;
+struct pn_event_t;
+struct pn_record_t;
 
 namespace proton {
 
-class session;
 class handler;
 class container_impl;
 
-counted* get_context(pn_record_t*, pn_handle_t handle);
-void set_context(pn_record_t*, pn_handle_t, counted* value);
+// Base class for C++ classes that are used as proton contexts.
+// contexts are pn_objects managed by pn reference counts.
+class context {
+  public:
+    // Allocate a default-constructed T as a proton object. T must be a subclass of context.
+    template <class T> static T *create() { return new(alloc(sizeof(T))) T(); }
 
-struct connection_context : public counted {
-    static connection_context& get(pn_connection_t* c);
+    // Allocate a copy-constructed T as a proton object. T must be a subclass of context.
+    template <class T> static T *create(const T& x) { return new(alloc(sizeof(T))) T(x); }
 
-    connection_context();
-    ~connection_context();
+    virtual ~context();
+
+    static pn_class_t* pn_class();
+
+  private:
+    static void *alloc(size_t n);
+};
+
+class connection_context : public context {
+  public:
+    static connection_context& get(pn_connection_t*);
+    static connection_context& get(const connection&);
+
+    connection_context() : default_session(0), container_impl(0) {}
 
     pn_unique_ptr<class handler> handler;
     pn_session_t *default_session;   // Owned by connection
@@ -50,12 +68,13 @@ struct connection_context : public counted {
     message event_message;  // re-used by messaging_adapter for performance
 };
 
-class container;
-void container_context(pn_reactor_t *, container&);
-container& container_context(pn_reactor_t *);
+void container_context(const reactor&, container&);
 
-void event_context(pn_event_t *pn_event, pn_message_t *m);
-pn_message_t *event_context(pn_event_t *pn_event);
+class container_context {
+  public:
+    static void set(const reactor& r, container& c);
+    static container& get(pn_reactor_t*);
+};
 
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/counted_ptr.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/counted_ptr.cpp b/proton-c/bindings/cpp/src/counted_ptr.cpp
deleted file mode 100644
index 261d5ec..0000000
--- a/proton-c/bindings/cpp/src/counted_ptr.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <proton/object.h>
-
-namespace proton {
-
-void incref(const void* p) {
-    if (p) ::pn_incref(const_cast<void*>(p));
-}
-
-void decref(const void* p) {
-    if (p) ::pn_decref(const_cast<void*>(p));
-}
-
-}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/data.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/data.cpp b/proton-c/bindings/cpp/src/data.cpp
index 8a45d6b..1eb6ab8 100644
--- a/proton-c/bindings/cpp/src/data.cpp
+++ b/proton-c/bindings/cpp/src/data.cpp
@@ -26,7 +26,7 @@
 
 namespace proton {
 
-data& data::operator=(const data& x) { ::pn_data_copy(pn_object(), x.pn_object()); return *this; }
+data& data::copy(const data& x) { ::pn_data_copy(pn_object(), x.pn_object()); return *this; }
 
 void data::clear() { ::pn_data_clear(pn_object()); }
 
@@ -62,7 +62,7 @@ std::ostream& operator<<(std::ostream& o, const data& d) {
     return o << inspectable(d.pn_object());
 }
 
-owned_object<pn_data_t> data::create() { return pn_data(0); }
+data data::create() { return pn_ptr<pn_data_t>::take(pn_data(0)); }
 
 encoder data::encoder() { return proton::encoder(pn_object()); }
 decoder data::decoder() { return proton::decoder(pn_object()); }
@@ -156,10 +156,10 @@ int compare(data& a, data& b) {
 }
 } // namespace
 
-bool data::operator==(const data& x) const {
+bool data::equal(const data& x) const {
     return compare(const_cast<data&>(*this), const_cast<data&>(x)) == 0;
 }
-bool data::operator<(const data& x) const {
+bool data::less(const data& x) const {
     return compare(const_cast<data&>(*this), const_cast<data&>(x)) < 0;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/decoder.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/decoder.cpp b/proton-c/bindings/cpp/src/decoder.cpp
index f14345d..611d275 100644
--- a/proton-c/bindings/cpp/src/decoder.cpp
+++ b/proton-c/bindings/cpp/src/decoder.cpp
@@ -156,7 +156,7 @@ decoder operator>>(decoder d, rewind) { d.rewind(); return d; }
 
 decoder operator>>(decoder d, value& v) {
     data ddata = d.data();
-    if (object_base(ddata) == v.data_) throw decode_error("extract into self");
+    if (ddata == v.data_) throw decode_error("extract into self");
     data vdata = v.encoder().data();
     {
         narrow n(ddata);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/encoder.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/encoder.cpp b/proton-c/bindings/cpp/src/encoder.cpp
index a0b10c0..3624821 100644
--- a/proton-c/bindings/cpp/src/encoder.cpp
+++ b/proton-c/bindings/cpp/src/encoder.cpp
@@ -132,7 +132,7 @@ encoder operator<<(encoder e, amqp_binary value) { return insert(e, e.pn_object(
 
 encoder operator<<(encoder e, const value& v) {
     data edata = e.data();
-    if (object_base(edata) == v.data_) throw encode_error("cannot insert into self");
+    if (edata == v.data_) throw encode_error("cannot insert into self");
     data vdata = v.decoder().data();
     check(edata.append(vdata), e.pn_object());
     return e;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/link.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/link.cpp b/proton-c/bindings/cpp/src/link.cpp
index 587dec9..cb66933 100644
--- a/proton-c/bindings/cpp/src/link.cpp
+++ b/proton-c/bindings/cpp/src/link.cpp
@@ -80,8 +80,8 @@ class session link::session() const {
 
 void link::handler(class handler &h) {
     pn_record_t *record = pn_link_attachments(pn_object());
-    connection_context& cc(connection().context());
-    counted_ptr<pn_handler_t> chandler = cc.container_impl->cpp_handler(&h);
+    connection_context& cc(connection_context::get(connection()));
+    pn_ptr<pn_handler_t> chandler = cc.container_impl->cpp_handler(&h);
     pn_record_set_handler(record, chandler.get());
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/message.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/message.cpp b/proton-c/bindings/cpp/src/message.cpp
index 7c032f0..dd57606 100644
--- a/proton-c/bindings/cpp/src/message.cpp
+++ b/proton-c/bindings/cpp/src/message.cpp
@@ -66,7 +66,7 @@ void check(int err) {
 }
 } // namespace
 
-void message::id(const message_id& id) { data(pn_message_id(message_)) = id.value_; }
+void message::id(const message_id& id) { data(pn_message_id(message_)).copy(id.value_); }
 
 namespace {
 inline message_id from_pn_atom(const pn_atom_t& v) {
@@ -125,7 +125,7 @@ std::string message::reply_to() const {
 }
 
 void message::correlation_id(const message_id& id) {
-    data(pn_message_correlation_id(message_)) = id.value_;
+    data(pn_message_correlation_id(message_)).copy(id.value_);
 }
 
 message_id message::correlation_id() const {
@@ -186,7 +186,7 @@ bool message::inferred() const { return pn_message_is_inferred(message_); }
 
 void message::inferred(bool b) { pn_message_set_inferred(message_, b); }
 
-void message::body(const value& v) { body() = v; }
+void message::body(const value& v) { body().copy(v); }
 
 const data message::body() const {
     return pn_message_body(message_);
@@ -197,7 +197,7 @@ data message::body() {
 }
 
 void message::properties(const value& v) {
-    properties() = v;
+    properties().copy(v);
 }
 
 const data message::properties() const {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/messaging_adapter.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/messaging_adapter.cpp b/proton-c/bindings/cpp/src/messaging_adapter.cpp
index e3bced8..d551018 100644
--- a/proton-c/bindings/cpp/src/messaging_adapter.cpp
+++ b/proton-c/bindings/cpp/src/messaging_adapter.cpp
@@ -75,7 +75,7 @@ void messaging_adapter::on_delivery(event &e) {
                 // generate on_message
                 messaging_event mevent(messaging_event::MESSAGE, *pe);
                 pn_connection_t *pnc = pn_session_connection(pn_link_session(lnk));
-                struct connection_context& ctx = connection_context::get(pnc);
+                connection_context& ctx = connection_context::get(pnc);
                 // Reusable per-connection message.
                 // Avoid expensive heap malloc/free overhead.
                 // See PROTON-998

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/object.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/object.cpp b/proton-c/bindings/cpp/src/object.cpp
index d5fb7ef..9fde50f 100644
--- a/proton-c/bindings/cpp/src/object.cpp
+++ b/proton-c/bindings/cpp/src/object.cpp
@@ -22,12 +22,12 @@
 
 namespace proton {
 
-void object_base::incref() const {
-    if (object_) ::pn_incref(const_cast<void*>(object_));
+void pn_ptr_base::incref(void *p) {
+    if (p) ::pn_incref(const_cast<void*>(p));
 }
 
-void object_base::decref() const {
-    if (object_) ::pn_decref(const_cast<void*>(object_));
+void pn_ptr_base::decref(void *p) {
+    if (p) ::pn_decref(const_cast<void*>(p));
 }
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/reactor.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/reactor.cpp b/proton-c/bindings/cpp/src/reactor.cpp
index 9a52d99..2a740e8 100644
--- a/proton-c/bindings/cpp/src/reactor.cpp
+++ b/proton-c/bindings/cpp/src/reactor.cpp
@@ -30,10 +30,7 @@
 namespace proton {
 
 reactor reactor::create() {
-    pn_reactor_t *p = pn_reactor();
-    reactor r(p);
-    pn_decref(p);               // FIXME aconway 2015-11-26: take ownership
-    return r;
+    return pn_ptr<pn_reactor_t>::take(pn_reactor()).get();
 }
 
 void reactor::run() { pn_reactor_run(pn_object()); }
@@ -92,8 +89,4 @@ void reactor::timeout(duration timeout) {
         pn_reactor_set_timeout(pn_object(), timeout.milliseconds);
 }
 
-void reactor::container_context(container& c) {
-    proton::container_context(pn_object(), c);
-}
-
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/session.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/session.cpp b/proton-c/bindings/cpp/src/session.cpp
index e903080..c6c2233 100644
--- a/proton-c/bindings/cpp/src/session.cpp
+++ b/proton-c/bindings/cpp/src/session.cpp
@@ -40,7 +40,7 @@ connection session::connection() const {
 namespace {
 std::string set_name(const std::string& name, session* s) {
     if (name.empty())
-        return s->connection().context().container_impl->next_link_name();
+        return connection_context::get(s->connection()).container_impl->next_link_name();
     return name;
 }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5045ec03/proton-c/bindings/cpp/src/value.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/value.cpp b/proton-c/bindings/cpp/src/value.cpp
index be5ca5e..b603bf9 100644
--- a/proton-c/bindings/cpp/src/value.cpp
+++ b/proton-c/bindings/cpp/src/value.cpp
@@ -28,9 +28,9 @@ namespace proton {
 
 value::value() : data_(data::create()) {}
 
-value::value(const value& x) : data_(data::create()) { data_ = x.data_; }
+value::value(const value& x) : data_(data::create()) { data_.copy(x.data_); }
 
-value& value::operator=(const value& x) { data_ = x.data_; return *this; }
+value& value::operator=(const value& x) { data_.copy(x.data_); return *this; }
 
 void value::clear() { data_.clear(); }
 
@@ -42,9 +42,9 @@ class decoder value::decoder() const { data_.decoder().rewind(); return data_.de
 
 type_id value::type() const { return decoder().type(); }
 
-bool value::operator==(const value& x) const { return data_ == x.data_; }
+bool value::operator==(const value& x) const { return data_.equal(x.data_); }
 
-bool value::operator<(const value& x) const { return data_ < x.data_; }
+bool value::operator<(const value& x) const { return data_.less(x.data_); }
 
 std::ostream& operator<<(std::ostream& o, const value& v) {
     // pn_inspect prints strings with quotes which is not normal in C++.


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org