Experimental Physics and Industrial Control System
Ben Franksen has proposed merging ~bfrk/epics-base:scalar-get-optimization into epics-base:7.0 with ~bfrk/epics-base:write-filters 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/381307
The idea here is to make the special optimization for one-element get requests without options available to all code that calls dbChannelGet. It started out as an attempt to disentangle this logic from dbDbGetValue (this goal is indeed achieved) and then moved on from that point.
--
Your team EPICS Core Developers is requested to review the proposed merge of ~bfrk/epics-base:scalar-get-optimization into epics-base:7.0.
diff --git a/modules/database/src/ioc/db/dbAccess.c b/modules/database/src/ioc/db/dbAccess.c
index 1446ed5..2651361 100644
--- a/modules/database/src/ioc/db/dbAccess.c
+++ b/modules/database/src/ioc/db/dbAccess.c
@@ -912,6 +912,7 @@ long dbGet(DBADDR *paddr, short dbrType,
field_type = pfl->field_type;
no_elements = capacity = pfl->no_elements;
offset = pfl->offset;
+ /* we already called get_array_info when pfl was created */
}
if (field_type >= DBF_INLINK && field_type <= DBF_FWDLINK) {
diff --git a/modules/database/src/ioc/db/dbChannel.c b/modules/database/src/ioc/db/dbChannel.c
index e361f3b..49d81e8 100644
--- a/modules/database/src/ioc/db/dbChannel.c
+++ b/modules/database/src/ioc/db/dbChannel.c
@@ -31,6 +31,7 @@
#include "dbBase.h"
#include "dbChannel.h"
#include "dbCommon.h"
+#include "dbConvertFast.h"
#include "dbEvent.h"
#include "dbLock.h"
#include "dbStaticLib.h"
@@ -623,14 +624,59 @@ long dbChannelOpen(dbChannel *chan)
}
/* Only use dbChannelGet() if the record is already locked. */
-long dbChannelGet(dbChannel *chan, short type, void *pbuffer,
- long *options, long *nRequest, void *pfl)
+long dbChannelGet(dbChannel *chan, short dbrType, void *pbuffer,
+ long *options, long *nRequest, db_field_log *pfl)
{
- return dbGet(&chan->addr, type, pbuffer, options, nRequest, pfl);
+ dbAddr addr = chan->addr; /* structure copy */
+
+ if (pfl) {
+ addr.field_size = pfl->field_size;
+ addr.field_type = pfl->field_type;
+ addr.no_elements = pfl->no_elements;
+ switch ((enum dbfl_type)pfl->type) {
+ case dbfl_type_val: addr.pfield = &pfl->u.v.field; break;
+ case dbfl_type_ref: addr.pfield = pfl->u.r.field; break;
+ }
+ }
+
+ /*
+ * Note: if pfl is not NULL then we have already called get_array_info, and
+ * therefore dbGet doesn't. This means we already know the final number of
+ * elements and can therefore apply the special scalar optimization even if
+ * we have addr.special == SPC_DBADDR.
+ */
+ if (options
+ || addr.no_elements > 1
+ || (nRequest && *nRequest > 1)
+ || (!pfl && addr.special == SPC_DBADDR)
+ || addr.special == SPC_ATTRIBUTE)
+ {
+ chan->getCvt = NULL;
+ return dbGet(&addr, dbrType, pbuffer, options, nRequest, pfl);
+ }
+
+ /*
+ * Optimization for scalar requests with no options,
+ * no special attributes, and where the channel has only one element.
+ */
+ if (chan->getCvt && chan->lastGetdbrType == dbrType) {
+ return chan->getCvt(addr.pfield, pbuffer, &addr);
+ } else {
+ unsigned short dbfType = addr.field_type;
+
+ if (dbrType < 0 || dbrType > DBR_ENUM || dbfType > DBF_DEVICE)
+ return S_db_badDbrtype;
+
+ chan->getCvt = dbFastGetConvertRoutine[dbfType][dbrType];
+ chan->lastGetdbrType = dbrType;
+ if (nRequest)
+ *nRequest = addr.no_elements;
+ return chan->getCvt(addr.pfield, pbuffer, &addr);
+ }
}
long dbChannelGetField(dbChannel *chan, short dbrType, void *pbuffer,
- long *options, long *nRequest, void *pfl)
+ long *options, long *nRequest, db_field_log *pfl)
{
dbCommon *precord = chan->addr.precord;
long status = 0;
diff --git a/modules/database/src/ioc/db/dbChannel.h b/modules/database/src/ioc/db/dbChannel.h
index 6e98dee..48ec10b 100644
--- a/modules/database/src/ioc/db/dbChannel.h
+++ b/modules/database/src/ioc/db/dbChannel.h
@@ -49,6 +49,8 @@ typedef struct evSubscrip {
typedef struct chFilter chFilter;
+typedef long fastConvert(void *from, void *to, const dbAddr *paddr);
+
/* A dbChannel points to a record field, and can have multiple filters */
typedef struct dbChannel {
const char *name;
@@ -59,6 +61,9 @@ typedef struct dbChannel {
ELLLIST filters; /* list of filters as created from JSON */
ELLLIST pre_chain; /* list of filters to be called pre-event-queue */
ELLLIST post_chain; /* list of filters to be called post-event-queue */
+ /* Support for optimizing scalar requests */
+ fastConvert *getCvt; /* fast get conversion function */
+ short lastGetdbrType; /* last dbChannelGet dbrType */
} dbChannel;
/* Prototype for the channel event function that is called in filter stacks
@@ -208,9 +213,9 @@ epicsShareExtern unsigned short dbDBRnewToDBRold[];
epicsShareFunc long dbChannelGet(dbChannel *chan, short type,
- void *pbuffer, long *options, long *nRequest, void *pfl);
+ void *pbuffer, long *options, long *nRequest, db_field_log *pfl);
epicsShareFunc long dbChannelGetField(dbChannel *chan, short type,
- void *pbuffer, long *options, long *nRequest, void *pfl);
+ void *pbuffer, long *options, long *nRequest, db_field_log *pfl);
epicsShareFunc long dbChannelPut(dbChannel *chan, short type,
const void *pbuffer, long nRequest);
epicsShareFunc long dbChannelPutField(dbChannel *chan, short type,
diff --git a/modules/database/src/ioc/db/dbDbLink.c b/modules/database/src/ioc/db/dbDbLink.c
index 8677add..f589a94 100644
--- a/modules/database/src/ioc/db/dbDbLink.c
+++ b/modules/database/src/ioc/db/dbDbLink.c
@@ -57,7 +57,6 @@
#include "dbBase.h"
#include "dbBkpt.h"
#include "dbCommonPvt.h"
-#include "dbConvertFast.h"
#include "dbConvert.h"
#include "db_field_log.h"
#include "db_access_routines.h"
@@ -134,9 +133,7 @@ static void dbDbRemoveLink(struct dbLocker *locker, struct link *plink)
/* locker is NULL when an isolated IOC is closing its links */
if (locker) {
plink->value.pv_link.pvt = 0;
- plink->value.pv_link.getCvt = 0;
plink->value.pv_link.pvlMask = 0;
- plink->value.pv_link.lastGetdbrType = 0;
ellDelete(&precord->bklnk, &plink->value.pv_link.backlinknode);
dbLockSetSplit(locker, plink->precord, precord);
}
@@ -166,9 +163,10 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
{
struct pv_link *ppv_link = &plink->value.pv_link;
dbChannel *chan = linkChannel(plink);
- DBADDR *paddr = &chan->addr;
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 */
if (ppv_link->pvlMask & pvlOptPP) {
@@ -179,44 +177,25 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
/* If filters are involved in a read, create field log and run filters */
if (ellCount(&chan->filters)) {
- db_field_log *pfl;
-
- /*
- * For the moment, empty arrays are not supported by EPICS.
- * See the remark in src/std/filters/arr.c for details.
- */
- if (dbChannelFinalElements(chan) <= 0) /* empty array request */
- return S_db_badField;
pfl = db_create_read_log(chan);
if (!pfl)
return S_db_noMemory;
pfl = dbChannelRunPreChain(chan, pfl);
pfl = dbChannelRunPostChain(chan, pfl);
- status = dbChannelGet(chan, dbrType, pbuffer, NULL, pnRequest, pfl);
- db_delete_field_log(pfl);
- if (status)
- return status;
- if (pnRequest && *pnRequest <= 0) /* empty array result */
- return S_db_badField;
- } else if (ppv_link->getCvt && ppv_link->lastGetdbrType == dbrType) {
- status = ppv_link->getCvt(dbChannelField(chan), pbuffer, paddr);
- } else {
- unsigned short dbfType = dbChannelFinalFieldType(chan);
-
- if (dbrType < 0 || dbrType > DBR_ENUM || dbfType > DBF_DEVICE)
- return S_db_badDbrtype;
-
- if (dbChannelFinalElements(chan) == 1 && (!pnRequest || *pnRequest == 1)
- && dbChannelSpecial(chan) != SPC_DBADDR
- && dbChannelSpecial(chan) != SPC_ATTRIBUTE) {
- ppv_link->getCvt = dbFastGetConvertRoutine[dbfType][dbrType];
- status = ppv_link->getCvt(dbChannelField(chan), pbuffer, paddr);
- } else {
- ppv_link->getCvt = NULL;
- status = dbGet(paddr, dbrType, pbuffer, NULL, pnRequest, NULL);
- }
- ppv_link->lastGetdbrType = dbrType;
}
+ 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))
recGblInheritSevr(plink->value.pv_link.pvlMask & pvlOptMsMode,
diff --git a/modules/database/src/ioc/db/dbNotify.c b/modules/database/src/ioc/db/dbNotify.c
index e25ce4a..a24d03a 100644
--- a/modules/database/src/ioc/db/dbNotify.c
+++ b/modules/database/src/ioc/db/dbNotify.c
@@ -535,7 +535,6 @@ 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");
@@ -544,11 +543,11 @@ static void getCallback(processNotify *ppn,notifyGetType type)
switch(type) {
case getFieldType:
status = dbChannelGetField(ppn->chan, DBR_STRING, ptpnInfo->buffer,
- &options, &no_elements, 0);
+ 0, &no_elements, 0);
break;
case getType:
status = dbChannelGet(ppn->chan, DBR_STRING, ptpnInfo->buffer,
- &options, &no_elements, 0);
+ 0, &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 35712dd..5797c2a 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, &zero, nRequest, pfl);
+ status = dbChannelGet(chan, DBR_STRING, pbuffer, 0, nRequest, pfl);
break;
/* case(oldDBR_INT): */
case(oldDBR_SHORT):
- status = dbChannelGet(chan, DBR_SHORT, pbuffer, &zero, nRequest, pfl);
+ status = dbChannelGet(chan, DBR_SHORT, pbuffer, 0, nRequest, pfl);
break;
case(oldDBR_FLOAT):
- status = dbChannelGet(chan, DBR_FLOAT, pbuffer, &zero, nRequest, pfl);
+ status = dbChannelGet(chan, DBR_FLOAT, pbuffer, 0, nRequest, pfl);
break;
case(oldDBR_ENUM):
- status = dbChannelGet(chan, DBR_ENUM, pbuffer, &zero, nRequest, pfl);
+ status = dbChannelGet(chan, DBR_ENUM, pbuffer, 0, nRequest, pfl);
break;
case(oldDBR_CHAR):
- status = dbChannelGet(chan, DBR_CHAR, pbuffer, &zero, nRequest, pfl);
+ status = dbChannelGet(chan, DBR_CHAR, pbuffer, 0, nRequest, pfl);
break;
case(oldDBR_LONG):
- status = dbChannelGet(chan, DBR_LONG, pbuffer, &zero, nRequest, pfl);
+ status = dbChannelGet(chan, DBR_LONG, pbuffer, 0, nRequest, pfl);
break;
case(oldDBR_DOUBLE):
- status = dbChannelGet(chan, DBR_DOUBLE, pbuffer, &zero, nRequest, pfl);
+ status = dbChannelGet(chan, DBR_DOUBLE, pbuffer, 0, 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, &zero,
+ status = dbChannelGet(chan, DBR_STRING, pold->value, 0,
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, &zero,
+ status = dbChannelGet(chan, DBR_SHORT, &pold->value, 0,
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, &zero,
+ status = dbChannelGet(chan, DBR_FLOAT, &pold->value, 0,
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, &zero,
+ status = dbChannelGet(chan, DBR_ENUM, &pold->value, 0,
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, &zero,
+ status = dbChannelGet(chan, DBR_UCHAR, &pold->value, 0,
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, &zero,
+ status = dbChannelGet(chan, DBR_LONG, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -284,8 +284,7 @@ int dbChannel_get_count(
status = dbChannelGet(chan, DBR_DOUBLE, &newSt, &options, &zero, pfl);
pold->status = newSt.status;
pold->severity = newSt.severity;
- options = 0;
- status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -303,8 +302,7 @@ int dbChannel_get_count(
pold->status = newSt.status;
pold->severity = newSt.severity;
pold->stamp = newSt.time; /* structure copy */
- options = 0;
- status = dbChannelGet(chan, DBR_STRING, pold->value, &options,
+ status = dbChannelGet(chan, DBR_STRING, pold->value, 0,
nRequest, pfl);
}
break;
@@ -322,8 +320,7 @@ int dbChannel_get_count(
pold->status = newSt.status;
pold->severity = newSt.severity;
pold->stamp = newSt.time; /* structure copy */
- options = 0;
- status = dbChannelGet(chan, DBR_SHORT, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_SHORT, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -340,8 +337,7 @@ int dbChannel_get_count(
pold->status = newSt.status;
pold->severity = newSt.severity;
pold->stamp = newSt.time; /* structure copy */
- options = 0;
- status = dbChannelGet(chan, DBR_FLOAT, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_FLOAT, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -358,8 +354,7 @@ int dbChannel_get_count(
pold->status = newSt.status;
pold->severity = newSt.severity;
pold->stamp = newSt.time; /* structure copy */
- options = 0;
- status = dbChannelGet(chan, DBR_ENUM, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_ENUM, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -376,8 +371,7 @@ int dbChannel_get_count(
pold->status = newSt.status;
pold->severity = newSt.severity;
pold->stamp = newSt.time; /* structure copy */
- options = 0;
- status = dbChannelGet(chan, DBR_CHAR, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_CHAR, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -394,8 +388,7 @@ int dbChannel_get_count(
pold->status = newSt.status;
pold->severity = newSt.severity;
pold->stamp = newSt.time; /* structure copy */
- options = 0;
- status = dbChannelGet(chan, DBR_LONG, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_LONG, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -412,8 +405,7 @@ int dbChannel_get_count(
pold->status = newSt.status;
pold->severity = newSt.severity;
pold->stamp = newSt.time; /* structure copy */
- options = 0;
- status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -442,8 +434,7 @@ 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;
- options = 0;
- status = dbChannelGet(chan, DBR_SHORT, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_SHORT, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -472,8 +463,7 @@ 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);
- options = 0;
- status = dbChannelGet(chan, DBR_FLOAT, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_FLOAT, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -500,8 +490,7 @@ 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;
- options = 0;
- status = dbChannelGet(chan, DBR_UCHAR, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_UCHAR, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -527,8 +516,7 @@ 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;
- options = 0;
- status = dbChannelGet(chan, DBR_LONG, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_LONG, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -557,8 +545,7 @@ 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;
- options = 0;
- status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -590,8 +577,7 @@ 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;
- options = 0;
- status = dbChannelGet(chan, DBR_SHORT, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_SHORT, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -623,8 +609,7 @@ 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);
- options = 0;
- status = dbChannelGet(chan, DBR_FLOAT, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_FLOAT, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -650,8 +635,7 @@ 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*/
- options = 0;
- status = dbChannelGet(chan, DBR_ENUM, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_ENUM, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -681,8 +665,7 @@ 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;
- options = 0;
- status = dbChannelGet(chan, DBR_UCHAR, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_UCHAR, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -712,8 +695,7 @@ 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;
- options = 0;
- status = dbChannelGet(chan, DBR_LONG, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_LONG, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -745,8 +727,7 @@ 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;
- options = 0;
- status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, &options,
+ status = dbChannelGet(chan, DBR_DOUBLE, &pold->value, 0,
nRequest, pfl);
}
break;
@@ -764,9 +745,8 @@ 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,
- &options, nRequest, pfl);
+ 0, nRequest, pfl);
}
break;
diff --git a/modules/database/src/ioc/dbStatic/link.h b/modules/database/src/ioc/dbStatic/link.h
index 2e3c778..a55900d 100644
--- a/modules/database/src/ioc/dbStatic/link.h
+++ b/modules/database/src/ioc/dbStatic/link.h
@@ -77,15 +77,12 @@ struct macro_link {
};
struct dbCommon;
-typedef long (*LINKCVT)();
struct pv_link {
ELLNODE backlinknode;
char *pvname; /* pvname link points to */
void *pvt; /* CA or DB private */
- LINKCVT getCvt; /* input conversion function */
short pvlMask; /* Options mask */
- short lastGetdbrType; /* last dbrType for DB or CA get */
};
struct jlink;
- Replies:
- Re: [Merge] ~bfrk/epics-base:scalar-get-optimization into epics-base:7.0 Ben Franksen via Core-talk
- Re: [Merge] ~bfrk/epics-base:scalar-get-optimization into epics-base:7.0 mdavidsaver via Core-talk
- [Merge] ~bfrk/epics-base:scalar-get-optimization into epics-base:7.0 Ben Franksen via Core-talk
- Navigate by Date:
- Prev:
[Bug 1868486] Re: epicsMessageQueue lost messages rivers via Core-talk
- Next:
[Merge] ~bfrk/epics-base:zero-size-array-request into epics-base:7.0 Ben Franksen 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:
Build completed: EPICS Base base-3.15-570 AppVeyor via Core-talk
- Next:
Re: [Merge] ~bfrk/epics-base:scalar-get-optimization into epics-base:7.0 Ben Franksen 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