Experimental Physics and Industrial Control System
HI Mark,
I did a printout of the configuration of my asyn port:
FileOpenPMD1 multiDevice:No canBlock:Yes autoConnect:Yes
enabled:Yes connected:Yes numberConnects 1
nDevices 0 nQueued 0 blocked:No
asynManagerLock:No synchronousLock:No
exceptionActive:No exceptionUsers 1 exceptionNotifys 0
traceMask:0x1 traceIOMask:0x0 traceInfoMask:0x1
interposeInterfaceList
asynOctet pinterface 0x7f992f1a4440 drvPvt 0x1e5b610
interfaceList
asynCommon pinterface 0x7f992f1a4cf0 drvPvt 0x1e61810
asynDrvUser pinterface 0x7f992f1a4a80 drvPvt 0x1e61810
asynOctet pinterface 0x7f992f1a4bc0 drvPvt 0x1e61810
asynInt32 pinterface 0x7f992f1a4cc0 drvPvt 0x1e61810
asynFloat64 pinterface 0x7f992f1a4c20 drvPvt 0x1e61810
asynInt32Array pinterface 0x7f992f1a4b60 drvPvt 0x1e61810
asynGenericPointer pinterface 0x7f992f1a4ae0 drvPvt 0x1e61810
My constructor calls its base calls as follows:
: NDPluginFile(portName, queueSize, blockingCallbacks,
NDArrayPort, NDArrayAddr, 1,
0, 0, asynGenericPointerMask | asynEnumMask,
asynGenericPointerMask | asynEnumMask,
ASYN_CANBLOCK, 1, priority, stackSize, 1, true),
m_series(NULL), m_numBackends(0)
so, asynEnumMask should be set.
Looking at NDPluginFile.cpp I found the reason:
>NDPluginFile::NDPluginFile(const char *portName, int queueSize, int
>blockingCallbacks,
> const char *NDArrayPort, int NDArrayAddr, int
>maxAddr,
> int maxBuffers, size_t maxMemory, int
>interfaceMask, int interruptMask,
> int asynFlags, int autoConnect, int priority, int
>stackSize, int maxThreads,
> bool compressionAware)
>
> /* Invoke the base class constructor.
> * We allocate 1 NDArray of unlimited size in the NDArray pool.
> * This driver can block (because writing a file can be slow), and it is
>not multi-device.
> * Set autoconnect to 1. priority and stacksize can be 0, which will use
>defaults. */
> : NDPluginDriver(portName, queueSize, blockingCallbacks,
> NDArrayPort, NDArrayAddr, maxAddr, maxBuffers,
>maxMemory,
> asynGenericPointerMask, asynGenericPointerMask,
----------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The masks are hardcoded here!!
> asynFlags, autoConnect, priority, stackSize, maxThreads,
>compressionAware),
> pCapture(NULL)
>{
The interfaceMask and the interruptMask are just not passed on to the next
layer! Seems to be a bug.
Regards,
Jörn
Am Freitag, 18. August 2023, 15:10:39 CEST schrieb Mark Rivers via Tech-talk:
> Hi
>
> The problem is actually that the first argument to interruptStart, pasynPvt,
> is 0. That is why pinterruptBase is 0.
>
> static asynStatus interruptStart(void *pasynPvt,ELLLIST **plist)
> {
> interruptBase *pinterruptBase = (interruptBase *)pasynPvt;
>
> This is line 3363 in asynPortDriver.cpp
>
> pasynManager->interruptStart(this->asynStdInterfaces.enumInterruptPvt,
> &pclientList);
>
> That means that this->asynStdInterfaces.enumInterruptPvt is null, but it
> should not be.
>
> If you can execute a command before it crashes then do this:
>
> asynReport 5 "portName"
>
> where portName is the name of your asyn port. That will print out the
> values of all of the interruptPvt pointers.
>
> It is acting like you did not put asynEnum in the interruptMask in the
> asynPortDriver constructor, but you said you did.
>
> Mark
>
>
> ________________________________
> From: Tech-talk <tech-talk-bounces at aps.anl.gov> on behalf of Jörn Dreyer via
> Tech-talk <tech-talk at aps.anl.gov> Sent: Friday, August 18, 2023 7:47 AM
> To: tech-talk at aps.anl.gov <tech-talk at aps.anl.gov>
> Subject: Problem writing enum entries from asyn driver (areaDetector) ino a
> databse record.
>
> Hello,
>
> I have a strange problem in a areaDetector plugin I currently writing. I
> want to fill a mbbo record with the strings from an std::vector I get from
> a library function. I copy the elements of the std::vestor to a pre
> allocated char** array and fill values and severities arrays. In my
> writeInt32 function I do a call to
>
> doCallbacksEnum(strings, values, severities, nEntries, function, 0)
>
> This leads to a crash with SIGSEGV. After recompiling my code and the asyn
> module with debug symbols I managed to track down the problem to an
> uninitialized variable in asynManager:
>
> #0 0x00007ffff7f33417 in interruptStart (pasynPvt=0x0,
> plist=0x7fffc37f9568) at ../../asyn/asynDriver/asynManager.c:2438
> 2438 port *pport = pinterruptBase->pport;
>
> looking at pinterruptBase it returns 0x0.
> The backtrace leading to this crash is:
>
> #0 0x00007ffff7f33417 in interruptStart (pasynPvt=0x0,
> plist=0x7fffc37f9568) at ../../asyn/asynDriver/asynManager.c:2438
> #1 0x00007ffff7f56b57 in asynPortDriver::doCallbacksEnum(char**, int*,
> int*, unsigned long, int, int)
> (this=0x745a90, strings=0x73f4b0, values=0x744000, severities=0x744060,
> nElements=7, reason=80, address=0)
> at ../../asyn/asynPortDriver/asynPortDriver.cpp:3363
> #2 0x00007ffff7df1e4b in NDFileOpenPMD::writeInt32(asynUser*, int)
> (this=<optimized out>, pasynUser=<optimized out>, value=<optimized out>)
> at ../NDFileOpenPMD.cpp:192
>
> My driver is derived from NDFilePlugin as:
>
> NDPluginFile(portName, queueSize, blockingCallbacks,
> NDArrayPort, NDArrayAddr, 1,
> 0, 0, asynGenericPointerMask | asynEnumMask,
> asynGenericPointerMask | asynEnumMask,
> ASYN_CANBLOCK, 1, priority, stackSize, 1, true)
>
> So in my understanding it should be configured to be able to use enum
> functions.
>
> Can anybody help me to figure out what I'm doing wrong? I did a crosscheck
> with other areaDetector plugin drivers if there is a special setting missing
> and also looked at the examples from asy, but could not figur out whjat is
> wrong in my code.
>
> Regards,
>
> Jörn Dreyer
- Replies:
- Re: Problem writing enum entries from asyn driver (areaDetector) ino a databse record. Mark Rivers via Tech-talk
- References:
- Problem writing enum entries from asyn driver (areaDetector) ino a databse record. Jörn Dreyer via Tech-talk
- Re: Problem writing enum entries from asyn driver (areaDetector) ino a databse record. Mark Rivers via Tech-talk
- Navigate by Date:
- Prev:
Re: Dante Andrew Johnson via Tech-talk
- Next:
Reminder: EPICS documentation community survey NICOLE Remi via Tech-talk
- Index:
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
<2023>
2024
- Navigate by Thread:
- Prev:
Re: Problem writing enum entries from asyn driver (areaDetector) ino a databse record. Mark Rivers via Tech-talk
- Next:
Re: Problem writing enum entries from asyn driver (areaDetector) ino a databse record. Mark Rivers via Tech-talk
- Index:
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
<2023>
2024