I have an asynPortDriver module I wrote that is currently running fine
on an a VME create running RTEMS on a MVME3100 board. Development and
testing was done on a Linux SIOC using EPICS version R.3.14.9 without
any problems (although it had to be removed from our base config for
that version because the 4.21 version of the asyn module used caused
problems for other modules).
I now have a project that will require the in-house module (and
asyn4-21 or later) to run on a a soft IOC running a newer version of
EPICS and I am having problems. In particular, the asynManager
appears to be getting a lock and never releasing it.
Current environment:
asyn version: 4.21
EPICS base version: 3.14.12.2
OS: 3.2.0-57-generic-pae #87-Ubuntu SMP Tue Nov 12 21:57:43 UTC
2013 i686 i686 i386 GNU/Linux
Below is a trace of the relevant portions of the IOC startup. I added
indentation to indicate the operations surrounded by locks. The
problem appears to be that asynManager never releases one of the
locks. The end result is (not too surprising) that the first attempt
to write a value to any of the records linked to the
asynPortDriver-based module after IOC initialization effectively locks
up the asyn driver.
Has anyone ever run in to this before? Any idea what could cause this?
#
#===== Setup for simulated FastCounter device (running on eowyn test
IOC)=====
drvAsynIPPortConfigure("simFCdev", "192.168.4.28:3333 udp", 0, 0, 1)
asynSetTraceMask("simFCdev", 0, 0xFF)
asynSetTraceIOMask("simFCdev", 0, 0xFF)
#===== initialize in-house asynPortDriver-derived module =====
devFastCounterConfig("simFC", "simFCdev", 1000)
=== devFastCounter::devFastCounter: 'simFC' connected to 'simFCdev' ===
asynSetTraceMask("simFC", 0, 0xff)
...
2014/01/13 11:16:14.015 simFC asynManager::queueLockPort locking port
2014/01/13 11:16:14.015 asynPortDriver:readInt32: function=5, value=0
2014/01/13 11:16:14.015 asynInt32SyncIO read: 0
2014/01/13 11:16:14.015 simFC queueUnlockPort
2014/01/13 11:16:14.015 asynPortDriver:drvUserCreate:
drvInfo=SEQS_PER_GROUP, index=4
2014/01/13 11:16:14.015 asynPortDriver:drvUserCreate:
drvInfo=SEQS_PER_GROUP, index=4
2014/01/13 11:16:14.015 simFC asynManager::queueLockPort locking port
2014/01/13 11:16:14.015 asynPortDriver:readInt32: function=4, value=10
2014/01/13 11:16:14.015 asynInt32SyncIO read: 10
2014/01/13 11:16:14.015 simFC queueUnlockPort
2014/01/13 11:16:14.015 asynPortDriver:drvUserCreate:
drvInfo=COUNT_TIMES, index=9
2014/01/13 11:16:14.015 asynPortDriver:drvUserCreate:
drvInfo=COUNT_VALUES, index=8
2014/01/13 11:16:14.015 simFC asynManager::queueLockPort locking
port(<--- never released)
2014/01/13 11:16:14.015 asynPortDriver:drvUserCreate:
drvInfo=ACQUIRE, index=0
2014/01/13 11:16:14.015 simFC -1 registerInterruptUser
2014/01/13 11:16:14.015 asynPortDriver:drvUserCreate:
drvInfo=ACQUIRE, index=0
2014/01/13 11:16:14.015 simFC asynManager::queueLockPort locking port
2014/01/13 11:16:14.015 asynPortDriver:readInt32: function=0, value=0
2014/01/13 11:16:14.015 asynInt32SyncIO read: 0
2014/01/13 11:16:14.015 simFC queueUnlockPort
2014/01/13 11:16:14.015 FastCount:TimePerCount_Read
devAsynFloat64::getIoIntInfo registering interrupt
2014/01/13 11:16:14.015 FastCount:TimePerCount_Read
devAsynFloat64::getIoIntInfo created ring buffer, size=10
2014/01/13 11:16:14.015 simFC -1 registerInterruptUser
2014/01/13 11:16:14.015 FastCount:TimePerSeq_Read
devAsynFloat64::getIoIntInfo registering interrupt
2014/01/13 11:16:14.015 FastCount:TimePerSeq_Read
devAsynFloat64::getIoIntInfo created ring buffer, size=10
2014/01/13 11:16:14.015 simFC -1 registerInterruptUser
...
iocRun: All initialization complete
...
2014/01/13 11:18:10.965 simFC queueRequest synchronous