1 #ifndef PROTON_THREAD_SAFE_HPP 2 #define PROTON_THREAD_SAFE_HPP 25 #include "./internal/config.hpp" 26 #include "./connection.hpp" 27 #include "./event_loop.hpp" 28 #include "./internal/object.hpp" 29 #include "./internal/type_traits.hpp" 42 template <
class T>
struct endpoint_traits;
43 template<>
struct endpoint_traits<connection> {};
44 template<>
struct endpoint_traits<session> {};
45 template<>
struct endpoint_traits<link> {};
46 template<>
struct endpoint_traits<sender> {};
47 template<>
struct endpoint_traits<receiver> {};
50 template <
class T>
class returned;
69 class thread_safe :
private internal::pn_ptr_base,
private internal::endpoint_traits<T> {
70 typedef typename T::pn_type pn_type;
72 struct inject_decref :
public void_function0 {
74 inject_decref(pn_type* p) : ptr_(p) {}
75 void operator()() PN_CPP_OVERRIDE { decref(ptr_);
delete this; }
80 static void operator delete(
void*) {}
87 event_loop()->inject(std::bind(&decref, ptr()));
89 event_loop()->inject(*
new inject_decref(ptr()));
105 static void*
operator new(size_t, pn_type* p) {
return p; }
106 static void operator delete(
void*, pn_type*) {}
108 pn_type* ptr() {
return reinterpret_cast<pn_type*
>(
this); }
116 friend class returned<T>;
125 class returned :
private internal::endpoint_traits<T>
134 returned(
const returned& x) : ptr_(const_cast<returned&>(x).release()) {}
136 ~returned() {
if (ptr_)
delete ptr_; }
145 operator T() {
return ptr_->
unsafe(); }
148 operator std::shared_ptr<thread_safe<T> >() {
150 return std::shared_ptr<thread_safe<T> >(release());
154 operator std::unique_ptr<thread_safe<T> >() {
155 return std::unique_ptr<thread_safe<T> >(release());
160 void operator=(
const returned&);
168 template <
class T> std::shared_ptr<thread_safe<T> > make_shared_thread_safe(
const T& obj) {
171 template <
class T> std::unique_ptr<thread_safe<T> > make_unique_thread_safe(
const T& obj) {
178 #endif // PROTON_THREAD_SAFE_HPP Experimental - A serial execution context.
Definition: event_loop.hpp:57
T unsafe()
Get the thread-unsafe proton object wrapped by this thread_safe<T>
Definition: thread_safe.hpp:101
class event_loop * event_loop()
Get the event loop for this object.
Definition: thread_safe.hpp:98
returned< T > make_thread_safe(const T &obj)
Make a thread-safe wrapper for obj.
Definition: thread_safe.hpp:165
Type traits for mapping between AMQP and C++ types.
Definition: annotation_key.hpp:28
Experimental - A thread-safe object wrapper.
Definition: connection.hpp:45