proxygen
folly::observer::ObserverCreator< Observable, Traits > Class Template Reference

#include <Observable.h>

Public Types

using T = typename Traits::element_type
 

Public Member Functions

template<typename... Args>
 ObserverCreator (Args &&...args)
 
Observer< TgetObserver ()&&
 

Private Types

using Context = detail::ObserverCreatorContext< Observable, Traits >
 

Private Attributes

std::shared_ptr< Contextcontext_
 

Detailed Description

template<typename Observable, typename Traits = ObservableTraits<Observable>>
class folly::observer::ObserverCreator< Observable, Traits >

Definition at line 48 of file Observable.h.

Member Typedef Documentation

template<typename Observable, typename Traits = ObservableTraits<Observable>>
using folly::observer::ObserverCreator< Observable, Traits >::Context = detail::ObserverCreatorContext<Observable, Traits>
private

Definition at line 58 of file Observable.h.

template<typename Observable, typename Traits = ObservableTraits<Observable>>
using folly::observer::ObserverCreator< Observable, Traits >::T = typename Traits::element_type

Definition at line 50 of file Observable.h.

Constructor & Destructor Documentation

template<typename Observable , typename Traits >
template<typename... Args>
folly::observer::ObserverCreator< Observable, Traits >::ObserverCreator ( Args &&...  args)
explicit

Definition at line 98 of file Observable-inl.h.

99  : context_(std::make_shared<Context>(std::forward<Args>(args)...)) {}
std::shared_ptr< Context > context_
Definition: Observable.h:60

Member Function Documentation

template<typename Observable , typename Traits >
Observer< typename ObserverCreator< Observable, Traits >::T > folly::observer::ObserverCreator< Observable, Traits >::getObserver ( )

Definition at line 103 of file Observable-inl.h.

References context, folly::observer::ObserverCreator< Observable, Traits >::context_, folly::observer::detail::ObserverCreatorContext< Observable, Traits >::get(), folly::observer::makeObserver(), and folly::gen::move.

103  {
104  // This master shared_ptr allows grabbing derived weak_ptrs, pointing to the
105  // the same Context object, but using a separate reference count. Master
106  // shared_ptr destructor then blocks until all shared_ptrs obtained from
107  // derived weak_ptrs are released.
108  class ContextMasterPointer {
109  public:
110  explicit ContextMasterPointer(std::shared_ptr<Context> context)
111  : contextMaster_(std::move(context)),
112  context_(
113  contextMaster_.get(),
114  [destroyBaton = destroyBaton_](Context*) {
115  destroyBaton->post();
116  }) {}
117  ~ContextMasterPointer() {
118  if (context_) {
119  context_.reset();
120  destroyBaton_->wait();
121  }
122  }
123  ContextMasterPointer(const ContextMasterPointer&) = delete;
124  ContextMasterPointer(ContextMasterPointer&&) = default;
125  ContextMasterPointer& operator=(const ContextMasterPointer&) = delete;
126  ContextMasterPointer& operator=(ContextMasterPointer&&) = default;
127 
128  Context* operator->() const {
129  return contextMaster_.get();
130  }
131 
132  std::weak_ptr<Context> get_weak() {
133  return context_;
134  }
135 
136  private:
137  std::shared_ptr<folly::Baton<>> destroyBaton_{
138  std::make_shared<folly::Baton<>>()};
139  std::shared_ptr<Context> contextMaster_;
140  std::shared_ptr<Context> context_;
141  };
142  // We want to make sure that Context can only be destroyed when Core is
143  // destroyed. So we have to avoid the situation when subscribe callback is
144  // locking Context shared_ptr and remains the last to release it.
145  // We solve this by having Core hold the master shared_ptr and subscription
146  // callback gets derived weak_ptr.
147  ContextMasterPointer contextMaster(context_);
148  auto contextWeak = contextMaster.get_weak();
149  auto observer = makeObserver(
150  [context = std::move(contextMaster)]() { return context->get(); });
151 
152  context_->setCore(observer.core_);
153  context_->subscribe([contextWeak = std::move(contextWeak)] {
154  if (auto context = contextWeak.lock()) {
155  context->update();
156  }
157  });
158 
159  // Do an extra update in case observable was updated between observer creation
160  // and setting updates callback.
161  context_->update();
162  context_.reset();
163 
164  return observer;
165 }
detail::ObserverCreatorContext< Observable, Traits > Context
Definition: Observable.h:58
context
Definition: CMakeCache.txt:563
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
STL namespace.
Observer< observer_detail::ResultOfUnwrapSharedPtr< F > > makeObserver(F &&creator)
Definition: Observer-inl.h:37
std::shared_ptr< Context > context_
Definition: Observable.h:60
PUSHMI_INLINE_VAR constexpr detail::get_fn< T > get
Definition: submit.h:391

Member Data Documentation

template<typename Observable, typename Traits = ObservableTraits<Observable>>
std::shared_ptr<Context> folly::observer::ObserverCreator< Observable, Traits >::context_
private

The documentation for this class was generated from the following files: