165 bool iswild = strchr(channel,
'?') || strchr(channel,
'*');
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
std::deque< epics::pvData::MonitorElementPtr > empty
int epicsStrGlobMatch(const char *str, const char *pattern)
EPICS_ATOMIC_INLINE size_t epicsAtomicGetSizeT(const size_t *pTarget)
lock_vector_type lock_vector() const
std::vector< std::pair< pvrequest_t, value_pointer > > lock_vector_type
std::tr1::weak_ptr< GWChannel > srvchan
epics::pvData::StructureConstPtr typedesc
static const char * ConnectionStateNames[]
vector_type lock_vector() const
std::map< std::string, ChannelCacheEntry::shared_pointer > entries_t
std::vector< value_pointer > vector_type
epicsMutex & mutex() const
epics::pvData::MonitorElement::shared_pointer lastelem
std::deque< epics::pvData::MonitorElementPtr > filled
std::set< epics::pvData::MonitorElementPtr > inuse