void SessionSummaryThr::run() { if ( mysqlpp::get_library_version() != MYSQLPP_HEADER_VERSION ) { cerr<< "Library/header version number mismatch" << endl; return; }; MyNode mynode(mpSession); //mynode.prevshotnum = startshot; SEVCHK(ca_context_create(ca_disable_preemptive_callback),"ca_context_create"); SEVCHK(ca_add_exception_event(exceptionCallback,NULL), "ca_add_exception_event"); //string pvnames[]={"CCS_SHOT_NUMBER","CCS_PERFORM_SHOT_SUMMARY"}; //Test.. //SEVCHK(ca_create_channel("DDS2_getState",connectionCallback, // &mynode,10,(oldChannelNotify**)&mynode.summary_chid), "ca_create_channel"); SEVCHK(ca_create_channel("CCS_PERFORM_SHOT_SUMMARY",connectionCallback, &mynode,10,(oldChannelNotify**)&mynode.summary_chid), "ca_create_channel"); SEVCHK(ca_replace_access_rights_event(mynode.summary_chid, accessRightsCallback), "ca_replace_access_rights_event"); ca_create_subscription (DBR_TIME_LONG, 0, mynode.summary_chid, DBE_VALUE|DBE_ALARM, eventCallback, (void*)&mynode, NULL); /*Should never return from following call*/ SEVCHK(ca_pend_event(0.0),"ca_pend_event"); }
SinglePlotThread::SinglePlotThread(const QString &pvname, SinglePlot *plot, const int periodic):m_pvname(pvname), m_plot(plot), mperiodic(periodic) { //ca_context_create(ca_enable_preemptive_callback); //ca_context_create(ca_disable_preemptive_callback); ca_add_exception_event(exceptionCallback,NULL); setStop(false); //start(); }
ChannelAccessThr::ChannelAccessThr(VecChacc &vecchacc, AttachChannelAccess *pattach, QObject *parent):QThread(parent),m_pattach(pattach) { register_chacc = vecchacc; ca_context_create(ca_disable_preemptive_callback); ca_add_exception_event(exceptionCallback,NULL); start(); mstop = false; mbclearev = false; mbaddev = false; }
int medmCAInitialize() { int status; /* * add CA's fd to X */ status = ca_add_fd_registration(medmCAFdRegistrationCb,NULL); if(status != ECA_NORMAL) return status; status = ca_add_exception_event(medmCAExceptionHandlerCb, NULL); if(status != ECA_NORMAL) return status; status = caTaskInit(); return status; }
static void exCB(struct exception_handler_args args) { #define MAX_EXCEPTIONS 25 static int nexceptions=0; static int ended=0; if(ended) return; if(nexceptions++ > MAX_EXCEPTIONS) { ended=1; fprintf(stderr,"exCB Exception: Channel Access Exception:\n" "Too many exceptions [%d]\n" "No more will be handled\n" "Please fix the problem and restart camonitorpv", MAX_EXCEPTIONS); ca_add_exception_event(NULL, NULL); return; } fprintf(stderr,"exCB Exception: Channel Access Exception:\n" " Channel Name: %s\n" " Native Type: %s\n" " Native Count: %lu\n" " Access: %s%s\n" " IOC: %s\n" " Message: %s\n" " Context: %s\n" " Requested Type: %s\n" " Requested Count: %ld\n" " Source File: %s\n" " Line number: %u", args.chid?ca_name(args.chid):"Unavailable", args.chid?dbf_type_to_text(ca_field_type(args.chid)):"Unavailable", args.chid?ca_element_count(args.chid):0, args.chid?(ca_read_access(args.chid)?"R":""):"Unavailable", args.chid?(ca_write_access(args.chid)?"W":""):"", args.chid?ca_host_name(args.chid):"Unavailable", ca_message(args.stat)?ca_message(args.stat):"Unavailable", args.ctx?args.ctx:"Unavailable", dbf_type_to_text(args.type), args.count, args.pFile?args.pFile:"Unavailable", args.pFile?args.lineNo:0); }
int main(int argc, char** argv) { fd_set rfds; int tot; struct timeval tv; if(argc!=3) { fprintf(stderr,"Usage: %s PV_to_monitor script_to_run\n\n",argv[0]); fprintf(stderr,"This program monitored PV PV_to_monitor and\n"); fprintf(stderr,"runs and executes script_to_run, which can be\n"); fprintf(stderr,"any program or executable script.\n"); fprintf(stderr,"The script or program gets invoked with the first\n"); fprintf(stderr,"argument as the PV name and the second argument\n"); fprintf(stderr,"as the value of the PV\n"); fprintf(stderr,"The program or shell script script_to_run is\n"); fprintf(stderr,"run as a separate child process of this program\n"); fprintf(stderr,"This means that your script or program will not\n"); fprintf(stderr,"stop this process from running, if fact your\n"); fprintf(stderr,"script or program can be invoked many times if\n"); fprintf(stderr,"the value of the PV is changing rapidly and\n"); fprintf(stderr,"several instances of your program could be running\n"); fprintf(stderr,"simultaneously.\n"); return -1; } strcpy(pv_name,argv[1]); script_name=argv[2]; pv_value[0]='\0'; if(access(script_name,X_OK)<0) { fprintf(stderr,"Script %s not found or not executable\n",script_name); return -1; } signal(SIGINT,sig_func); signal(SIGQUIT,sig_func); signal(SIGTERM,sig_func); signal(SIGHUP,sig_func); signal(SIGCHLD,sig_chld); FD_ZERO(&all_fds); SEVCHK(ca_task_initialize(),"task initialize"); SEVCHK(ca_add_fd_registration(fdCB,&all_fds),"add fd registration"); SEVCHK(ca_add_exception_event(exCB,NULL),"add exception event"); SEVCHK(ca_search_and_connect(pv_name,&id,conCB,NULL), "search and connect"); SEVCHK(ca_replace_access_rights_event(id,accCB), "replace access rights event"); /* SEVCHK(ca_add_event(DBR_TIME_STRING,data.id,evCB,&data,&data.event), "add event"); */ ca_pend_event(REALLY_SMALL); /* fprintf(stderr,"Monitoring <%s>\n",pv_name); */ while(do_not_exit) { rfds=all_fds; tv.tv_sec=1; tv.tv_usec=0; /*200000*/; switch(tot=select(FD_SETSIZE,&rfds,NULL,NULL,&tv)) { /* case -1: perror("select error - bad"); break; */ case 0: ca_pend_event(REALLY_SMALL); break; default: /* fprintf(stderr,"select data ready\n"); */ ca_pend_event(REALLY_SMALL); break; } } fprintf(stderr,"PV monitor program is exiting!\n"); ca_task_exit(); return 0; }
static void dbCaTask(void *arg) { taskwdInsert(0, NULL, NULL); SEVCHK(ca_context_create(ca_enable_preemptive_callback), "dbCaTask calling ca_context_create"); dbCaClientContext = ca_current_context (); SEVCHK(ca_add_exception_event(exceptionCallback,NULL), "ca_add_exception_event"); epicsEventSignal(startStopEvent); /* channel access event loop */ while (TRUE){ do { epicsEventMustWait(workListEvent); } while (dbCaCtl == ctlPause); while (TRUE) { /* process all requests in workList*/ caLink *pca; short link_action; int status; epicsMutexMustLock(workListLock); if (!(pca = (caLink *)ellGet(&workList))){ /* Take off list head */ epicsMutexUnlock(workListLock); if (dbCaCtl == ctlExit) goto shutdown; break; /* workList is empty */ } link_action = pca->link_action; pca->link_action = 0; if (link_action & CA_CLEAR_CHANNEL) --removesOutstanding; epicsMutexUnlock(workListLock); /* Give back immediately */ if (link_action & CA_CLEAR_CHANNEL) { /* This must be first */ dbCaLinkFree(pca); /* No alarm is raised. Since link is changing so what? */ continue; /* No other link_action makes sense */ } if (link_action & CA_CONNECT) { status = ca_create_channel( pca->pvname,connectionCallback,(void *)pca, CA_PRIORITY_DB_LINKS, &(pca->chid)); if (status != ECA_NORMAL) { errlogPrintf("dbCaTask ca_create_channel %s\n", ca_message(status)); printLinks(pca); continue; } dbca_chan_count++; status = ca_replace_access_rights_event(pca->chid, accessRightsCallback); if (status != ECA_NORMAL) { errlogPrintf("dbCaTask replace_access_rights_event %s\n", ca_message(status)); printLinks(pca); } continue; /*Other options must wait until connect*/ } if (ca_state(pca->chid) != cs_conn) continue; if (link_action & CA_WRITE_NATIVE) { assert(pca->pputNative); if (pca->putType == CA_PUT) { status = ca_array_put( pca->dbrType, pca->nelements, pca->chid, pca->pputNative); } else if (pca->putType==CA_PUT_CALLBACK) { status = ca_array_put_callback( pca->dbrType, pca->nelements, pca->chid, pca->pputNative, putCallback, pca); } else { status = ECA_PUTFAIL; } if (status != ECA_NORMAL) { errlogPrintf("dbCaTask ca_array_put %s\n", ca_message(status)); printLinks(pca); } epicsMutexMustLock(pca->lock); if (status == ECA_NORMAL) pca->newOutNative = FALSE; epicsMutexUnlock(pca->lock); } if (link_action & CA_WRITE_STRING) { assert(pca->pputString); if (pca->putType == CA_PUT) { status = ca_array_put( DBR_STRING, 1, pca->chid, pca->pputString); } else if (pca->putType==CA_PUT_CALLBACK) { status = ca_array_put_callback( DBR_STRING, 1, pca->chid, pca->pputString, putCallback, pca); } else { status = ECA_PUTFAIL; } if (status != ECA_NORMAL) { errlogPrintf("dbCaTask ca_array_put %s\n", ca_message(status)); printLinks(pca); } epicsMutexMustLock(pca->lock); if (status == ECA_NORMAL) pca->newOutString = FALSE; epicsMutexUnlock(pca->lock); } /*CA_GET_ATTRIBUTES before CA_MONITOR so that attributes available * before the first monitor callback */ if (link_action & CA_GET_ATTRIBUTES) { status = ca_get_callback(DBR_CTRL_DOUBLE, pca->chid, getAttribEventCallback, pca); if (status != ECA_NORMAL) { errlogPrintf("dbCaTask ca_get_callback %s\n", ca_message(status)); printLinks(pca); } } if (link_action & CA_MONITOR_NATIVE) { size_t element_size; element_size = dbr_value_size[ca_field_type(pca->chid)]; epicsMutexMustLock(pca->lock); pca->pgetNative = dbCalloc(pca->nelements, element_size); epicsMutexUnlock(pca->lock); status = ca_add_array_event( ca_field_type(pca->chid)+DBR_TIME_STRING, ca_element_count(pca->chid), pca->chid, eventCallback, pca, 0.0, 0.0, 0.0, 0); if (status != ECA_NORMAL) { errlogPrintf("dbCaTask ca_add_array_event %s\n", ca_message(status)); printLinks(pca); } } if (link_action & CA_MONITOR_STRING) { epicsMutexMustLock(pca->lock); pca->pgetString = dbCalloc(1, MAX_STRING_SIZE); epicsMutexUnlock(pca->lock); status = ca_add_array_event(DBR_TIME_STRING, 1, pca->chid, eventCallback, pca, 0.0, 0.0, 0.0, 0); if (status != ECA_NORMAL) { errlogPrintf("dbCaTask ca_add_array_event %s\n", ca_message(status)); printLinks(pca); } } } SEVCHK(ca_flush_io(), "dbCaTask"); } shutdown: taskwdRemove(0); if (dbca_chan_count == 0) ca_context_destroy(); else fprintf(stderr, "dbCa: chan_count = %d at shutdown\n", dbca_chan_count); epicsEventSignal(startStopEvent); }