Experimental Physics and Industrial Control System
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
<2020>
2021
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
<2020>
2021
2022
2023
2024