13 #define epicsExportSharedSymbols 18 #if defined(PVDATA_VERSION_INT) 19 #if PVDATA_VERSION_INT > VERSION_INT(7,0,0,0) 27 std::tr1::shared_ptr<pva::ChannelProvider>
30 return shared_from_this();
35 pva::ChannelFind::shared_pointer
37 pva::ChannelFindRequester::shared_pointer
const & channelFindRequester)
39 pva::ChannelFind::shared_pointer ret;
42 if(!channelName.empty())
45 ChannelCacheEntry::shared_pointer ent(
cache.
lookup(channelName));
48 ret = shared_from_this();
61 pva::Channel::shared_pointer
63 pva::ChannelRequester::shared_pointer
const & channelRequester,
64 short priority, std::string
const & addressx)
66 GWChannel::shared_pointer ret;
67 std::string address = channelRequester->getRequesterName();
69 if(!channelName.empty())
73 ChannelCacheEntry::shared_pointer ent(
cache.
lookup(channelName));
77 ret.reset(
new GWChannel(ent, shared_from_this(), channelRequester, address));
78 ent->interested.insert(ret);
85 channelRequester->channelCreated(S, ret);
112 if(client[0]!=
'\0' && client[0]!=
'*' && it->first!=client)
115 const GWServerChannelProvider::shared_pointer& prov(it->second);
117 ChannelCacheEntry::shared_pointer
entry;
121 Guard G(prov->cache.cacheLock);
123 ChannelCache::entries_t::iterator it = prov->cache.entries.find(channel);
124 if(it==prov->cache.entries.end())
127 std::cout<<
"Drop from "<<it->first<<
" : "<<it->second->channelName<<
"\n";
130 prov->cache.entries.erase(it);
135 entry->channel->destroy();
147 if(server[0]!=
'\0' && server[0]!=
'*' && it->first!=server)
150 const pva::ServerContext::shared_pointer& serv(it->second);
151 std::cout<<
"==> Server: "<<it->first<<
"\n";
152 serv->printInfo(std::cout);
153 std::cout<<
"<== Server: "<<it->first<<
"\n\n";
165 bool iswild = strchr(channel,
'?') || strchr(channel,
'*');
169 if(client[0]!=
'\0' && client[0]!=
'*' && it->first!=client)
172 const GWServerChannelProvider::shared_pointer& prov(it->second);
174 std::cout<<
"==> Client: "<<it->first<<
"\n";
178 size_t ncache, ncleaned, ndust;
180 Guard G(prov->cache.cacheLock);
182 ncache = prov->cache.entries.size();
183 ncleaned = prov->cache.cleanerRuns;
184 ndust = prov->cache.cleanerDust;
188 entries = prov->cache.entries;
190 ChannelCache::entries_t::iterator it(prov->cache.entries.find(channel));
191 if(it!=prov->cache.entries.end())
192 entries[it->first] = it->second;
197 std::cout<<
"Cache has "<<ncache<<
" channels. Cleaned " 198 <<ncleaned<<
" times closing "<<ndust<<
" channels\n";
203 FOREACH(ChannelCache::entries_t::const_iterator, it2, end2, entries)
205 const std::string& channame = it2->first;
226 <<
" Client Channel '"<<channame
227 <<
"' used by "<<nsrv<<
" Server channel(s) with " 228 <<nmon<<
" unique subscription(s) " 229 <<(dropflag?
'!':
'_')<<
"\n";
234 FOREACH(ChannelCacheEntry::mon_entries_t::lock_vector_type::const_iterator, it2, end2, mons) {
240 pvd::Monitor::Stats mstats;
242 bool hastype, hasdata, isdone;
253 ME.
mon->getStats(mstats);
261 std::cout<<
" Client Monitor used by "<<nsrvmon<<
" Server monitors, " 262 <<
"Has "<<(hastype?
"":
"not ")
263 <<
"opened, Has "<<(hasdata?
"":
"not ")
264 <<
"recv'd some data, Has "<<(isdone?
"":
"not ")<<
"finalized\n" 268 if(mstats.nempty || mstats.nfilled || mstats.noutstanding)
269 std::cout<<
" US monitor queue "<<mstats.nfilled
270 <<
" filled, "<<mstats.noutstanding
271 <<
" outstanding, "<<mstats.nempty<<
" empty\n";
276 FOREACH(MonitorCacheEntry::interested_t::vector_type::const_iterator, it3, end3, usrs) {
279 size_t nempty, nfilled, nused, total;
285 nempty = MU.
empty.size();
286 nfilled = MU.
filled.size();
287 nused = MU.
inuse.size();
290 GWChannel::shared_pointer srvchan(MU.
srvchan.lock());
292 remote = srvchan->address;
294 remote =
"<unknown>";
296 total = nempty + nfilled + nused;
298 std::cout<<
" Server monitor from " 300 <<(isrunning?
"":
" Paused")
301 <<
" buffer "<<nfilled<<
"/"<<total
302 <<
" out "<<nused<<
"/"<<total
314 std::cout<<
"<== Client: "<<it->first<<
"\n\n";
epicsMutex & mutex() const
epics::pvData::MonitorPtr mon
epics::pvAccess::Channel::shared_pointer channel
mon_entries_t mon_entries
#define FOREACH(ITERTYPE, IT, END, C)
epicsMutex & mutex() const
virtual epics::pvAccess::Channel::shared_pointer createChannel(std::string const &channelName, epics::pvAccess::ChannelRequester::shared_pointer const &channelRequester, short priority, std::string const &addressx)
std::deque< epics::pvData::MonitorElementPtr > empty
int epicsStrGlobMatch(const char *str, const char *pattern)
virtual ~GWServerChannelProvider()
EPICS_ATOMIC_INLINE size_t epicsAtomicGetSizeT(const size_t *pTarget)
lock_vector_type lock_vector() const
void status_client(int lvl, const char *client, const char *channel)
std::vector< std::pair< pvrequest_t, value_pointer > > lock_vector_type
std::tr1::weak_ptr< GWChannel > srvchan
#define LOG(level, format,...)
GWServerChannelProvider(const epics::pvAccess::ChannelProvider::shared_pointer &prov)
epics::pvData::StructureConstPtr typedesc
static const char * ConnectionStateNames[]
vector_type lock_vector() const
ChannelProviderRegistry::shared_pointer clients
std::map< std::string, ChannelCacheEntry::shared_pointer > entries_t
ChannelCacheEntry::shared_pointer lookup(const std::string &name)
std::vector< value_pointer > vector_type
void drop(const char *client, const char *channel)
epicsMutex & mutex() const
void status_server(int lvl, const char *server)
epics::pvData::MonitorElement::shared_pointer lastelem
virtual std::tr1::shared_ptr< ChannelProvider > getChannelProvider()
virtual epics::pvAccess::ChannelFind::shared_pointer channelFind(std::string const &channelName, epics::pvAccess::ChannelFindRequester::shared_pointer const &channelFindRequester)
std::deque< epics::pvData::MonitorElementPtr > filled
std::set< epics::pvData::MonitorElementPtr > inuse