From 4e83896390ac153e0ef52c80378267778d10d5aa Mon Sep 17 00:00:00 2001 From: Peter Denison Date: Wed, 19 Sep 2007 15:57:41 +0000 Subject: [PATCH] Fix behaviour of motorUtil in the face of incorrect prefix. Now does not call ca_task_exit() unless it is ending the task. Do not use epicsThreadSuspendSelf(), but instead wait on an event, in soft_motor_task() and motorUtil_task(), to avoid suspended threads. --- motorApp/MotorSrc/motorSupport.dbd | 1 + motorApp/MotorSrc/motorUtil.cc | 41 +++++++++++++++++++++++------ motorApp/SoftMotorSrc/devSoftAux.cc | 13 ++++++--- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/motorApp/MotorSrc/motorSupport.dbd b/motorApp/MotorSrc/motorSupport.dbd index 494e5e68..b8bc7d3b 100644 --- a/motorApp/MotorSrc/motorSupport.dbd +++ b/motorApp/MotorSrc/motorSupport.dbd @@ -2,6 +2,7 @@ include motorRecord.dbd registrar(motorUtilRegister) #variable(motorRecordDebug) #variable(motordrvComdebug) +#variable(motorUtil_debug) registrar(motorRegister) device(motor,INST_IO,devMotorAsyn,"asynMotor") diff --git a/motorApp/MotorSrc/motorUtil.cc b/motorApp/MotorSrc/motorUtil.cc index 3d005dac..9c106149 100644 --- a/motorApp/MotorSrc/motorUtil.cc +++ b/motorApp/MotorSrc/motorUtil.cc @@ -2,9 +2,9 @@ FILENAME... motorUtil.cc USAGE... Motor Record Utility Support. -Version: $Revision: 1.3 $ -Modified By: $Author: sluiter $ -Last Modified: $Date: 2007-05-10 20:14:21 $ +Version: $Revision: 1.4 $ +Modified By: $Author: peterd $ +Last Modified: $Date: 2007-09-19 15:57:41 $ */ @@ -117,6 +117,7 @@ static int motorUtil_task(void *arg) { char temp[PVNAME_STRINGSZ+5]; int itera, status; + epicsEventId wait_forever; SEVCHK(ca_context_create(ca_enable_preemptive_callback), "motorUtil: ca_context_create() error"); @@ -140,6 +141,13 @@ static int motorUtil_task(void *arg) strcat(temp, "alldone.VAL"); chid_alldone = getChID(temp); + if (!chid_moving || !chid_alldone) { + errlogPrintf("Failed to connect to %smoving or %salldone.\n" + "Check prefix matches Db\n", vme, vme); + ca_task_exit(); + return ERROR; + } + /* loop over motors in motorlist and fill in motorArray */ for (itera=0; itera < numMotors; itera++) { @@ -162,10 +170,20 @@ static int motorUtil_task(void *arg) strcpy(temp, vme); strcat(temp, "allstop.VAL"); chid_allstop = getChID(temp); - status = pvMonitor(0, chid_allstop, -1); + if (!chid_allstop) { + errlogPrintf("Failed to connect to %sallstop\n",vme); + } else { + status = pvMonitor(0, chid_allstop, -1); + } } - epicsThreadSuspendSelf(); /* Wait Forever */ + /* Wait on a (never signalled) event here, rather than suspending the + thread, so as not to show up in the thread list as "SUSPENDED", which + is usually a sign of a fault. */ + wait_forever = epicsEventCreate(epicsEventEmpty); + if (wait_forever) { + epicsEventMustWait(wait_forever); + } return(ERROR); } @@ -175,15 +193,21 @@ static chid getChID(char *PVname) chid channelID = 0; int status; + if (motorUtil_debug) + errlogPrintf("getChID(%s)\n", PVname); + /* In R3.14 ca_create_channel() will replace ca_search_and_connect() */ status = ca_search_and_connect(PVname, &channelID, 0, 0); - status = ca_pend_io(TIMEOUT); + if (status == ECA_NORMAL) + { + status = ca_pend_io(TIMEOUT); + } if (status != ECA_NORMAL) { SEVCHK(status, "ca_search_and_connect"); - ca_task_exit(); /* this is serious */ - errlogPrintf("(motorUtil_A.c) getChID error: %i\n", status); + errlogPrintf("motorUtil.cc: getChID(%s) error: %i\n", PVname, status); + channelID = 0; } return channelID; } @@ -378,6 +402,7 @@ static void motorUtilRegister(void) } epicsExportRegistrar(motorUtilRegister); +epicsExportAddress(int, motorUtil_debug); } // extern "C" diff --git a/motorApp/SoftMotorSrc/devSoftAux.cc b/motorApp/SoftMotorSrc/devSoftAux.cc index 99b4fef9..a4b59ec6 100644 --- a/motorApp/SoftMotorSrc/devSoftAux.cc +++ b/motorApp/SoftMotorSrc/devSoftAux.cc @@ -2,9 +2,9 @@ FILENAME... devSoftAux.cc USAGE... Motor record device level support for Soft channel. -Version: $Revision: 1.10 $ +Version: $Revision: 1.11 $ Modified By: $Author: peterd $ -Last Modified: $Date: 2006-04-11 10:11:24 $ +Last Modified: $Date: 2007-09-19 15:57:41 $ */ /* @@ -154,6 +154,7 @@ STATIC EPICSTHREADFUNC soft_motor_task(void *parm) struct motorRecord *mr; struct motor_node *node; chid dinp, rdbl, rinp; + epicsEventId wait_forever; epicsEventWait(soft_motor_sem); /* Wait for dbLockInitRecords() to execute. */ SEVCHK(ca_context_create(ca_enable_preemptive_callback), @@ -196,7 +197,13 @@ STATIC EPICSTHREADFUNC soft_motor_task(void *parm) } ellFree(&soft_motor_list); - epicsThreadSuspendSelf(); /* Wait Forever. */ + /* Wait on a (never signalled) event here, rather than suspending the + thread, so as not to show up in the thread list as "SUSPENDED", which + is usually a sign of a fault. */ + wait_forever = epicsEventCreate(epicsEventEmpty); + if (wait_forever) { + epicsEventMustWait(wait_forever); + } return(NULL); }