Known Bugs and Fixes for EPICS Release 3.13.6

dbEvent

A bug exists in dbEvent.c that can cause an IOC to go into an infinite loop. This can happen if a client has many undelivered monitors and cancels events. A patch is now available which fixes this problem in both R3.13.6 and R3.13.7.

To make the necessary source code changes, download the patch file from here (shift+click on that link in most browsers) and and copy it to the <base>/src/db directory. Then use the patch program to apply the change as follows:

zeus% patch < dbEvent.patch
  Looks like a unified context diff.
done

Finally run gnumake at the top of the base tree.

Device Support, which does not implement special_linconv, is broken

In release 3.13.5 changes were made to allow ESLO EOFF to be database design fields. Because of changes that were made to aiRecord and aoRecord device support that does not implement special_linconv may no longer work.

To fix aiRecord.c, in init_record replace

    if ((pai->linr == menuConvertLINEAR) && pdset->special_linconv) {

by

    if ((pai->eslo==1.0) && (pai->eoff==0.0)) {

To fix aoRecord.c, in init_record replace

    if ((pao->linr == menuConvertLINEAR) && pdset->special_linconv) {

by

    if ((pao->eslo==1.0) && (pao->eoff==0.0)) {

devAiCamac is the only device support supplied with base that is broken.

CA puts to disabled record

If a CA client issues a put to a disabled record then, when the record is enabled, database puts to the record will not make the record process until a CA put is again issued. The fix is:

diff -c -r1.89.4.6 dbAccess.c
*** dbAccess.c  2002/04/08 14:40:59     1.89.4.6
--- dbAccess.c  2002/05/02 20:09:15
***************
*** 607,612 ****
--- 607,613 ----
                if(*ptrace) printf("disabled:  %s\n",precord->name);
                /*take care of caching and notifyCompletion*/
                precord->rpro = FALSE;
+               precord->putf = FALSE;
                if (precord->ppn) dbNotifyCompletion(precord);
                /* raise disable alarm */
                if (precord->stat==DISABLE_ALARM) goto all_done;

dbb - database breakpoints

The database breakpoint facility is not working. This has probably been true for several releases. To fix it make the following change to /src/db/dbBkpt.c

diff -r1.9 dbBkpt.c
321c321,322
<      bkpt_stack_sem = semBCreate(SEM_Q_FIFO, SEM_FULL);
---
>      bkpt_stack_sem = semMCreate(
>         SEM_DELETE_SAFE|SEM_INVERSION_SAFE|SEM_Q_PRIORITY);

TPRO Trace Processing

If dbProcess is called recursively by different tasks, it does not properly handle TPRO. Consider the following database:

record(ao,"mrkao") {
    field(OUT,"mrkai CA")
    field(TPRO,"1")
}
record(ai,"mrkai") {
    field(TPRO,"1")
}

If a channel access put is sent to mrkao, no message is issued when mrkai is processed.

This will be fixed in the next release

TSconfigure

If in your st.cmd file you issue the command.

TSconfigure(0,0,0,0,0,0,1)

And set the TSE field of any record to a non zero value, then a crash will occur when recGblGetTimeStamp is called.

To fix this make the following change to /src/db/drvTS.c

diff -r1.28.2.5 drvTS.c
629a630
>         TSuserGet = TSuserGetJunk;

calcoutRecord

It was incorrectly using sevr instead of nsev. To fix this make the change

diff -r1.7.4.4 calcoutRecord.c
605c605
<         if (pcalc->sevr < INVALID_ALARM ) {
---
>         if (pcalc->nsev < INVALID_ALARM ) {

calcPerform

It is possible for calcPerform to return a nan (not a number). This can be fixed by changing /src/libCom/calcPerform.c
diff -r1.31.6.1 calcPerform.c
104a105,106
> #include        <private/mathP.h>  /* For isNan*/
> #define isnan isNan
517c519
<       return(0);
---
>       return((isnan(*presult) ? -1 : 0));