5 #define EPICS_DBCA_PRIVATE_API 44 static void shutdownStep1()
54 static void shutdownStep2()
61 fprintf(
stderr,
"pvaLink leaves %zu channels open\n",
70 static void stopPVAPool(
void*)
74 }
catch(std::exception& e){
75 fprintf(
stderr,
"Error while stopping PVA link pool : %s\n", e.what());
79 static void finalizePVA(
void*)
83 }
catch(std::exception& e){
84 fprintf(
stderr,
"Error initializing pva link handling : %s\n", e.what());
109 cantProceed(
"# Missing call to testqsrvShutdownOk() and/or testqsrvCleanup()");
113 if(!atexitInstalled) {
115 atexitInstalled =
true;
135 std::tr1::shared_ptr<pvaLinkChannel> chan(it->second.lock());
141 }
catch(std::exception& e){
142 cantProceed(
"Error initializing pva link handling : %s\n", e.what());
153 }
catch(std::exception& e){
154 testAbort(
"Error while stopping PVA link pool : %s\n", e.what());
162 }
catch(std::exception& e){
163 testAbort(
"Error initializing pva link handling : %s\n", e.what());
169 std::tr1::shared_ptr<pvaLinkChannel> lchan;
180 lchan->run_done.wait();
185 void dbpvar(
const char *precordname,
int level)
189 printf(
"PVA links not initialized\n");
193 if (!precordname || precordname[0] ==
'\0' || !strcmp(precordname,
"*")) {
195 printf(
"PVA links in all records\n\n");
197 printf(
"PVA links in record named '%s'\n\n", precordname);
200 size_t nchans = 0, nlinks = 0, nconn = 0;
208 for(pvaGlobal_t::channels_t::const_iterator it(channels.begin()), end(channels.end());
211 std::tr1::shared_ptr<pvaLinkChannel> chan(it->second.lock());
219 for(pvaLinkChannel::links_t::const_iterator it2(chan->links.begin()), end2(chan->links.end());
234 if(chan->connected_latched)
238 nlinks += chan->links.size();
243 if(level>=2 || (!chan->connected_latched && level==1)) {
244 if(chan->key.first.size()<=28) {
245 printf(
"%28s ", chan->key.first.c_str());
247 printf(
"%s\t", chan->key.first.c_str());
250 printf(
"conn=%c %zu disconnects, %zu type changes",
251 chan->connected_latched?
'T':
'F',
252 chan->num_disconnect,
253 chan->num_type_change);
254 if(chan->op_put.valid()) {
259 printf(
", provider '%s'", chan->providerName.c_str());
265 for(pvaLinkChannel::links_t::const_iterator it2(chan->links.begin()), end2(chan->links.end());
275 const char *fldname =
"???";
300 printf(
" Q=%u pipe=%c defer=%c time=%c retry=%c morder=%d\n",
303 pval->
defer ?
'T' :
'F',
304 pval->
time ?
'T' :
'F',
305 pval->
retry ?
'T' :
'F',
313 printf(
" %zu/%zu channels connected used by %zu links\n",
314 nconn, nchans, nlinks);
316 }
catch(std::exception& e) {
317 fprintf(
stderr,
"Error: %s\n", e.what());
322 void installPVAAddLinkHook()
325 epics::iocshRegister<const char*, int, &dbpvar>(
"dbpvar",
"record name",
"level");
long dbFirstField(DBENTRY *pdbentry, int dctonly)
enum pvalink::pvaLinkConfig::pp_t pp
void dbpvar(const char *precordname, int level)
struct dbCommon * precord
epicsExportAddress(jlif, lsetPVA)
int epicsStrGlobMatch(const char *str, const char *pattern)
void testqsrvCleanup(void)
static size_t num_instances
enum pvalink::pvaLinkConfig::ms_t ms
void testqsrvWaitForLinkEvent(struct link *plink)
void testAbort(const char *fmt,...)
std::tr1::shared_ptr< pvaLinkChannel > lchan
pvac::ClientProvider provider_remote
long dbNextField(DBENTRY *pdbentry, int dctonly)
Extended replacement for the Posix exit and atexit routines.
void registerRefCounter(const char *name, const size_t *counter)
void testqsrvShutdownOk(void)
int initHookRegister(initHookFunction func)
static size_t num_instances
epicsExportRegistrar(installPVAAddLinkHook)
LIBCOM_API void cantProceed(const char *msg,...)
pvac::ClientProvider provider_local
QSRV_API int pvaLinkNWorkers
#define epicsAtExit(F, A)
Convenience macro to register a function and context value to be run when the process exits...
std::map< channels_key_t, std::tr1::weak_ptr< pvaLinkChannel > > channels_t