From d2ee1e07dba5b12577c3a8bd745ff8bd575289b2 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 22 Nov 2017 14:55:38 -0600 Subject: [PATCH] pdb: add 'dbgl' iocsh command --- pdbApp/pdb.cpp | 22 ++++++++++++++++++++++ pdbApp/pdb.h | 3 +++ pdbApp/pdbgroup.cpp | 23 +++++++++++++++++++++++ pdbApp/pdbgroup.h | 4 +++- pdbApp/pvif.h | 3 +++ pdbApp/qsrv.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 96 insertions(+), 2 deletions(-) diff --git a/pdbApp/pdb.cpp b/pdbApp/pdb.cpp index 623a3db..dfbb7c5 100644 --- a/pdbApp/pdb.cpp +++ b/pdbApp/pdb.cpp @@ -718,6 +718,28 @@ FieldName::lookup(const epics::pvData::PVStructurePtr& S, epics::pvData::PVField return ret; } +void FieldName::show() const +{ + if(parts.empty()) { + printf("/"); + return; + } + + bool first = true; + for(size_t i=0, N=parts.size(); i& prov, const epics::pvAccess::ChannelRequester::shared_pointer& req) =0; + + // print info to stdout (with iocsh redirection) + virtual void show(int lvl) {} }; struct epicsShareClass PDBProvider : public epics::pvAccess::ChannelProvider, diff --git a/pdbApp/pdbgroup.cpp b/pdbApp/pdbgroup.cpp index 9f14892..75efc50 100644 --- a/pdbApp/pdbgroup.cpp +++ b/pdbApp/pdbgroup.cpp @@ -1,6 +1,9 @@ #include +// rediect stdio/stderr for iocsh +#include + #include #include @@ -217,6 +220,26 @@ void PDBGroupPV::finalizeMonitor() } } +void PDBGroupPV::show(int lvl) +{ + // no locking as we only print things which are const after initialization + + printf(" Atomic Get/Put:%s Monitor:%s Members:%zu\n", + pgatomic?"yes":"no", monatomic?"yes":"no", members.size()); + + if(lvl<=1) + return; + + for(members_t::const_iterator it(members.begin()), end(members.end()); + it != end; ++it) + { + const Info& info = *it; + printf(" "); + info.attachment.show(); // printf()s + printf("\t<-> %s\n", dbChannelName(info.chan)); + } +} + PDBGroupChannel::PDBGroupChannel(const PDBGroupPV::shared_pointer& pv, const std::tr1::shared_ptr& prov, diff --git a/pdbApp/pdbgroup.h b/pdbApp/pdbgroup.h index 249511a..1c6be6e 100644 --- a/pdbApp/pdbgroup.h +++ b/pdbApp/pdbgroup.h @@ -124,11 +124,13 @@ struct epicsShareClass PDBGroupPV : public PDBPV virtual epics::pvAccess::Channel::shared_pointer connect(const std::tr1::shared_ptr& prov, - const epics::pvAccess::ChannelRequester::shared_pointer& req); + const epics::pvAccess::ChannelRequester::shared_pointer& req) OVERRIDE; void addMonitor(PDBGroupMonitor*); void removeMonitor(PDBGroupMonitor*); void finalizeMonitor(); + + virtual void show(int lvl) OVERRIDE; }; struct epicsShareClass PDBGroupChannel : public BaseChannel, diff --git a/pdbApp/pvif.h b/pdbApp/pvif.h index b8b47ef..328dc0f 100644 --- a/pdbApp/pvif.h +++ b/pdbApp/pvif.h @@ -56,7 +56,9 @@ struct epicsShareClass DBCH { void swap(DBCH&); operator dbChannel*() { return chan; } + operator const dbChannel*() const { return chan; } dbChannel *operator->() { return chan; } + const dbChannel *operator->() const { return chan; } private: DBCH(const DBCH&); DBCH& operator=(const DBCH&); @@ -287,6 +289,7 @@ struct epicsShareClass FieldName epics::pvData::PVFieldPtr lookup(const epics::pvData::PVStructurePtr& S, epics::pvData::PVField** ppenclose) const; + void show() const; private: FieldName(const FieldName&); FieldName& operator=(const FieldName&); diff --git a/pdbApp/qsrv.cpp b/pdbApp/qsrv.cpp index ee35ee0..da2b026 100644 --- a/pdbApp/qsrv.cpp +++ b/pdbApp/qsrv.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include @@ -43,13 +45,52 @@ void QSRVRegistrar_counters() epics::registerRefCounter("PDBProvider", &PDBProvider::num_instances); } -static +namespace { + +void dbgl(int lvl, const char *pattern) +{ + if(!pattern) + pattern = ""; + + try { + PDBProvider::shared_pointer prov( + std::tr1::dynamic_pointer_cast( + pva::ChannelProviderRegistry::servers()->getProvider("QSRV"))); + if(!prov) + throw std::runtime_error("No Provider (PVA server not running?)"); + + PDBProvider::persist_pv_map_t pvs; + { + epicsGuard G(prov->transient_pv_map.mutex()); + pvs = prov->persist_pv_map; // copy map + } + + for(PDBProvider::persist_pv_map_t::const_iterator it(pvs.begin()), end(pvs.end()); + it != end; ++it) + { + if(pattern[0] && epicsStrGlobMatch(it->first.c_str(), pattern)==0) + continue; + + printf("%s\n", it->first.c_str()); + if(lvl<=0) + continue; + it->second->show(lvl); + } + + }catch(std::exception& e){ + fprintf(stderr, "Error: %s\n", e.what()); + } +} + void QSRVRegistrar() { QSRVRegistrar_counters(); pva::ChannelProviderRegistry::servers()->addSingleton("QSRV"); + epics::iocshRegister("dbgl", "level", "pattern"); } +} // namespace + extern "C" { epicsExportRegistrar(QSRVRegistrar); }