diff --git a/configure/CONFIG_ENV b/configure/CONFIG_ENV index 173dceaca..22ace0090 100644 --- a/configure/CONFIG_ENV +++ b/configure/CONFIG_ENV @@ -35,6 +35,7 @@ EPICS_CA_CONN_TMO=30.0 EPICS_CA_REPEATER_PORT=5065 EPICS_CA_SERVER_PORT=5064 EPICS_CA_MAX_ARRAY_BYTES=16384 +EPICS_CA_AUTO_MAX_ARRAY_BYTES=NO EPICS_CA_BEACON_PERIOD=15.0 EPICS_CA_MAX_SEARCH_PERIOD=300.0 EPICS_CAS_BEACON_PERIOD= diff --git a/src/ca/client/cac.cpp b/src/ca/client/cac.cpp index c174b8992..f1d7f0903 100644 --- a/src/ca/client/cac.cpp +++ b/src/ca/client/cac.cpp @@ -55,14 +55,6 @@ static const char pVersionCAC[] = "@(#) " EPICS_VERSION_STRING ", CA Client Library " __DATE__; -// when set, respect EPICS_CA_MAX_ARRAY_BYTES -// when clear, ignore it -extern "C" { -epicsShareExtern int caLimitArray; -int caLimitArray; -epicsExportAddress(int, caLimitArray); -} - // TCP response dispatch table const cac::pProtoStubTCP cac::tcpJumpTableCAC [] = { @@ -227,6 +219,10 @@ cac::cac ( throw std::bad_alloc (); } + int caLimitArray; + if(envGetBoolConfigParam(&EPICS_CA_AUTO_MAX_ARRAY_BYTES, &caLimitArray)) + caLimitArray = 0; + if(caLimitArray) { freeListInitPvt ( &this->tcpLargeRecvBufFreeList, this->maxRecvBytesTCP, 1 ); if ( ! this->tcpLargeRecvBufFreeList ) { diff --git a/src/ioc/misc/dbCore.dbd b/src/ioc/misc/dbCore.dbd index 067145a01..a2ce45806 100644 --- a/src/ioc/misc/dbCore.dbd +++ b/src/ioc/misc/dbCore.dbd @@ -22,6 +22,3 @@ variable(callbackParallelThreadsDefault,int) # Real-time operation variable(dbThreadRealtimeLock,int) - -# RSRV and dbCa (all local ca contexts) -variable(caLimitArray, int) diff --git a/src/ioc/rsrv/caservertask.c b/src/ioc/rsrv/caservertask.c index 3766d421d..0ca74c5b5 100644 --- a/src/ioc/rsrv/caservertask.c +++ b/src/ioc/rsrv/caservertask.c @@ -34,9 +34,6 @@ #include "taskwd.h" #include "cantProceed.h" -// defined in cac.cpp -epicsShareExtern int caLimitArray; - #include "epicsExport.h" #define epicsExportSharedSymbols @@ -472,6 +469,7 @@ int rsrv_init (void) long maxBytesAsALong; long status; SOCKET *socks; + int caLimitArray; clientQlock = epicsMutexMustCreate(); @@ -530,6 +528,10 @@ int rsrv_init (void) rsrvSizeofLargeBufTCP = maxBytes; } } + + if(envGetBoolConfigParam(&EPICS_CA_AUTO_MAX_ARRAY_BYTES, &caLimitArray)) + caLimitArray = 0; + if (caLimitArray) freeListInitPvt ( &rsrvLargeBufFreeListTCP, rsrvSizeofLargeBufTCP, 1 ); else diff --git a/src/libCom/env/envDefs.h b/src/libCom/env/envDefs.h index 536e63635..0c9002d71 100644 --- a/src/libCom/env/envDefs.h +++ b/src/libCom/env/envDefs.h @@ -48,6 +48,7 @@ epicsShareExtern const ENV_PARAM EPICS_CA_AUTO_ADDR_LIST; epicsShareExtern const ENV_PARAM EPICS_CA_REPEATER_PORT; epicsShareExtern const ENV_PARAM EPICS_CA_SERVER_PORT; epicsShareExtern const ENV_PARAM EPICS_CA_MAX_ARRAY_BYTES; +epicsShareExtern const ENV_PARAM EPICS_CA_AUTO_MAX_ARRAY_BYTES; epicsShareExtern const ENV_PARAM EPICS_CA_MAX_SEARCH_PERIOD; epicsShareExtern const ENV_PARAM EPICS_CA_NAME_SERVERS; epicsShareExtern const ENV_PARAM EPICS_CAS_INTF_ADDR_LIST;