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:scalar-get-optimization into epics-base:7.0
From: Ben Franksen via Core-talk <core-talk at aps.anl.gov>
To: mp+381307 at code.launchpad.net
Date: Fri, 27 Mar 2020 15:09:24 -0000
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  <20202021  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  <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 ·