21 #define epicsAssertAuthor "Jeff Hill johill@lanl.gov" 29 #include "epicsVersion.h" 53 static const char pVersionCAC[] =
54 "@(#) " EPICS_VERSION_STRING
55 ", CA Client Library";
58 const cac::pProtoStubTCP cac::tcpJumpTableCAC [] =
61 &cac::eventRespAction,
62 &cac::badTCPRespAction,
64 &cac::badTCPRespAction,
65 &cac::badTCPRespAction,
66 &cac::searchRespAction,
67 &cac::badTCPRespAction,
68 &cac::badTCPRespAction,
69 &cac::badTCPRespAction,
72 &cac::exceptionRespAction,
73 &cac::clearChannelRespAction,
74 &cac::badTCPRespAction,
75 &cac::badTCPRespAction,
76 &cac::readNotifyRespAction,
77 &cac::badTCPRespAction,
78 &cac::badTCPRespAction,
79 &cac::createChannelRespAction,
80 &cac::writeNotifyRespAction,
81 &cac::badTCPRespAction,
82 &cac::badTCPRespAction,
83 &cac::accessRightsRespAction,
85 &cac::badTCPRespAction,
86 &cac::badTCPRespAction,
87 &cac::verifyAndDisconnectChan,
88 &cac::verifyAndDisconnectChan
92 const cac::pExcepProtoStubTCP cac::tcpExcepJumpTableCAC [] =
109 &cac::readNotifyExcep,
113 &cac::writeNotifyExcep,
132 programBeginTime ( epicsTime::getCurrent() ),
133 connTMO ( CA_CONN_VERIFY_PERIOD ),
134 mutex ( mutualExclusionIn ),
135 cbMutex ( callbackControlIn ),
141 tcpSmallRecvBufFreeList ( 0 ),
142 tcpLargeRecvBufFreeList ( 0 ),
147 maxContigFrames ( contiguousMsgCountWhichTriggersFlowControl ),
148 beaconAnomalyCount ( 0u ),
149 iiuExistenceCount ( 0u ),
150 cacShutdownInProgress (
false )
177 len = strlen ( tmp ) + 1;
178 this->pUserName =
new char [ len ];
179 strncpy ( this->pUserName, tmp, len );
188 this->connTMO = CA_CONN_VERIFY_PERIOD;
194 long maxBytesAsALong;
196 if ( status || maxBytesAsALong < 0 ) {
197 errlogPrintf (
"cac: EPICS_CA_MAX_ARRAY_BYTES was not a positive integer\n" );
201 static const unsigned headerSize =
sizeof (
caHdr ) + 2 *
sizeof (
ca_uint32_t );
202 ca_uint32_t maxBytes = ( unsigned ) maxBytesAsALong;
203 if ( maxBytes < 0xffffffff - headerSize ) {
204 maxBytes += headerSize;
207 maxBytes = 0xffffffff;
213 this->maxRecvBytesTCP = maxBytes;
217 if ( ! this->tcpSmallRecvBufFreeList ) {
218 throw std::bad_alloc ();
226 freeListInitPvt ( &this->tcpLargeRecvBufFreeList, this->maxRecvBytesTCP, 1 );
227 if ( ! this->tcpLargeRecvBufFreeList ) {
228 throw std::bad_alloc ();
232 if ( bufsPerArray > 1u ) {
233 maxContigFrames = bufsPerArray *
234 contiguousMsgCountWhichTriggersFlowControl;
239 delete [] this->pUserName;
241 if ( this->tcpLargeRecvBufFreeList ) {
263 pNode = reinterpret_cast < osiSockAddrNode * > (
ellGet ( & dest ) ) ) {
277 piiu->
start ( guard );
293 if ( this->pudpiiu ) {
294 this->pudpiiu->
shutdown ( cbGuard, guard );
297 this->cacShutdownInProgress =
true;
303 while ( iter.
valid() ) {
319 while ( this->iiuExistenceCount > 0 ) {
321 this->iiuUninstall.wait ();
325 if ( this->pudpiiu ) {
326 delete this->pudpiiu;
330 if ( this->tcpLargeRecvBufFreeList ) {
334 delete [] this->pUserName;
337 this->beaconTable.
removeAll ( tmpBeaconList );
338 while (
bhe * pBHE = tmpBeaconList.
get() ) {
340 this->bheFreeList.
release ( pBHE );
349 msg->~msgForMultiplyDefinedPV ();
350 this->mdpvFreeList.
release ( msg );
364 unsigned abovePriority;
367 priority, & abovePriority );
369 abovePriority = priority;
371 return abovePriority;
376 unsigned belowPriority;
379 priority, & belowPriority );
381 belowPriority = priority;
383 return belowPriority;
393 while ( iter.
valid () ) {
403 return this->circuitList.
count ();
411 ::printf (
"Channel Access Client Context at %p for user %s\n",
412 static_cast <const void *> (
this ), this->pUserName );
415 ::printf (
"\trevision \"%s\"\n", pVersionCAC );
418 this->serverTable.
show ( level - 1u );
419 ::printf (
"\tconnection time out watchdog period %f\n", this->connTMO );
423 if ( this->pudpiiu ) {
424 this->pudpiiu->
show ( level - 2u );
429 ::printf (
"Program begin time:\n");
430 this->programBeginTime.show ( level - 3u );
431 ::printf (
"Channel identifier hash table:\n" );
432 this->chanTable.
show ( level - 3u );
433 ::printf (
"IO identifier hash table:\n" );
434 this->ioTable.
show ( level - 3u );
435 ::printf (
"Beacon source identifier hash table:\n" );
436 this->beaconTable.
show ( level - 3u );
439 ::printf (
"IP address to name conversion engine:\n" );
440 this->ipToAEngine.
show ( level - 3u );
445 this->mutex.show ( level - 4u );
447 this->mutex.show ( level - 4u );
455 ca_uint32_t beaconNumber,
unsigned protocolRevision )
459 if ( ! this->pudpiiu ) {
466 bhe *pBHE = this->beaconTable.
lookup ( addr );
471 if ( ! pBHE->
updatePeriod ( guard, this->programBeginTime,
472 currentTime, beaconNumber, protocolRevision ) ) {
484 pBHE =
new ( this->bheFreeList )
485 bhe ( this->mutex, currentTime, beaconNumber, addr );
487 if ( this->beaconTable.
add ( *pBHE ) < 0 ) {
489 this->bheFreeList.
release ( pBHE );
495 this->beaconAnomalyCount++;
502 addr.
name ( buf,
sizeof ( buf ) );
503 ::printf (
"New server available: %s\n", buf );
518 if ( pName == 0 || pName[0] ==
'\0' ) {
522 if ( ! this->pudpiiu ) {
523 this->pudpiiu =
new udpiiu (
525 this->mutex, this->notify, *
this, this->_serverPort,
526 this->searchDestList );
529 nciu * pNetChan =
new ( this->channelFreeList )
537 unsigned priority,
tcpiiu *& piiu,
unsigned minorVersionNumber,
544 if ( ! piiu->
alive ( guard ) ) {
551 this->freeListVirtualCircuit,
552 new ( this->freeListVirtualCircuit )
tcpiiu (
553 *
this, this->mutex, this->cbMutex, this->notify, this->connTMO,
554 this->
timerQueue, addr, this->comBufMemMgr, minorVersionNumber,
555 this->ipToAEngine, priority, pSearchDest ) );
559 pBHE =
new ( this->bheFreeList )
560 bhe ( this->mutex, epicsTime (), 0u, addr.
ia );
561 if ( this->beaconTable.
add ( *pBHE ) < 0 ) {
565 this->serverTable.
add ( *pnewiiu );
566 this->circuitList.
add ( *pnewiiu );
567 this->iiuExistenceCount++;
572 catch ( std :: exception & except ) {
574 "CAC: exception during virtual circuit creation \"%s\"\n",
580 "CAC: Nonstandard exception during virtual circuit creation\n" );
588 unsigned cid,
unsigned sid,
593 if ( addr.
sa.sa_family != AF_INET ) {
602 if ( this->cacShutdownInProgress ) {
609 nciu * pChan = this->chanTable.
lookup ( cid );
619 if ( chanAddr.
sa.sa_family != AF_UNSPEC ) {
625 *
this, pChan->
pName ( guard ), acc );
627 this->msgMultiPVList.
add ( *pMsg );
644 pChan->
getPriority(guard), piiu, minorVersionNumber );
648 guard, *pChan, currentTime );
650 piiu->installChannel (
651 guard, *pChan, sid, typeCode, count );
654 piiu->start ( guard );
667 if ( this->chanTable.
remove ( chan ) != & chan ) {
668 throw std::logic_error (
"Invalid channel identifier" );
671 this->channelFreeList.
release ( & chan );
685 while ( pNetIO.
valid () ) {
691 pNetIO->exception ( guard, *
this,
ECA_DISCONN, buf );
698 const char * pformat, ... )
const 701 va_start ( theArgs, pformat );
713 guard, this->ioTable, *
this,
717 guard, chan, *pIO, type, nElem, pValue );
727 guard, this->ioTable, *
this,
749 pIO->exception ( guard, *
this,
762 pmiu->
show ( guard, level );
766 void cac::ioExceptionNotify (
777 void cac::ioExceptionNotifyAndUninstall (
788 void cac::recycleReadNotifyIO (
792 this->freeListReadNotifyIO.
release ( & io );
795 void cac::recycleWriteNotifyIO (
799 this->freeListWriteNotifyIO.
release ( & io );
802 void cac::recycleSubscription (
806 this->freeListSubscription.
release ( & io );
815 bool chanIsInstalled )
819 guard, this->ioTable, *
this,
821 privChan, type, nElem, mask, notifyIn ) );
823 if ( chanIsInstalled ) {
836 bool cac::echoRespAction (
844 bool cac::writeNotifyRespAction (
855 pmiu->exception ( guard, *
this,
856 hdr.
m_cid,
"write notify request rejected" );
873 caStatus = hdr.
m_cid;
892 this->ioTable.
add ( *pmiu );
907 pmiu->exception ( guard, *
this,
908 caStatus,
"read failed",
944 caStatus = hdr.
m_cid;
970 pmiu->exception ( guard, *
this, caStatus,
971 "subscription update read failed",
1002 bool cac::defaultExcep (
1009 iiu.
getHostName ( guard, hostName,
sizeof ( hostName ) );
1010 sprintf ( buf,
"host=%s ctx=%.400s", hostName, pCtx );
1011 this->notify.exception ( guard, status, buf, 0, 0u );
1015 void cac::exception (
1026 bool cac::eventAddExcep (
1029 const char *pCtx,
unsigned status )
1031 this->ioExceptionNotify ( hdr.
m_available, status, pCtx,
1038 const char * pCtx,
unsigned status )
1040 this->ioExceptionNotifyAndUninstall ( hdr.
m_available,
1045 bool cac::writeExcep (
1048 const char * pCtx,
unsigned status )
1061 const char *pCtx,
unsigned status )
1063 this->ioExceptionNotifyAndUninstall ( hdr.
m_available,
1070 const char *pCtx,
unsigned status )
1072 this->ioExceptionNotifyAndUninstall ( hdr.
m_available,
1080 const caHdr * pReq = reinterpret_cast <
const caHdr * > ( pMsgBdy );
1081 unsigned bytesSoFar =
sizeof ( *pReq );
1094 static const unsigned annexSize =
1096 bytesSoFar += annexSize;
1106 pExcepProtoStubTCP pStub;
1108 pStub = &cac::defaultExcep;
1111 pStub = cac::tcpExcepJumpTableCAC [req.
m_cmmd];
1113 const char *pCtx = reinterpret_cast <
const char * > ( pLW );
1114 return ( this->*pStub ) ( cbMutexIn, iiu, req, pCtx, hdr.
m_available );
1117 bool cac::accessRightsRespAction (
1134 bool cac::createChannelRespAction (
1146 sidTmp = pChan->
getSID (guard);
1149 if ( wasExpected ) {
1155 "CA Client Library: Ignored duplicate create channel " 1156 "response from CA server?\n" );
1168 bool cac::verifyAndDisconnectChan (
1177 this->disconnectChannel ( mgr.
cbGuard, guard, *pChan );
1181 void cac::disconnectChannel (
1186 assert ( this->pudpiiu );
1198 iiu.
getHostName ( guard, hostName,
sizeof ( hostName ) );
1199 errlogPrintf (
"CAC: Undecipherable TCP message ( bad response type %u ) from %s\n",
1210 pStub = &cac::badTCPRespAction;
1213 pStub = cac::tcpJumpTableCAC [hdr.
m_cmmd];
1215 return ( this->*pStub ) ( mgr, iiu, currentTime, hdr, pMshBody );
1222 this->chanTable.
verify ();
1224 this->beaconTable.
verify ();
1234 char hostNameTmp[64];
1235 iiu.
getHostName ( guard, hostNameTmp,
sizeof ( hostNameTmp ) );
1239 if ( addr.
sa.sa_family == AF_INET ) {
1241 bhe * pBHE = this->beaconTable.
lookup ( tmp );
1247 assert ( this->pudpiiu );
1250 this->serverTable.
remove ( iiu );
1251 this->circuitList.
remove ( iiu );
1265 this->freeListVirtualCircuit.
release ( & iiu );
1266 this->iiuExistenceCount--;
1268 this->iiuUninstall.signal();
1275 const nciu & chan )
const 1280 if ( addr.
sa.sa_family == AF_INET ) {
1282 bhe *pBHE = this->beaconTable.
lookup ( tmp );
1284 return pBHE->
period ( guard );
1296 assert ( this->pudpiiu );
1302 return this->freeList.allocate ( size );
1307 this->freeList.release ( pCadaver );
1311 const char * pChannelName,
const char * pAcc,
const char * pRej )
1314 sprintf ( buf,
"Channel: \"%.64s\", Connecting to: %.64s, Ignored: %.64s",
1315 pChannelName, pAcc, pRej );
1322 this->msgMultiPVList.
remove ( mfmdpv );
1326 this->mdpvFreeList.
release ( & mfmdpv );
1334 this->searchDestList.
add ( req );
epicsSingleton< localHostName > localHostNameCache
LIBCA_API void epicsStdCall removeDuplicateAddresses(struct ELLLIST *pDestList, ELLLIST *pSrcList, int silent)
void destroyIIU(tcpiiu &iiu)
void disconnectAllChannels(epicsGuard< epicsMutex > &cbGuard, epicsGuard< epicsMutex > &guard, class udpiiu &)
bool ca_v44_ok(epicsGuard< epicsMutex > &) const
void beaconAnomalyNotify(epicsGuard< epicsMutex > &guard)
#define assert(exp)
Declare that a condition should be true.
virtual void show(unsigned level) const =0
void selfTest(epicsGuard< epicsMutex > &) const
void show(unsigned int level) const
LIBCOM_API void epicsStdCall epicsSignalInstallSigPipeIgnore(void)
char * name
Name of the parameter.
osiSockAddr getNetworkAddress(epicsGuard< epicsMutex > &) const
static netWriteNotifyIO * factory(tsFreeList< class netWriteNotifyIO, 1024, epicsMutexNOOP > &, privateInterfaceForIO &, cacWriteNotify &)
void subscribeIfRequired(epicsGuard< epicsMutex > &guard, nciu &chan)
LIBCA_API int epicsStdCall addAddrToChannelAccessAddressList(struct ELLLIST *pList, const ENV_PARAM *pEnv, unsigned short port, int ignoreNonDefaultPort)
int caNetConvert(unsigned type, const void *pSrc, void *pDest, int hton, arrayElementCount count)
void exception epicsGuard< epicsMutex > epicsGuard< epicsMutex > int status
unsigned getHostName(epicsGuard< epicsMutex > &, char *pBuf, unsigned bufLen) const
void flushRequest(epicsGuard< epicsMutex > &)
void connect(unsigned nativeType, unsigned nativeCount, unsigned sid, epicsGuard< epicsMutex > &cbGuard, epicsGuard< epicsMutex > &guard)
Routines to get and set EPICS environment parameters.
tsDLIterConst< T > firstIter() const
void unresponsiveCircuitNotify(epicsGuard< epicsMutex > &cbGuard, epicsGuard< epicsMutex > &guard)
static netSubscription * factory(tsFreeList< class netSubscription, 1024, epicsMutexNOOP > &, class privateInterfaceForIO &, unsigned type, arrayElementCount count, unsigned mask, cacStateNotify &)
const char * pName(epicsGuard< epicsMutex > &) const
void exception epicsGuard< epicsMutex > epicsGuard< epicsMutex > & guard
static const priLev priorityMax
void unlinkAllChannels(epicsGuard< epicsMutex > &cbGuard, epicsGuard< epicsMutex > &guard)
void ioShow(epicsGuard< epicsMutex > &guard, const cacChannel::ioid &id, unsigned level) const
pvd::StructureConstPtr type
ELLNODE * ellGet(ELLLIST *pList)
Deletes and returns the first node from a list.
LIBCOM_API const ENV_PARAM EPICS_CA_MAX_ARRAY_BYTES
LIBCA_API bool updatePeriod(epicsGuard< epicsMutex > &, const epicsTime &programBeginTime, const epicsTime ¤tTime, ca_uint32_t beaconNumber, unsigned protocolRevision)
void assertIdenticalMutex(const T &) const
LIBCOM_API const ENV_PARAM EPICS_CA_NAME_SERVERS
void start(epicsGuard< epicsMutex > &)
void exception epicsGuard< epicsMutex > epicsGuard< epicsMutex > int const char * pContext
LIBCOM_API void epicsStdCall freeListInitPvt(void **ppvt, int size, int nmalloc)
virtual osiSockAddr getNetworkAddress(epicsGuard< epicsMutex > &) const =0
cacChannel & createChannel(epicsGuard< epicsMutex > &guard, const char *pChannelName, cacChannelNotify &, cacChannel::priLev)
virtual void readNotifyRequest(epicsGuard< epicsMutex > &, nciu &, netReadNotifyIO &, unsigned type, arrayElementCount nElem)=0
unsigned short ca_uint16_t
T * lookup(const ID &idIn) const
Miscellaneous macro definitions.
virtual unsigned getHostName(epicsGuard< epicsMutex > &, char *pBuf, unsigned bufLength) const =0
LIBCA_API void registerIIU(epicsGuard< epicsMutex > &, tcpiiu &)
static unsigned highestPriorityLevelBelow(unsigned priority)
void installNewChannel(epicsGuard< epicsMutex > &, nciu &, netiiu *&)
void installDisconnectedChannel(epicsGuard< epicsMutex > &, nciu &)
#define CA_PROTO_ACCESS_RIGHT_READ
void exception epicsGuard< epicsMutex > epicsGuard< epicsMutex > int const char const char unsigned lineNo
LIBCOM_API void epicsStdCall freeListCleanup(void *pvt)
LIBCOM_API long epicsStdCall envGetDoubleConfigParam(const ENV_PARAM *pParam, double *pDouble)
Get value of a double configuration parameter.
LIBCOM_API const ENV_PARAM EPICS_CA_SERVER_PORT
void writeException(epicsGuard< epicsMutex > &, epicsGuard< epicsMutex > &, int status, const char *pContext, unsigned type, arrayElementCount count)
int varArgsPrintFormated(epicsGuard< epicsMutex > &callbackControl, const char *pformat, va_list args) const
bool executeResponse(callbackManager &, tcpiiu &, const epicsTime ¤tTime, caHdrLargeArray &, char *pMsgBody)
LIBCOM_API epicsThreadBooleanStatus epicsStdCall epicsThreadLowestPriorityLevelAbove(unsigned int priority, unsigned *pPriorityJustAbove)
void show(unsigned level) const
netiiu * getPIIU(epicsGuard< epicsMutex > &)
LIBCOM_API long epicsStdCall envGetBoolConfigParam(const ENV_PARAM *pParam, int *pBool)
Get value of a boolean configuration parameter.
void idAssignAdd(ITEM &item)
bool connectNotify(epicsGuard< epicsMutex > &, nciu &chan)
void removeAll(tsSLList< T > &destination)
cacChannel::priLev getPriority(epicsGuard< epicsMutex > &) const
virtual void uninstallChanDueToSuccessfulSearchResponse(epicsGuard< epicsMutex > &, nciu &, const class epicsTime ¤tTime)=0
bool alive(epicsGuard< epicsMutex > &) const
char * allocate(unsigned int n)
LIBCOM_API unsigned short epicsStdCall envGetInetPortConfigParam(const ENV_PARAM *pEnv, unsigned short defaultPort)
Get value of a port number configuration parameter.
void searchRespNotify(const epicsTime &, const caHdrLargeArray &)
void initiateConnect(epicsGuard< epicsMutex > &, nciu &, netiiu *&)
const netiiu * getConstPIIU(epicsGuard< epicsMutex > &) const
void shutdown(epicsGuard< epicsMutex > &cbGuard, epicsGuard< epicsMutex > &guard)
virtual void uninstallChan(epicsGuard< epicsMutex > &, nciu &)=0
void registerSearchDest(epicsGuard< epicsMutex > &, SearchDest &req)
void transferChanToVirtCircuit(unsigned cid, unsigned sid, ca_uint16_t typeCode, arrayElementCount count, unsigned minorVersionNumber, const osiSockAddr &, const epicsTime ¤tTime)
void exception epicsGuard< epicsMutex > & cbGuard
bool destroyIO(CallbackGuard &callbackGuard, epicsGuard< epicsMutex > &mutualExclusionGuard, const cacChannel::ioid &idIn, nciu &chan)
void flush(epicsGuard< epicsMutex > &guard)
void destroyChannel(epicsGuard< epicsMutex > &, nciu &)
LIBCOM_API void epicsStdCall epicsSignalInstallSigAlarmIgnore(void)
int errlogPrintf(const char *pFormat,...)
double beaconPeriod(epicsGuard< epicsMutex > &, const nciu &chan) const
bool ca_v41_ok(epicsGuard< epicsMutex > &) const
epicsGuard< epicsMutex > cbGuard
LIBCA_API void unregisterIIU(epicsGuard< epicsMutex > &, tcpiiu &)
LIBCOM_API epicsThreadBooleanStatus epicsStdCall epicsThreadHighestPriorityLevelBelow(unsigned int priority, unsigned *pPriorityJustBelow)
virtual class netSubscription * isSubscription()=0
T * remove(const ID &idIn)
LIBCOM_API unsigned int epicsStdCall epicsThreadGetPrioritySelf(void)
unsigned long arrayElementCount
bool findOrCreateVirtCircuit(epicsGuard< epicsMutex > &, const osiSockAddr &, unsigned, tcpiiu *&, unsigned, SearchDestTCP *pSearchDest=NULL)
#define CA_PROTO_ACCESS_RIGHT_WRITE
void beaconNotify(const inetAddrID &addr, const epicsTime ¤tTime, ca_uint32_t beaconNumber, unsigned protocolRevision)
void unsubscribeIfRequired(epicsGuard< epicsMutex > &guard, nciu &chan)
void disconnectAllIO(epicsGuard< epicsMutex > &, epicsGuard< epicsMutex > &)
void show(unsigned level) const
LIBCOM_API long epicsStdCall envGetLongConfigParam(const ENV_PARAM *pParam, long *pLong)
Get value of a long configuration parameter.
LIBCOM_API osiGetUserNameReturn epicsStdCall osiGetUserName(char *pBuf, unsigned bufSizeIn)
int(* pProtoStubTCP)(caHdrLargeArray *mp, void *pPayload, struct client *client)
virtual void show(unsigned level) const =0
void show(epicsGuard< epicsMutex > &, unsigned level) const
#define ellInit(PLIST)
Initialize a list type.
#define genLocalExcep(CBGUARD, GUARD, CAC, STAT, PCTX)
virtual void completion(epicsGuard< epicsMutex > &, cacRecycle &)=0
netSubscription & subscriptionRequest(epicsGuard< epicsMutex > &, nciu &, privateInterfaceForIO &, unsigned type, arrayElementCount nElem, unsigned mask, cacStateNotify &, bool channelIsInstalled)
static unsigned capacityBytes()
void exception epicsGuard< epicsMutex > epicsGuard< epicsMutex > int const char const char * pFileName
static unsigned lowestPriorityLevelAbove(unsigned priority)
LIBCOM_API const ENV_PARAM EPICS_CA_CONN_TMO
unsigned channelCount(epicsGuard< epicsMutex > &)
OS-independent routines for ignoring Posix signals.
LIBCA_API double period(epicsGuard< epicsMutex > &) const
void clearChannelRequest(epicsGuard< epicsMutex > &, ca_uint32_t sid, ca_uint32_t cid)
void disconnectAllIO(epicsGuard< epicsMutex > &cbGuard, epicsGuard< epicsMutex > &guard, nciu &, tsDLList< baseNMIU > &ioList)
#define throwWithLocation(parm)
void probeResponseNotify(epicsGuard< epicsMutex > &)
unsigned circuitCount(epicsGuard< epicsMutex > &) const
LIBCOM_API const ENV_PARAM EPICS_CA_AUTO_ARRAY_BYTES
netReadNotifyIO & readNotifyRequest(epicsGuard< epicsMutex > &, nciu &, privateInterfaceForIO &, unsigned type, arrayElementCount nElem, cacReadNotify &)
void name(char *pBuf, unsigned bufSize) const
int epicsStdCall sockAddrAreIdentical(const osiSockAddr *plhs, const osiSockAddr *prhs)
unsigned getHostName(epicsGuard< epicsMutex > &, char *pBuf, unsigned bufLength) const
ca_uint32_t getSID(epicsGuard< epicsMutex > &) const
static netReadNotifyIO * factory(tsFreeList< class netReadNotifyIO, 1024, epicsMutexNOOP > &, privateInterfaceForIO &, cacReadNotify &)
int printFormated(epicsGuard< epicsMutex > &callbackControl, const char *pformat,...) const
static const priLev priorityDefault
cac(epicsMutex &mutualExclusion, epicsMutex &callbackControl, cacContextNotify &)
void versionRespNotify(const caHdrLargeArray &)
void accessRightsStateChange(const caAccessRights &, epicsGuard< epicsMutex > &cbGuard, epicsGuard< epicsMutex > &guard)
netWriteNotifyIO & writeNotifyRequest(epicsGuard< epicsMutex > &, nciu &, privateInterfaceForIO &, unsigned type, arrayElementCount nElem, const void *pValue, cacWriteNotify &)
LIBCOM_API epicsThreadId epicsStdCall epicsThreadGetIdSelf(void)
virtual void writeNotifyRequest(epicsGuard< epicsMutex > &, nciu &, netWriteNotifyIO &, unsigned type, arrayElementCount nElem, const void *pValue)=0