From ee9fca1dc3b52d0599b7ff34afb53dcf032f5b16 Mon Sep 17 00:00:00 2001 From: Mark Rivers Date: Sat, 8 Sep 2018 12:44:59 -0500 Subject: [PATCH] Fixes for problems that showed up in base 7.0. - It was using the value of mr->[link]->value.constantStr and mr->[link]->value.pv_link.pvname without checking the link types. This was incorrect, and led to errors because constantStr no longer has a defined value if the link type is not CONSTANT. Changed so that it only accesses these union fields if the link is the correct type. - It did not check if pv_link.pvname was NULL before calling CA functions, though now that we check the link type perhaps this cannot occur. - It did not lock the motor record before accessing the fields. - Added Debug calls to show the link types and values. --- motorApp/SoftMotorSrc/devSoftAux.cc | 46 +++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/motorApp/SoftMotorSrc/devSoftAux.cc b/motorApp/SoftMotorSrc/devSoftAux.cc index d2fcdae1..b70edb83 100644 --- a/motorApp/SoftMotorSrc/devSoftAux.cc +++ b/motorApp/SoftMotorSrc/devSoftAux.cc @@ -41,6 +41,7 @@ in the same file; each defines (redefines) the DBR's. #include #include #include +#include #include #include @@ -50,6 +51,20 @@ in the same file; each defines (redefines) the DBR's. #define STATIC static +extern volatile int devSoftdebug; +static inline void Debug(int level, const char *format, ...) +{ +#ifdef DEBUG + if (level < devSoftdebug) + { + va_list pVar; + va_start(pVar, format); + vprintf(format, pVar); + va_end(pVar); + } +#endif +} + STATIC void soft_dinp(struct event_handler_args); STATIC void soft_rdbl(struct event_handler_args); STATIC void soft_rinp(struct event_handler_args); @@ -161,32 +176,51 @@ STATIC EPICSTHREADFUNC soft_motor_task(void *parm) mr = node->pmr; free(node); + dbScanLock((dbCommon *)mr); ptr = (struct soft_private *) mr->dpvt; - if (mr->dinp.value.constantStr == NULL) - ptr->default_done_behavior = true; - else + Debug(5, "devSoftAux::soft_motor_task: motor %s link type=%d\n", mr->name, mr->dinp.type); + Debug(5, "devSoftAux::soft_motor_task: motor %s constantStr=%s dinp link=%s\n", mr->name, mr->dinp.value.constantStr, mr->dinp.value.pv_link.pvname); + if (((mr->dinp.type == PV_LINK) || + (mr->dinp.type == CA_LINK) || + (mr->dinp.type == DB_LINK)) && + (mr->dinp.value.pv_link.pvname != NULL)) { ptr->default_done_behavior = false; + Debug(5, "devSoftAux::soft_motor_task: adding dinp link for motor %s link=%s\n", mr->name, mr->dinp.value.pv_link.pvname); SEVCHK(ca_search(mr->dinp.value.pv_link.pvname, &dinp), "ca_search() failure"); SEVCHK(ca_add_event(DBR_SHORT, dinp, soft_dinp, mr, NULL),"ca_add_event() failure"); SEVCHK(ca_pend_io((float) 5.0), "DINP link failure"); } - - if (mr->urip != 0) + else { + ptr->default_done_behavior = true; + } + + if ((mr->urip != 0) && + ((mr->rdbl.type == PV_LINK) || + (mr->rdbl.type == CA_LINK) || + (mr->rdbl.type == DB_LINK)) && + (mr->rdbl.value.pv_link.pvname != NULL)) + { + Debug(5, "devSoftAux::soft_motor_task: adding rdbl link for motor %s link=%s\n", mr->name, mr->rdbl.value.pv_link.pvname); SEVCHK(ca_search(mr->rdbl.value.pv_link.pvname, &rdbl),"ca_search() failure"); SEVCHK(ca_add_event(DBR_DOUBLE, rdbl, soft_rdbl, mr, NULL),"ca_add_event() failure"); SEVCHK(ca_pend_io((float) 5.0), "RDBL link failure"); } - if (mr->rinp.value.constantStr != NULL) + if (((mr->rinp.type == PV_LINK) || + (mr->rinp.type == CA_LINK) || + (mr->rinp.type == DB_LINK)) && + (mr->rinp.value.pv_link.pvname != NULL)) { + Debug(5, "devSoftAux::soft_motor_task: adding rinp link for motor %s link=%s\n", mr->name, mr->rinp.value.pv_link.pvname); SEVCHK(ca_search(mr->rinp.value.pv_link.pvname, &rinp),"ca_search() failure"); SEVCHK(ca_add_event(DBR_LONG, rinp, soft_rinp, mr, NULL),"ca_add_event() failure"); SEVCHK(ca_pend_io((float) 5.0), "RINP link failure"); } + dbScanUnlock((dbCommon *)mr); } ellFree(&soft_motor_list);