This is Unofficial EPICS BASE Doxygen Site
chancache.h
Go to the documentation of this file.
1 #ifndef CHANCACHE_H
2 #define CHANCACHE_H
3 
4 #include <string>
5 #include <map>
6 #include <set>
7 #include <deque>
8 
9 #include <epicsMutex.h>
10 #include <epicsTimer.h>
11 
12 #include <pv/pvAccess.h>
13 
14 #include "weakmap.h"
15 #include "weakset.h"
16 
17 #include <shareLib.h>
18 
19 struct ChannelCache;
20 struct ChannelCacheEntry;
21 struct MonitorUser;
22 struct GWChannel;
23 
25 {
27  static size_t num_instances;
28  weak_pointer weakref;
29 
31 
32  const size_t bufferSize; // DS requested buffer size
33 
34  // to avoid yet another mutex borrow interested.mutex() for our members
35  inline epicsMutex& mutex() const { return interested.mutex(); }
36 
37  typedef std::vector<epicsUInt8> pvrequest_t;
38 
39  bool havedata; // set when initial update is received
40  bool done; // set when unlisten() is received
41  size_t nwakeups; // # of upstream monitorEvent() calls
42  size_t nevents; // # of upstream events poll()'d
43 
48  epics::pvData::MonitorElement::shared_pointer lastelem;
51 
53  interested_t interested;
54 
55  MonitorCacheEntry(ChannelCacheEntry *ent, const epics::pvData::PVStructure::shared_pointer& pvr);
56  virtual ~MonitorCacheEntry();
57 
58  virtual void monitorConnect(epics::pvData::Status const & status,
59  epics::pvData::MonitorPtr const & monitor,
61  virtual void monitorEvent(epics::pvData::MonitorPtr const & monitor);
62  virtual void unlisten(epics::pvData::MonitorPtr const & monitor);
63 
64  virtual std::string getRequesterName();
65 };
66 
68 {
70  static size_t num_instances;
71  weak_pointer weakref;
72 
73  inline epicsMutex& mutex() const { return entry->mutex(); }
74 
75  MonitorCacheEntry::shared_pointer entry;
76  epics::pvData::MonitorRequester::weak_pointer req;
77  std::tr1::weak_ptr<GWChannel> srvchan;
78 
79  // guards queues and member variables
80  bool initial;
81  bool running;
82  bool inoverflow;
83  size_t nwakeups; // # of monitorEvent() calls to req
84  size_t nevents; // total # events queued
85  size_t ndropped; // # of events drop because our queue was full
86 
87  std::deque<epics::pvData::MonitorElementPtr> filled, empty;
88  std::set<epics::pvData::MonitorElementPtr> inuse;
89 
91 
92  MonitorUser(const MonitorCacheEntry::shared_pointer&);
93  virtual ~MonitorUser();
94 
95  virtual void destroy();
96 
97  virtual epics::pvData::Status start();
98  virtual epics::pvData::Status stop();
99  virtual epics::pvData::MonitorElementPtr poll();
100  virtual void release(epics::pvData::MonitorElementPtr const & monitorElement);
101 
102  virtual std::string getRequesterName();
103 };
104 
106 {
108  static size_t num_instances;
109 
110  const std::string channelName;
112 
113  // to avoid yet another mutex borrow interested.mutex() for our members
114  inline epicsMutex& mutex() const { return interested.mutex(); }
115 
116  // clientChannel
117  epics::pvAccess::Channel::shared_pointer channel;
118  epics::pvAccess::ChannelRequester::shared_pointer requester;
119 
120  bool dropPoke;
121 
123  interested_t interested;
124 
127  mon_entries_t mon_entries;
128 
129  ChannelCacheEntry(ChannelCache*, const std::string& n);
130  virtual ~ChannelCacheEntry();
131 
132  // this exists as a seperate object to prevent a reference loop
133  // ChannelCacheEntry -> pva::Channel -> CRequester
135  {
136  static size_t num_instances;
137 
138  CRequester(const ChannelCacheEntry::shared_pointer& p);
139  virtual ~CRequester();
140  ChannelCacheEntry::weak_pointer chan;
141  // for Requester
142  virtual std::string getRequesterName();
143  // for ChannelRequester
144  virtual void channelCreated(const epics::pvData::Status& status,
145  epics::pvAccess::Channel::shared_pointer const & channel);
146  virtual void channelStateChange(epics::pvAccess::Channel::shared_pointer const & channel,
148  };
149 };
150 
154 {
155  typedef std::map<std::string, ChannelCacheEntry::shared_pointer > entries_t;
156 
157  // cacheLock should not be held while calling *Requester methods
159 
160  entries_t entries;
161 
162  epics::pvAccess::ChannelProvider::shared_pointer provider; // client Provider
163 
164  epicsTimerQueueActive *timerQueue;
165  epicsTimer *cleanTimer;
166  struct cacheClean;
168  size_t cleanerRuns;
169  size_t cleanerDust;
170 
171  ChannelCache(const epics::pvAccess::ChannelProvider::shared_pointer& prov);
172  ~ChannelCache();
173 
174  ChannelCacheEntry::shared_pointer lookup(const std::string& name);
175 };
176 
177 #endif // CHANCACHE_H
178 
entries_t entries
Definition: chancache.h:160
epicsTimer * cleanTimer
Definition: chancache.h:165
epics::pvData::BitSetPtr empty
Definition: pvAccess.cpp:135
MonitorCacheEntry::shared_pointer entry
Definition: chancache.h:75
virtual void unlisten(epics::pvData::MonitorPtr const &monitor)
Definition: moncache.cpp:214
epics::pvData::MonitorRequester::weak_pointer req
Definition: chancache.h:76
epicsMutex & mutex() const
Definition: chancache.h:114
epics::pvData::MonitorPtr mon
Definition: chancache.h:49
ChannelCacheEntry *const chan
Definition: chancache.h:30
epics::pvAccess::Channel::shared_pointer channel
Definition: chancache.h:117
size_t cleanerRuns
Definition: chancache.h:168
POINTER_DEFINITIONS(MonitorCacheEntry)
mon_entries_t mon_entries
Definition: chancache.h:127
pvd::Status status
virtual std::string getRequesterName()
Definition: moncache.cpp:239
bool running
Definition: chancache.h:81
epicsMutex & mutex() const
Definition: chancache.h:35
std::vector< epicsUInt8 > pvrequest_t
Definition: chancache.h:37
epicsMutex cacheLock
Definition: chancache.h:158
epics::pvAccess::ChannelProvider::shared_pointer provider
Definition: chancache.h:162
weak_value_map< pvrequest_t, MonitorCacheEntry > mon_entries_t
Definition: chancache.h:126
size_t nwakeups
Definition: chancache.h:83
virtual ~MonitorCacheEntry()
Definition: moncache.cpp:45
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
weak_pointer weakref
Definition: chancache.h:71
weak_set< GWChannel > interested_t
Definition: chancache.h:122
interested_t interested
Definition: chancache.h:123
Mark external symbols and entry points for shared libraries.
bucket * lookup(char *name)
Definition: symtab.c:66
epics::pvData::MonitorElementPtr overflowElement
Definition: chancache.h:90
epics::pvData::Status startresult
Definition: chancache.h:50
epics::pvAccess::ChannelRequester::shared_pointer requester
Definition: chancache.h:118
ChannelCacheEntry::weak_pointer chan
Definition: chancache.h:140
epicsMutex & mutex() const
Definition: weakset.h:199
MonitorCacheEntry(ChannelCacheEntry *ent, const epics::pvData::PVStructure::shared_pointer &pvr)
Definition: moncache.cpp:34
std::tr1::weak_ptr< GWChannel > srvchan
Definition: chancache.h:77
weak_pointer weakref
Definition: chancache.h:28
interested_t interested
Definition: chancache.h:53
const size_t bufferSize
Definition: chancache.h:32
epics::pvData::StructureConstPtr typedesc
Definition: chancache.h:44
APIs for the epicsMutex mutual exclusion semaphore.
const std::string channelName
Definition: chancache.h:110
size_t cleanerDust
Definition: chancache.h:169
std::map< std::string, ChannelCacheEntry::shared_pointer > entries_t
Definition: chancache.h:155
virtual void monitorEvent(epics::pvData::MonitorPtr const &monitor)
Definition: moncache.cpp:110
Callback implemented by monitor clients.
Definition: pvAccess.h:249
static size_t num_instances
Definition: chancache.h:27
static size_t num_instances
Definition: chancache.h:108
bool initial
Definition: chancache.h:80
epicsTimerQueueActive * timerQueue
Definition: chancache.h:164
size_t nevents
Definition: chancache.h:84
ChannelCache *const cache
Definition: chancache.h:111
epicsMutex & mutex() const
Definition: chancache.h:73
cacheClean * cleaner
Definition: chancache.h:166
weak_set< MonitorUser > interested_t
Definition: chancache.h:52
std::tr1::shared_ptr< MonitorElement > MonitorElementPtr
Definition: monitor.h:40
epics::pvData::MonitorElement::shared_pointer lastelem
Definition: chancache.h:48
virtual void monitorConnect(epics::pvData::Status const &status, epics::pvData::MonitorPtr const &monitor, epics::pvData::StructureConstPtr const &structure)
Definition: moncache.cpp:57
static size_t num_instances
Definition: chancache.h:70
bool inoverflow
Definition: chancache.h:82
MonitorCacheEntry::pvrequest_t pvrequest_t
Definition: chancache.h:125
std::tr1::shared_ptr< Monitor > MonitorPtr
Definition: monitor.h:44
size_t ndropped
Definition: chancache.h:85
std::deque< epics::pvData::MonitorElementPtr > filled
Definition: chancache.h:87
std::set< epics::pvData::MonitorElementPtr > inuse
Definition: chancache.h:88