26 template<
typename Derived>
30 std::tr1::weak_ptr<Derived> myselfptr;
33 std::tr1::shared_ptr<Derived> ptr;
34 canceller(
const std::tr1::shared_ptr<Derived>& ptr) :ptr(ptr) {}
36 void operator()(Derived *) {
37 std::tr1::shared_ptr<Derived> P;
45 std::tr1::shared_ptr<Derived> ret(myselfptr);
47 throw std::tr1::bad_weak_ptr();
51 #if __cplusplus>=201103L 52 template<
class ...Args>
54 std::tr1::shared_ptr<Derived>
build(Args... args) {
55 std::tr1::shared_ptr<Derived> inner(
new Derived(std::forward<Args>(args)...)),
56 ret(inner.get(), canceller(inner));
57 inner->myselfptr = inner;
62 std::tr1::shared_ptr<Derived>
build() {
63 std::tr1::shared_ptr<Derived> inner(
new Derived),
64 ret(inner.get(), canceller(inner));
65 inner->myselfptr = inner;
71 std::tr1::shared_ptr<Derived>
build(A a) {
72 std::tr1::shared_ptr<Derived> inner(
new Derived(a)),
73 ret(inner.get(), canceller(inner));
74 inner->myselfptr = inner;
78 template<
typename A,
typename B>
80 std::tr1::shared_ptr<Derived>
build(A a, B b) {
81 std::tr1::shared_ptr<Derived> inner(
new Derived(a, b)),
82 ret(inner.get(), canceller(inner));
83 inner->myselfptr = inner;
133 bool notify = store.
nwaitcb!=0;
134 store.
mutex.unlock();
144 if(!store.
incb)
return;
147 while(store.
incb && store.
incb!=
self) {
148 store.
mutex.unlock();
181 #endif // CLIENTPVT_H
void registerRefTrackInfo()
void registerRefTrackMonitor()
void registerRefTrackPut()
static std::tr1::shared_ptr< Derived > build(A a)
static std::tr1::shared_ptr< Derived > build()
void registerRefTrackGet()
std::tr1::shared_ptr< Derived > internal_shared_from_this()
APIs for the epicsEvent binary semaphore.
epicsGuard< epicsMutex > Guard
epicsGuardRelease< epicsMutex > UnGuard
void registerRefTrackRPC()
CallbackUse(CallbackGuard &G)
C++ and C descriptions for a thread.
static std::tr1::shared_ptr< Derived > build(A a, B b)
CallbackGuard(CallbackStorage &store)
LIBCOM_API epicsThreadId epicsStdCall epicsThreadGetIdSelf(void)