![]() |
![]() ![]()
Experimental Physics and
| ||||||||||||||
|
This Message Is From an External Sender
This message came from outside your organization.
Hi,
I would like to use the connection/communication management features of Asyn with a TCP/IP based driver using the asynPortDriver class.
I have a limitation to the underline device driver that expose the device has a non-thread-safe object , meaning it should only be access from the thread that made the API call to initiate the device handle.
what I want to do, is to create the device handle instance within the asyn port thread, instead of the main thread. thus, all record init and runtime operation should be performed from inside the asyn porthread. is that possible?
my understand of asyn port drivers is still cloudy somehow. this works, but the handle is hosted by the main thread.
drvXXTest::drvXXTest( const char *portName, const char *interface, const char *icsCtrtype, epicsInt16 autoConnect )
: asynPortDriver( portName,
1, // maxAddr
NUM_PARAMS,
// Interface mask
asynCommonMask | asynInt32Mask | asynUInt32DigitalMask | asynFloat64Mask | asynDrvUserMask | asynOctetMask,
asynCommonMask | asynInt32Mask | asynUInt32DigitalMask | asynFloat64Mask | asynOctetMask,
ASYN_CANBLOCK, // asynFlags.
autoConnect, // Autoconnect
0, // Default priority
0 ), // Default stack size
{
static const char *functionName = "drvXXTest";
pasynManager->exceptionDisconnect( pasynUserSelf );
// How to to call devConnect(deviceSession_, interface_) from port thread?
// as this call run from the main one.
asynStatus status = this->connect( pasynUserSelf );
if( status ) {
asynPrint( pasynUserSelf, ASYN_TRACE_ERROR,
"drvXXTest, error calling connect - %s\n",
pasynUserSelf->errorMessage );
}
}
}
asynStatus drvXXTest::connect(asynUser *pasynUser) {
// devConnect instantiate the device handle and open a connection to it.
if( !devConnect(deviceSession_, interface_) ) {
epicsSnprintf( pasynUser->errorMessage,pasynUser->errorMessageSize,
"%s: Can't open %s: %s", deviceSession_, interface_, strerror( errno ) );
return asynError;
}
pasynManager->exceptionConnect( pasynUser );
return asynSuccess;
}
Cheers,
Yann
| ||||||||||||||
ANJ, 21 Feb 2024 |
![]() · Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing · |