This is Unofficial EPICS BASE Doxygen Site
sharedstateimpl.h
Go to the documentation of this file.
1 /*
2  * Copyright information and license terms for this software can be
3  * found in the file LICENSE that is included with the distribution
4  */
5 #ifndef SHAREDSTATEIMPL_H
6 #define SHAREDSTATEIMPL_H
7 
8 #include <pv/createRequest.h>
9 
10 #include "pva/sharedstate.h"
11 #include <pv/pvAccess.h>
12 #include <pv/security.h>
13 #include <pv/reftrack.h>
14 
15 #define FOR_EACH(TYPE, IT, END, OBJ) for(TYPE IT((OBJ).begin()), END((OBJ).end()); IT != END; ++IT)
16 
17 namespace pvd = epics::pvData;
18 namespace pva = epics::pvAccess;
19 
22 
23 namespace pvas {
24 namespace detail {
25 
26 struct SharedChannel : public pva::Channel,
27  public std::tr1::enable_shared_from_this<SharedChannel>
28 {
29  static size_t num_instances;
30 
31  const std::tr1::shared_ptr<SharedPV> owner;
32  const std::string channelName;
33  const requester_type::weak_pointer requester;
34  const pva::ChannelProvider::weak_pointer provider;
35 
36  bool dead; // has destroy() been called?
37 
38  SharedChannel(const std::tr1::shared_ptr<SharedPV>& owner,
39  const pva::ChannelProvider::shared_pointer provider,
40  const std::string& channelName,
41  const requester_type::shared_pointer& requester);
42  virtual ~SharedChannel();
43 
44  virtual void destroy() OVERRIDE FINAL;
45 
46  virtual std::tr1::shared_ptr<pva::ChannelProvider> getProvider() OVERRIDE FINAL;
47  virtual std::string getRemoteAddress() OVERRIDE FINAL;
48  virtual std::string getChannelName() OVERRIDE FINAL;
49  virtual std::tr1::shared_ptr<pva::ChannelRequester> getChannelRequester() OVERRIDE FINAL;
50 
51  virtual void getField(pva::GetFieldRequester::shared_pointer const & requester,std::string const & subField) OVERRIDE FINAL;
52 
53  virtual pva::ChannelPut::shared_pointer createChannelPut(
54  pva::ChannelPutRequester::shared_pointer const & requester,
55  pvd::PVStructure::shared_pointer const & pvRequest) OVERRIDE FINAL;
56 
57  virtual pva::ChannelRPC::shared_pointer createChannelRPC(
58  pva::ChannelRPCRequester::shared_pointer const & requester,
59  pvd::PVStructure::shared_pointer const & pvRequest) OVERRIDE FINAL;
60 
61  virtual pva::Monitor::shared_pointer createMonitor(
62  pva::MonitorRequester::shared_pointer const & requester,
63  pvd::PVStructure::shared_pointer const & pvRequest) OVERRIDE FINAL;
64 };
65 
66 struct SharedMonitorFIFO : public pva::MonitorFIFO
67 {
68  const std::tr1::shared_ptr<SharedChannel> channel;
69  SharedMonitorFIFO(const std::tr1::shared_ptr<SharedChannel>& channel,
70  const requester_type::shared_pointer& requester,
71  const pvd::PVStructure::const_shared_pointer &pvRequest,
72  Config *conf);
73  virtual ~SharedMonitorFIFO();
74 };
75 
76 struct SharedPut : public pva::ChannelPut,
77  public std::tr1::enable_shared_from_this<SharedPut>
78 {
79  const std::tr1::shared_ptr<SharedChannel> channel;
80  const requester_type::weak_pointer requester;
81  const pvd::PVStructure::const_shared_pointer pvRequest;
82 
83  // guarded by PV mutex
85 
86  static size_t num_instances;
87 
88  SharedPut(const std::tr1::shared_ptr<SharedChannel>& channel,
89  const requester_type::shared_pointer& requester,
90  const pvd::PVStructure::const_shared_pointer &pvRequest);
91  virtual ~SharedPut();
92 
93  virtual void destroy() OVERRIDE FINAL;
94  virtual std::tr1::shared_ptr<pva::Channel> getChannel() OVERRIDE FINAL;
95  virtual void cancel() OVERRIDE FINAL;
96  virtual void lastRequest() OVERRIDE FINAL;
97 
98  virtual void put(
99  epics::pvData::PVStructure::shared_pointer const & pvPutStructure,
100  epics::pvData::BitSet::shared_pointer const & putBitSet) OVERRIDE FINAL;
101 
102  virtual void get() OVERRIDE FINAL;
103 };
104 
105 struct SharedRPC : public pva::ChannelRPC,
106  public std::tr1::enable_shared_from_this<SharedRPC>
107 {
108  const std::tr1::shared_ptr<SharedChannel> channel;
109  const requester_type::weak_pointer requester;
110  const pvd::PVStructure::const_shared_pointer pvRequest;
111 
112  static size_t num_instances;
113 
114  bool connected; // have I called requester->channelRPCConnect(Ok) ?
115 
116  SharedRPC(const std::tr1::shared_ptr<SharedChannel>& channel,
117  const requester_type::shared_pointer& requester,
118  const pvd::PVStructure::const_shared_pointer &pvRequest);
119  virtual ~SharedRPC();
120 
121  virtual void destroy() OVERRIDE FINAL;
122  virtual std::tr1::shared_ptr<pva::Channel> getChannel() OVERRIDE FINAL;
123  virtual void cancel() OVERRIDE FINAL;
124  virtual void lastRequest() OVERRIDE FINAL;
125 
126  virtual void request(epics::pvData::PVStructure::shared_pointer const & pvArgument) OVERRIDE FINAL;
127 };
128 
129 } // namespace detail
130 
132 {
133  static size_t num_instances;
134 
136 
137  const pvd::PVStructure::const_shared_pointer pvRequest, value;
140  pva::PeerInfo::const_shared_pointer info;
141 
142  bool done;
143  int debugLvl;
144 
145  Impl(const pvd::PVStructure::const_shared_pointer& pvRequest,
146  const pvd::PVStructure::const_shared_pointer& value,
147  const pvd::BitSet& changed,
148  int debugLvl = 0)
149  :pvRequest(pvRequest), value(value), changed(changed), done(false), debugLvl(debugLvl)
150  {}
151  virtual ~Impl() {}
152 
153  virtual pva::Channel::shared_pointer getChannel() =0;
154  virtual pva::ChannelBaseRequester::shared_pointer getRequester() =0;
155  virtual void complete(const pvd::Status& sts,
156  const epics::pvData::PVStructure* value) =0;
157 
158  struct Cleanup {
159  void operator()(Impl*);
160  };
161 };
162 
163 } // namespace pvas
164 
165 #endif // SHAREDSTATEIMPL_H
virtual void destroy() OVERRIDE FINAL
std::string request
virtual std::tr1::shared_ptr< pva::ChannelRequester > getChannelRequester() OVERRIDE FINAL
const requester_type::weak_pointer requester
std::tr1::shared_ptr< detail::SharedPut > put
const requester_type::weak_pointer requester
pvd::PVRequestMapper mapper
epicsGuard< epicsMutex > Guard
Definition: memory.hpp:41
virtual pva::ChannelRPC::shared_pointer createChannelRPC(pva::ChannelRPCRequester::shared_pointer const &requester, pvd::PVStructure::shared_pointer const &pvRequest) OVERRIDE FINAL
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
static size_t num_instances
A vector of bits.
Definition: bitSet.h:56
const pvd::PVStructure::const_shared_pointer pvRequest
#define OVERRIDE
Definition: pvAccess.h:55
Holds all PVA related.
Definition: pvif.h:34
const std::tr1::shared_ptr< SharedPV > owner
const pvd::BitSet changed
pvData
Definition: monitor.h:428
const std::tr1::shared_ptr< SharedChannel > channel
virtual pva::ChannelPut::shared_pointer createChannelPut(pva::ChannelPutRequester::shared_pointer const &requester, pvd::PVStructure::shared_pointer const &pvRequest) OVERRIDE FINAL
Impl(const pvd::PVStructure::const_shared_pointer &pvRequest, const pvd::PVStructure::const_shared_pointer &value, const pvd::BitSet &changed, int debugLvl=0)
virtual void getField(pva::GetFieldRequester::shared_pointer const &requester, std::string const &subField) OVERRIDE FINAL
virtual std::tr1::shared_ptr< pva::ChannelProvider > getProvider() OVERRIDE FINAL
const pvd::PVStructure::const_shared_pointer pvRequest
const pvd::PVStructure::const_shared_pointer value
See Server API API.
const pva::ChannelProvider::weak_pointer provider
Data interface for a structure,.
Definition: pvData.h:712
virtual std::string getChannelName() OVERRIDE FINAL
const std::tr1::shared_ptr< SharedChannel > channel
virtual std::string getRemoteAddress() OVERRIDE FINAL
const std::string channelName
Definition: caget.c:48
pva::PeerInfo::const_shared_pointer info
const after sub-class ctor
epicsGuardRelease< epicsMutex > UnGuard
SharedChannel(const std::tr1::shared_ptr< SharedPV > &owner, const pva::ChannelProvider::shared_pointer provider, const std::string &channelName, const requester_type::shared_pointer &requester)
static size_t num_instances
const std::tr1::shared_ptr< SharedChannel > channel
const requester_type::weak_pointer requester
#define false
Definition: flexdef.h:85
#define FINAL
Definition: pvAccess.h:48
virtual pva::Monitor::shared_pointer createMonitor(pva::MonitorRequester::shared_pointer const &requester, pvd::PVStructure::shared_pointer const &pvRequest) OVERRIDE FINAL