EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024  Index 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0
From: Ben Franksen via Core-talk <core-talk at aps.anl.gov>
To: mp+381308 at code.launchpad.net
Date: Fri, 27 Mar 2020 15:13:26 -0000
Ben Franksen has proposed merging ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 with ~bfrk/epics-base:scalar-get-optimization as a prerequisite.

Requested reviews:
  EPICS Core Developers (epics-core)

For more details, see:
https://code.launchpad.net/~bfrk/epics-base/+git/epics-base/+merge/381308

The commit message says it all.
-- 
Your team EPICS Core Developers is requested to review the proposed merge of ~bfrk/epics-base:zero-size-array-request into epics-base:7.0.
diff --git a/modules/database/src/ioc/db/dbAccess.c b/modules/database/src/ioc/db/dbAccess.c
index 2651361..c159826 100644
--- a/modules/database/src/ioc/db/dbAccess.c
+++ b/modules/database/src/ioc/db/dbAccess.c
@@ -887,13 +887,20 @@ long dbGet(DBADDR *paddr, short dbrType,
     db_field_log *pfl = (db_field_log *)pflin;
     short field_type;
     long capacity, no_elements, offset;
+    int is_scalar_request = !nRequest;
+    long n_scalar_request = 1;
     rset *prset;
     long status = 0;
 
     if (options && *options)
         getOptions(paddr, &pbuf, options, pflin);
-    if (nRequest && *nRequest == 0)
+
+    if (is_scalar_request)
+        nRequest = &n_scalar_request;
+    else if (*nRequest == 0)
+        /* trivially succeed for zero length array request */
         return 0;
+    assert(nRequest && *nRequest > 0);
 
     if (!pfl) {
         field_type = paddr->field_type;
@@ -935,20 +942,20 @@ long dbGet(DBADDR *paddr, short dbrType,
         goto done;
     }
 
-    if (offset == 0 && (!nRequest || no_elements == 1)) {
-        if (nRequest)
-            *nRequest = 1;
+    /* A scalar request that cannot be met is an error. */
+    if (is_scalar_request && no_elements < 1) {
+        status = S_db_badField;
+        goto done;
+    }
+
+    if (offset == 0 && (is_scalar_request || no_elements == 1)) {
+        *nRequest = 1;
         if (!pfl) {
             status = dbFastGetConvertRoutine[field_type][dbrType]
                 (paddr->pfield, pbuf, paddr);
         } else {
             DBADDR localAddr = *paddr; /* Structure copy */
 
-            if (pfl->no_elements < 1) {
-                status = S_db_badField;
-                goto done;
-            }
-
             localAddr.field_type = pfl->field_type;
             localAddr.field_size = pfl->field_size;
             /* not used by dbFastConvert: */
@@ -964,13 +971,9 @@ long dbGet(DBADDR *paddr, short dbrType,
         long n;
         GETCONVERTFUNC convert;
 
-        if (nRequest) {
-            if (no_elements < *nRequest)
-                *nRequest = no_elements;
-            n = *nRequest;
-        } else {
-            n = 1;
-        }
+        if (no_elements < *nRequest)
+            *nRequest = no_elements;
+        n = *nRequest;
         convert = dbGetConvertRoutine[field_type][dbrType];
         if (!convert) {
             char message[80];
@@ -1000,10 +1003,10 @@ long dbGet(DBADDR *paddr, short dbrType,
             status = convert(&localAddr, pbuf, n, capacity, offset);
         }
 
-        if(!status && dbrType==DBF_CHAR && nRequest &&
+        if(!status && dbrType==DBF_CHAR && !is_scalar_request &&
                 paddr->pfldDes && paddr->pfldDes->field_type==DBF_STRING)
         {
-            /* long string ensure nil and truncate to actual length */
+            /* long string: ensure termination and truncate to actual length */
             long nReq = *nRequest;
             pbuf[nReq-1] = '\0';
             *nRequest = strlen(pbuf)+1;
diff --git a/modules/database/src/ioc/db/dbChannel.c b/modules/database/src/ioc/db/dbChannel.c
index 49d81e8..e22ea2f 100644
--- a/modules/database/src/ioc/db/dbChannel.c
+++ b/modules/database/src/ioc/db/dbChannel.c
@@ -655,6 +655,10 @@ long dbChannelGet(dbChannel *chan, short dbrType, void *pbuffer,
         return dbGet(&addr, dbrType, pbuffer, options, nRequest, pfl);
     }
 
+    /* If this is a scalar request, fail if it cannot be met */
+    if (!nRequest && addr.no_elements < 1)
+        return S_db_badField;
+
     /*
      * Optimization for scalar requests with no options,
      * no special attributes, and where the channel has only one element.
diff --git a/modules/database/src/ioc/db/dbDbLink.c b/modules/database/src/ioc/db/dbDbLink.c
index f589a94..21dea0c 100644
--- a/modules/database/src/ioc/db/dbDbLink.c
+++ b/modules/database/src/ioc/db/dbDbLink.c
@@ -165,7 +165,6 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
     dbChannel *chan = linkChannel(plink);
     dbCommon *precord = plink->precord;
     long status;
-    long nRequest = 1; /* used if pnRequest == NULL */
     db_field_log *pfl = NULL;
 
     /* scan passive records if link is process passive  */
@@ -183,21 +182,13 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
         pfl = dbChannelRunPreChain(chan, pfl);
         pfl = dbChannelRunPostChain(chan, pfl);
     }
-    if (!pnRequest)
-        pnRequest = &nRequest;
     status = dbChannelGet(chan, dbrType, pbuffer, NULL, pnRequest, pfl);
     if (pfl)
         db_delete_field_log(pfl);
     if (status)
         return status;
-    /*
-     * For the moment, empty arrays are not supported by EPICS.
-     * See the remark in src/std/filters/arr.c for details.
-     */
-    if (*pnRequest <= 0) /* empty array result */
-        return S_db_badField;
 
-    if (!status && precord != dbChannelRecord(chan))
+    if (precord != dbChannelRecord(chan))
         recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode,
             plink->precord,
             dbChannelRecord(chan)->stat, dbChannelRecord(chan)->sevr);
diff --git a/modules/database/src/ioc/db/dbNotify.c b/modules/database/src/ioc/db/dbNotify.c
index a24d03a..e25ce4a 100644
--- a/modules/database/src/ioc/db/dbNotify.c
+++ b/modules/database/src/ioc/db/dbNotify.c
@@ -535,6 +535,7 @@ static void getCallback(processNotify *ppn,notifyGetType type)
     tpnInfo *ptpnInfo = (tpnInfo *)ppn->usrPvt;
     int status = 0;
     long no_elements = 1;
+    long options = 0;
 
     if(ppn->status==notifyCanceled) {
         printf("dbtpn:getCallback notifyCanceled\n");
@@ -543,11 +544,11 @@ static void getCallback(processNotify *ppn,notifyGetType type)
     switch(type) {
     case getFieldType:
         status = dbChannelGetField(ppn->chan, DBR_STRING, ptpnInfo->buffer,
-            0, &no_elements, 0);
+            &options, &no_elements, 0);
         break;
     case getType:
         status = dbChannelGet(ppn->chan, DBR_STRING, ptpnInfo->buffer,
-            0, &no_elements, 0);
+            &options, &no_elements, 0);
         break;
     }
     if (status) {
diff --git a/modules/database/src/ioc/db/db_access.c b/modules/database/src/ioc/db/db_access.c
index 5797c2a..35712dd 100644
--- a/modules/database/src/ioc/db/db_access.c
+++ b/modules/database/src/ioc/db/db_access.c
@@ -158,26 +158,26 @@ int dbChannel_get_count(
 
     switch(buffer_type) {
     case(oldDBR_STRING):
-        status = dbChannelGet(chan, DBR_STRING, pbuffer, 0, nRequest, pfl);
+        status = dbChannelGet(chan, DBR_STRING, pbuffer, &zero, nRequest, pfl);
         break;
 /*  case(oldDBR_INT): */
     case(oldDBR_SHORT):
-        status = dbChannelGet(chan, DBR_SHORT, pbuffer, 0, nRequest, pfl);
+        status = dbChannelGet(chan, DBR_SHORT, pbuffer, &zero, nRequest, pfl);
         break;
     case(oldDBR_FLOAT):
-        status = dbChannelGet(chan, DBR_FLOAT, pbuffer, 0, nRequest, pfl);
+        status = dbChannelGet(chan, DBR_FLOAT, pbuffer, &zero, nRequest, pfl);
         break;
     case(oldDBR_ENUM):
-        status = dbChannelGet(chan, DBR_ENUM, pbuffer, 0, nRequest, pfl);
+        status = dbChannelGet(chan, DBR_ENUM, pbuffer, &zero, nRequest, pfl);
         break;
     case(oldDBR_CHAR):
-        status = dbChannelGet(chan, DBR_CHAR, pbuffer, 0, nRequest, pfl);
+        status = dbChannelGet(chan, DBR_CHAR, pbuffer, &zero, nRequest, pfl);
         break;
     case(oldDBR_LONG):
-        status = dbChannelGet(chan, DBR_LONG, pbuffer, 0, nRequest, pfl);
+        status = dbChannelGet(chan, DBR_LONG, pbuffer, &zero, nRequest, pfl);
         break;
     case(oldDBR_DOUBLE):
-        status = dbChannelGet(chan, DBR_DOUBLE, pbuffer, 0, nRequest, pfl);
+        status = dbChannelGet(chan, DBR_DOUBLE, pbuffer, &zero, nRequest, pfl);
         break;
 
     case(oldDBR_STS_STRING):
@@ -193,7 +193,7 @@ int dbChannel_get_count(
             status = dbChannelGet(chan, DBR_STRING, &newSt, &options, &zero, pfl);
             pold->status = newSt.status;
             pold->severity = newSt.severity;
-            status = dbChannelGet(chan, DBR_STRING, pold->value, 0,
+            status = dbChannelGet(chan, DBR_STRING, pold->value, &zero,
                 nRequest, pfl);
         }
         break;
@@ -209,7 +209,7 @@ int dbChannel_get_count(
             status = dbChannelGet(chan, DBR_SHORT, &newSt, &options, &zero, pfl);
             pold->status = newSt.status;
             pold->severity = newSt.severity;
-            status = dbChannelGet(chan, DBR_SHORT, &pold->value, 0,
+            status = dbChannelGet(chan, DBR_SHORT, &pold->value, &zero,
                 nRequest, pfl);
         }
         break;
@@ -224,7 +224,7 @@ int dbChannel_get_count(
             status = dbChannelGet(chan, DBR_FLOAT, &newSt, &options, &zero, pfl);
             pold->status = newSt.status;
             pold->severity = newSt.severity;
-            status = dbChannelGet(chan, DBR_FLOAT, &pold->value, 0,
+            status = dbChannelGet(chan, DBR_FLOAT, &pold->value, &zero,
                 nRequest, pfl);
         }
         break;
@@ -239,7 +239,7 @@ int dbChannel_get_count(
             status = dbChannelGet(chan, DBR_ENUM, &newSt, &options, &zero, pfl);
             pold->status = newSt.status;
             pold->severity = newSt.severity;
-            status = dbChannelGet(chan, DBR_ENUM, &pold->value, 0,
+            status = dbChannelGet(chan, DBR_ENUM, &pold->value, &zero,
                 nRequest, pfl);
         }
         break;
@@ -254,7 +254,7 @@ int dbChannel_get_count(
             status = dbChannelGet(chan, DBR_UCHAR, &newSt, &options, &zero, pfl);
             pold->status = newSt.status;
             pold->severity = newSt.severity;
-            status = dbChannelGet(chan, DBR_UCHAR, &pold->value, 0,
+            status = dbChannelGet(chan, DBR_UCHAR, &pold->value, &zero,
                 nRequest, pfl);
         }
         break;
@@ -269,7 +269,7 @@ int dbChannel_get_count(
             status = dbChannelGet(chan, DBR_LONG, &newSt, &options, &zero, pfl);
             pold->status = newSt.status;
             pold->severity = newSt.severity;
-            status = dbChannelGet(chan, DBR_LONG, &pold->value, 0,
+            status = dbChannelGet(chan, DBR_LONG, &pold->value, &zero,
                 nRequest, pfl);
         }
         break;
@@ -284,7 +284,8 @@ int dbChannel_get_count(
             status = dbChannelGet(chan, DBR_DOUBLE, &newSt, &options, &zero, pfl);
             pold->status = newSt.status;
             pold->severity = newSt.severity;
-            status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -302,7 +303,8 @@ int dbChannel_get_count(
             pold->status = newSt.status;
             pold->severity = newSt.severity;
             pold->stamp = newSt.time;         /* structure copy */
-            status = dbChannelGet(chan, DBR_STRING, pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_STRING, pold->value, &options,
                     nRequest, pfl);
         }
         break;
@@ -320,7 +322,8 @@ int dbChannel_get_count(
             pold->status = newSt.status;
             pold->severity = newSt.severity;
             pold->stamp = newSt.time;         /* structure copy */
-            status = dbChannelGet(chan, DBR_SHORT, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_SHORT, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -337,7 +340,8 @@ int dbChannel_get_count(
             pold->status = newSt.status;
             pold->severity = newSt.severity;
             pold->stamp = newSt.time;         /* structure copy */
-            status = dbChannelGet(chan, DBR_FLOAT, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_FLOAT, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -354,7 +358,8 @@ int dbChannel_get_count(
             pold->status = newSt.status;
             pold->severity = newSt.severity;
             pold->stamp = newSt.time;         /* structure copy */
-            status = dbChannelGet(chan, DBR_ENUM, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_ENUM, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -371,7 +376,8 @@ int dbChannel_get_count(
             pold->status = newSt.status;
             pold->severity = newSt.severity;
             pold->stamp = newSt.time;         /* structure copy */
-            status = dbChannelGet(chan, DBR_CHAR, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_CHAR, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -388,7 +394,8 @@ int dbChannel_get_count(
             pold->status = newSt.status;
             pold->severity = newSt.severity;
             pold->stamp = newSt.time;         /* structure copy */
-            status = dbChannelGet(chan, DBR_LONG, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_LONG, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -405,7 +412,8 @@ int dbChannel_get_count(
             pold->status = newSt.status;
             pold->severity = newSt.severity;
             pold->stamp = newSt.time;         /* structure copy */
-            status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -434,7 +442,8 @@ int dbChannel_get_count(
             pold->upper_warning_limit = newSt.upper_warning_limit;
             pold->lower_warning_limit = newSt.lower_warning_limit;
             pold->lower_alarm_limit = newSt.lower_alarm_limit;
-            status = dbChannelGet(chan, DBR_SHORT, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_SHORT, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -463,7 +472,8 @@ int dbChannel_get_count(
             pold->lower_alarm_limit = epicsConvertDoubleToFloat(newSt.lower_alarm_limit);
             pold->upper_warning_limit = epicsConvertDoubleToFloat(newSt.upper_warning_limit);
             pold->lower_warning_limit = epicsConvertDoubleToFloat(newSt.lower_warning_limit);
-            status = dbChannelGet(chan, DBR_FLOAT, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_FLOAT, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -490,7 +500,8 @@ int dbChannel_get_count(
             pold->upper_warning_limit = newSt.upper_warning_limit;
             pold->lower_warning_limit = newSt.lower_warning_limit;
             pold->lower_alarm_limit = newSt.lower_alarm_limit;
-            status = dbChannelGet(chan, DBR_UCHAR, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_UCHAR, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -516,7 +527,8 @@ int dbChannel_get_count(
             pold->upper_warning_limit = newSt.upper_warning_limit;
             pold->lower_warning_limit = newSt.lower_warning_limit;
             pold->lower_alarm_limit = newSt.lower_alarm_limit;
-            status = dbChannelGet(chan, DBR_LONG, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_LONG, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -545,7 +557,8 @@ int dbChannel_get_count(
             pold->upper_warning_limit = newSt.upper_warning_limit;
             pold->lower_warning_limit = newSt.lower_warning_limit;
             pold->lower_alarm_limit = newSt.lower_alarm_limit;
-            status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -577,7 +590,8 @@ int dbChannel_get_count(
             pold->lower_alarm_limit = newSt.lower_alarm_limit;
             pold->upper_ctrl_limit = newSt.upper_ctrl_limit;
             pold->lower_ctrl_limit = newSt.lower_ctrl_limit;
-            status = dbChannelGet(chan, DBR_SHORT, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_SHORT, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -609,7 +623,8 @@ int dbChannel_get_count(
             pold->lower_warning_limit = epicsConvertDoubleToFloat(newSt.lower_warning_limit);
             pold->upper_ctrl_limit = epicsConvertDoubleToFloat(newSt.upper_ctrl_limit);
             pold->lower_ctrl_limit = epicsConvertDoubleToFloat(newSt.lower_ctrl_limit);
-            status = dbChannelGet(chan, DBR_FLOAT, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_FLOAT, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -635,7 +650,8 @@ int dbChannel_get_count(
             for (i = 0; i < no_str; i++)
                 strncpy(pold->strs[i], newSt.strs[i], sizeof(pold->strs[i]));
             /*now get values*/
-            status = dbChannelGet(chan, DBR_ENUM, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_ENUM, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -665,7 +681,8 @@ int dbChannel_get_count(
             pold->lower_alarm_limit = newSt.lower_alarm_limit;
             pold->upper_ctrl_limit = newSt.upper_ctrl_limit;
             pold->lower_ctrl_limit = newSt.lower_ctrl_limit;
-            status = dbChannelGet(chan, DBR_UCHAR, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_UCHAR, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -695,7 +712,8 @@ int dbChannel_get_count(
             pold->lower_alarm_limit = newSt.lower_alarm_limit;
             pold->upper_ctrl_limit = newSt.upper_ctrl_limit;
             pold->lower_ctrl_limit = newSt.lower_ctrl_limit;
-            status = dbChannelGet(chan, DBR_LONG, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_LONG, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -727,7 +745,8 @@ int dbChannel_get_count(
             pold->lower_alarm_limit = newSt.lower_alarm_limit;
             pold->upper_ctrl_limit = newSt.upper_ctrl_limit;
             pold->lower_ctrl_limit = newSt.lower_ctrl_limit;
-            status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, 0,
+            options = 0;
+            status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, &options,
                 nRequest, pfl);
         }
         break;
@@ -745,8 +764,9 @@ int dbChannel_get_count(
             pold->severity = newSt.severity;
             pold->ackt = newSt.ackt;
             pold->acks = newSt.acks;
+            options = 0;
             status = dbChannelGet(chan, DBR_STRING, pold->value,
-                0, nRequest, pfl);
+                &options, nRequest, pfl);
         }
         break;
 
diff --git a/modules/database/src/std/filters/arr.c b/modules/database/src/std/filters/arr.c
index b90335e..299bbe0 100644
--- a/modules/database/src/std/filters/arr.c
+++ b/modules/database/src/std/filters/arr.c
@@ -130,20 +130,11 @@ static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl)
             pfl->u.r.dtor = freeArray;
             pfl->u.r.pvt = my->arrayFreeList;
         }
-        /* adjust offset and no_elements to refer to the new pTarget */
-        pfl->offset = 0;
         /*
-         * Setting pfl->no_elements outside of the "if" clause above is
-         * done to make requests fail if nTarget is zero, that is, if all
-         * elements selected by the filter are outside the array bounds.
-         * TODO:
-         * It would be possible to lift this restriction by interpreting
-         * a request with *no* number of elements (NULL pointer) as scalar
-         * (meaning: fail if we get less than one element); in contrast,
-         * a request that explicitly specifies one element would be
-         * interpreted as an array request, for which zero elements would
-         * be a normal expected result.
+         * Adjust offset and no_elements to refer to the new pTarget.
+         * (If zero elements remain, they need not refer to anything.)
          */
+        pfl->offset = 0;
         pfl->no_elements = nTarget;
         if (must_lock)
             dbScanUnlock(dbChannelRecord(chan));
diff --git a/modules/database/test/std/rec/linkFilterTest.c b/modules/database/test/std/rec/linkFilterTest.c
index 6f38d24..c43373f 100644
--- a/modules/database/test/std/rec/linkFilterTest.c
+++ b/modules/database/test/std/rec/linkFilterTest.c
@@ -105,7 +105,7 @@ MAIN(linkFilterTest)
     testDiag("backward range");
     changeRange(5,3,0);
     expectProcFailure("ai");
-    expectProcFailure("wf");
+    expectProcSuccess("wf");
 
     testDiag("step 2");
     changeRange(1,6,2);
@@ -116,7 +116,7 @@ MAIN(linkFilterTest)
     testDiag("range start beyond src.NORD");
     changeRange(8,9,0);
     expectProcFailure("ai");
-    expectProcFailure("wf");
+    expectProcSuccess("wf");
 
     testDiag("range end beyond src.NORD");
     changeRange(3,9,0);
@@ -127,7 +127,7 @@ MAIN(linkFilterTest)
     testDiag("range start beyond src.NELM");
     changeRange(11,12,0);
     expectProcFailure("ai");
-    expectProcFailure("wf");
+    expectProcSuccess("wf");
 
     testDiag("range end beyond src.NELM");
     changeRange(4,12,0);
@@ -138,7 +138,7 @@ MAIN(linkFilterTest)
     testDiag("single value beyond src.NORD");
     changeRange(8,0,0);
     expectProcFailure("ai");
-    expectProcFailure("wf");
+    expectProcSuccess("wf");
 
     testDiag("single value");
     changeRange(5,0,0);
@@ -149,7 +149,7 @@ MAIN(linkFilterTest)
     testDiag("single beyond rec.NELM");
     changeRange(12,0,0);
     expectProcFailure("ai");
-    expectProcFailure("wf");
+    expectProcSuccess("wf");
 
     testIocShutdownOk();
     testdbCleanup();

Replies:
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ralph Lange via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ben Franksen via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ben Franksen via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ben Franksen via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 mdavidsaver via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ben Franksen via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 mdavidsaver via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 mdavidsaver via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ben Franksen via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ben Franksen via Core-talk
Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 mdavidsaver via Core-talk

Navigate by Date:
Prev: [Merge] ~bfrk/epics-base:scalar-get-optimization into epics-base:7.0 Ben Franksen via Core-talk
Next: Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ralph Lange via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
Navigate by Thread:
Prev: Re: [Merge] ~bfrk/epics-base:scalar-get-optimization into epics-base:7.0 Ben Franksen via Core-talk
Next: Re: [Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ralph Lange via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
ANJ, 14 Apr 2020 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·