EPICS Base R3.14.6: Known Problems

Check the Bug Tracker

Not all known bugs are listed here - check the Mantis bug database for additional problems, especially any associated with Channel Access. Bugs registered in the Mantis database are closed when a new version of Base is released, so it R3.14.7 is out you'll have to check the closed bugs list.

RTEMS devLib initialization

Reported by Kate Feng: A global pointer needs to be initialized for RTEMS in src/libCom/osi/os/RTEMS/devLibOSD.c as follows:

Index: devLibOSD.c
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/osi/os/RTEMS/devLibOSD.c,v
retrieving revision 1.1.2.2
diff -u -r1.1.2.2 devLibOSD.c
--- devLibOSD.c 12 Aug 2003 15:39:48 -0000      1.1.2.2
+++ devLibOSD.c 2 Jul 2004 23:03:13 -0000
@@ -90,6 +90,7 @@
     devConnectInterruptVME, devDisconnectInterruptVME,
     devEnableInterruptLevelVME, devDisableInterruptLevelVME,
     devA24Malloc,devA24Free,rtmsDevInit};
+devLibVirtualOS *pdevLibVirtualOS = &devLibRTEMSOS;

 /* RTEMS specific initialization */
 LOCAL long

calcoutRecord.ODLY

Reported by Gasper Jansa: The ODLY (Output Delay) is not handled properly. The following fixes the problem:

diff -c -r1.22.2.2 calcoutRecord.c
*** calcoutRecord.c     16 Dec 2003 19:51:34 -0000      1.22.2.2
--- calcoutRecord.c     24 Jun 2004 17:42:32 -0000
***************
*** 247,254 ****
              if(pcalc->odly > 0.0) {
                  pcalc->dlya = 1;
                  db_post_events(pcalc,&pcalc->dlya,DBE_VALUE);
!                 callbackRequestProcessCallback(&prpvt->doOutCb,
!                     (double)pcalc->odly,pcalc);
                  return(0);
              } else {
                  pcalc->pact = FALSE;
--- 247,254 ----
              if(pcalc->odly > 0.0) {
                  pcalc->dlya = 1;
                  db_post_events(pcalc,&pcalc->dlya,DBE_VALUE);
!                 callbackRequestProcessCallbackDelayed(&prpvt->doOutCb,
!                     pcalc->prio,pcalc,(double)pcalc->odly);
                  return(0);
              } else {
                  pcalc->pact = FALSE;

Accessing DTYP of a deviceless record type

Reported by Dirk Zimoch: There is a bug in dbAccess.c that can crash a PowerPC IOC when DTYP is read via CA (actually when the enum strings are fetched) if the record type has no registered device support - this is the case for purely soft record types such as the calc record. The fix is to apply the following patch in base/src/db:

Index: dbAccess.c
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/db/dbAccess.c,v
diff -u -r1.116.2.3 -r1.116.2.4
--- dbAccess.c  19 Feb 2004 01:17:39 -0000      1.116.2.3
+++ dbAccess.c  7 Jun 2004 12:09:48 -0000       1.116.2.4
@@ -147,6 +147,10 @@
                   goto choice_common;
               case DBF_DEVICE:
                   pdbDeviceMenu = (dbDeviceMenu *)pdbFldDes->ftPvt;
+                     if(!pdbDeviceMenu) {
+                         *options = (*options)^DBR_ENUM_STRS;/*Turn off option*/
+                         break;
+                     }
                   no_str = pdbDeviceMenu->nChoice;
                   papChoice = pdbDeviceMenu->papChoice;
                   goto choice_common;

Compile errors for blockingSockTest.cpp

Building R3.14.6 gives compile errors in src/libCom/test/blockingSockTest.cpp when using Tornado 2.2, and warnings from solaris-sparc. These can be fixed by applying the following patch in base/src/libCom/test:

Index: blockingSockTest.cpp
===================================================================
RCS file: /net/phoebus/epicsmgr/cvsroot/epics/base/src/libCom/test/blockingSockTest.cpp,v
diff -u -r1.1.2.9 -r1.1.2.11
--- blockingSockTest.cpp        13 May 2004 20:00:51 -0000      1.1.2.9
+++ blockingSockTest.cpp        2 Jun 2004 20:55:09 -0000       1.1.2.11
@@ -126,8 +126,9 @@
 clientCircuit::clientCircuit ( const address & addrIn ) :
     circuit ( epicsSocketCreate ( AF_INET, SOCK_STREAM, IPPROTO_TCP ) )
 {
+    address tmpAddr = addrIn;
     int status = ::connect (
-        this->sock, & addrIn.sa, sizeof ( addrIn ) );
+        this->sock, & tmpAddr.sa, sizeof ( tmpAddr ) );
     assert ( status == 0 );

     circuit * pCir = this;
@@ -156,8 +157,9 @@
     assert ( this->sock != INVALID_SOCKET );

     // setup server side
+    address tmpAddr = addrIn;
     int status = bind ( this->sock,
-        & addrIn.sa, sizeof ( addrIn ) );
+        & tmpAddr.sa, sizeof ( tmpAddr ) );
     assert ( status == 0 );
     status = listen ( this->sock, 10 );
     assert ( status == 0 );
@@ -215,7 +217,7 @@

     client.shutdown ();
     epicsThreadSleep ( 1.0 );
-    char * pStr = "esscimqi_?????";
+    const char * pStr = "esscimqi_?????";
     if ( client.recvWakeupDetected () ) {
         pStr = "esscimqi_socketBothShutdownRequired";
     }