This is Unofficial EPICS BASE Doxygen Site
qsrv.cpp
Go to the documentation of this file.
1 
2 #include <initHooks.h>
3 #include <epicsExit.h>
4 #include <epicsThread.h>
5 #include <epicsString.h>
6 #include <epicsStdio.h>
7 
8 #include <dbAccess.h>
9 #include <dbChannel.h>
10 #include <dbStaticLib.h>
11 #include <dbLock.h>
12 #include <dbEvent.h>
13 #include <epicsVersion.h>
14 #include <dbNotify.h>
15 
16 #include <pv/reftrack.h>
17 #include <pv/pvAccess.h>
18 #include <pv/serverContext.h>
19 #include <pv/iocshelper.h>
20 
21 #include "pv/qsrv.h"
22 #include "pvahelper.h"
23 #include "pvif.h"
24 #include "pdb.h"
25 #include "pdbsingle.h"
26 #ifdef USE_MULTILOCK
27 # include "pdbgroup.h"
28 #endif
29 
30 #include <epicsExport.h>
31 
32 namespace pva = epics::pvAccess;
33 
35 {
40 #ifdef USE_MULTILOCK
45 #endif // USE_MULTILOCK
47 }
48 
49 namespace {
50 
51 void dbgl(int lvl, const char *pattern)
52 {
53  if(!pattern)
54  pattern = "";
55 
56  try {
57  PDBProvider::shared_pointer prov(
58  std::tr1::dynamic_pointer_cast<PDBProvider>(
59  pva::ChannelProviderRegistry::servers()->getProvider("QSRV")));
60  if(!prov)
61  throw std::runtime_error("No Provider (PVA server not running?)");
62 
64  {
65  epicsGuard<epicsMutex> G(prov->transient_pv_map.mutex());
66  pvs = prov->persist_pv_map; // copy map
67  }
68 
69  for(PDBProvider::persist_pv_map_t::const_iterator it(pvs.begin()), end(pvs.end());
70  it != end; ++it)
71  {
72  if(pattern[0] && epicsStrGlobMatch(it->first.c_str(), pattern)==0)
73  continue;
74 
75  printf("%s\n", it->first.c_str());
76  if(lvl<=0)
77  continue;
78  it->second->show(lvl);
79  }
80 
81  }catch(std::exception& e){
82  fprintf(stderr, "Error: %s\n", e.what());
83  }
84 }
85 
86 void QSRVRegistrar()
87 {
89  pva::ChannelProviderRegistry::servers()->addSingleton<PDBProvider>("QSRV");
90  epics::iocshRegister<int, const char*, &dbgl>("dbgl", "level", "pattern");
91 }
92 
93 } // namespace
94 
95 unsigned qsrvVersion(void)
96 {
97  return QSRV_VERSION_INT;
98 }
99 
100 unsigned qsrvABIVersion(void)
101 {
102  return QSRV_ABI_VERSION_INT;
103 }
104 
105 extern "C" {
106  epicsExportRegistrar(QSRVRegistrar);
107 }
static size_t num_instances
Definition: pdbsingle.h:121
static size_t num_instances
Definition: pdbgroup.h:146
static ChannelProviderRegistry::shared_pointer servers()
unsigned qsrvVersion(void)
Definition: qsrv.cpp:95
int epicsStrGlobMatch(const char *str, const char *pattern)
Definition: epicsString.c:279
#define printf
Definition: epicsStdio.h:41
unsigned qsrvABIVersion(void)
Definition: qsrv.cpp:100
static size_t num_instances
Definition: pdbgroup.h:179
static size_t num_instances
Definition: pdb.h:67
Holds all PVA related.
Definition: pvif.h:34
std::map< std::string, PDBPV::shared_pointer > persist_pv_map_t
Definition: pdb.h:59
static size_t num_instances
Definition: pdbsingle.h:86
Extended replacement for the Posix exit and atexit routines.
static size_t num_instances
Definition: pdbsingle.h:144
void registerRefCounter(const char *name, const size_t *counter)
Definition: reftrack.cpp:59
static size_t num_instances
Definition: pdbgroup.h:119
static size_t num_instances
Definition: pdbsingle.h:58
void QSRVRegistrar_counters()
Definition: qsrv.cpp:34
#define QSRV_VERSION_INT
Definition: qsrv.h:13
#define stderr
Definition: epicsStdio.h:32
C++ and C descriptions for a thread.
static size_t num_instances
Definition: pdbgroup.h:204
#define QSRV_ABI_VERSION_INT
Definition: qsrv.h:15
epicsExportRegistrar(QSRVRegistrar)
Exporting IOC objects.