/* * Copyright information and license terms for this software can be * found in the file LICENSE that is included with the distribution */ #ifndef SHAREDSTATEIMPL_H #define SHAREDSTATEIMPL_H #include #include "pva/sharedstate.h" #include #include #define FOR_EACH(TYPE, IT, END, OBJ) for(TYPE IT((OBJ).begin()), END((OBJ).end()); IT != END; ++IT) namespace pvd = epics::pvData; namespace pva = epics::pvAccess; typedef epicsGuard Guard; typedef epicsGuardRelease UnGuard; namespace pvas { namespace detail { struct SharedChannel : public pva::Channel, public std::tr1::enable_shared_from_this { static size_t num_instances; const std::tr1::shared_ptr owner; const std::string channelName; const requester_type::weak_pointer requester; const pva::ChannelProvider::weak_pointer provider; bool dead; // has destroy() been called? SharedChannel(const std::tr1::shared_ptr& owner, const pva::ChannelProvider::shared_pointer provider, const std::string& channelName, const requester_type::shared_pointer& requester); virtual ~SharedChannel(); virtual void destroy() OVERRIDE FINAL; virtual std::tr1::shared_ptr getProvider() OVERRIDE FINAL; virtual std::string getRemoteAddress() OVERRIDE FINAL; virtual std::string getChannelName() OVERRIDE FINAL; virtual std::tr1::shared_ptr getChannelRequester() OVERRIDE FINAL; virtual void getField(pva::GetFieldRequester::shared_pointer const & requester,std::string const & subField) OVERRIDE FINAL; virtual pva::ChannelPut::shared_pointer createChannelPut( pva::ChannelPutRequester::shared_pointer const & requester, pvd::PVStructure::shared_pointer const & pvRequest) OVERRIDE FINAL; virtual pva::ChannelRPC::shared_pointer createChannelRPC( pva::ChannelRPCRequester::shared_pointer const & requester, pvd::PVStructure::shared_pointer const & pvRequest) OVERRIDE FINAL; virtual pva::Monitor::shared_pointer createMonitor( pva::MonitorRequester::shared_pointer const & requester, pvd::PVStructure::shared_pointer const & pvRequest) OVERRIDE FINAL; }; struct SharedMonitorFIFO : public pva::MonitorFIFO { const std::tr1::shared_ptr channel; SharedMonitorFIFO(const std::tr1::shared_ptr& channel, const requester_type::shared_pointer& requester, const pvd::PVStructure::const_shared_pointer &pvRequest, Config *conf); virtual ~SharedMonitorFIFO(); }; struct SharedPut : public pva::ChannelPut, public std::tr1::enable_shared_from_this { const std::tr1::shared_ptr channel; const requester_type::weak_pointer requester; const pvd::PVStructure::const_shared_pointer pvRequest; // guarded by PV mutex pvd::PVRequestMapper mapper; static size_t num_instances; SharedPut(const std::tr1::shared_ptr& channel, const requester_type::shared_pointer& requester, const pvd::PVStructure::const_shared_pointer &pvRequest); virtual ~SharedPut(); virtual void destroy() OVERRIDE FINAL; virtual std::tr1::shared_ptr getChannel() OVERRIDE FINAL; virtual void cancel() OVERRIDE FINAL; virtual void lastRequest() OVERRIDE FINAL; virtual void put( epics::pvData::PVStructure::shared_pointer const & pvPutStructure, epics::pvData::BitSet::shared_pointer const & putBitSet) OVERRIDE FINAL; virtual void get() OVERRIDE FINAL; }; struct SharedRPC : public pva::ChannelRPC, public std::tr1::enable_shared_from_this { const std::tr1::shared_ptr channel; const requester_type::weak_pointer requester; const pvd::PVStructure::const_shared_pointer pvRequest; static size_t num_instances; bool connected; // have I called requester->channelRPCConnect(Ok) ? SharedRPC(const std::tr1::shared_ptr& channel, const requester_type::shared_pointer& requester, const pvd::PVStructure::const_shared_pointer &pvRequest); virtual ~SharedRPC(); virtual void destroy() OVERRIDE FINAL; virtual std::tr1::shared_ptr getChannel() OVERRIDE FINAL; virtual void cancel() OVERRIDE FINAL; virtual void lastRequest() OVERRIDE FINAL; virtual void request(epics::pvData::PVStructure::shared_pointer const & pvArgument) OVERRIDE FINAL; }; } // namespace detail struct Operation::Impl { static size_t num_instances; epicsMutex mutex; const pvd::PVStructure::const_shared_pointer pvRequest, value; const pvd::BitSet changed; bool done; int debugLvl; Impl(const pvd::PVStructure::const_shared_pointer& pvRequest, const pvd::PVStructure::const_shared_pointer& value, const pvd::BitSet& changed, int debugLvl = 0) :pvRequest(pvRequest), value(value), changed(changed), done(false), debugLvl(debugLvl) {} virtual ~Impl() {} virtual pva::Channel::shared_pointer getChannel() =0; virtual pva::ChannelBaseRequester::shared_pointer getRequester() =0; virtual void complete(const pvd::Status& sts, const epics::pvData::PVStructure* value) =0; struct Cleanup { void operator()(Impl*); }; }; } // namespace pvas #endif // SHAREDSTATEIMPL_H