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  <20192020  2021  2022  2023  2024  Index 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: [Merge] ~anj/epics-base/+git/base-7.0:typed-dsets into epics-base:7.0
From: Andrew Johnson via Core-talk <[email protected]>
To: [email protected]
Date: Sun, 24 Nov 2019 04:56:22 -0000
Andrew Johnson has proposed merging ~anj/epics-base/+git/base-7.0:typed-dsets into epics-base:7.0.

Commit message:
Start adding typed dset declarations to the Record.h files and converting the code to use them.

Requested reviews:
  EPICS Core Developers (epics-core)

For more details, see:
https://code.launchpad.net/~anj/epics-base/+git/base-7.0/+merge/375934

I've started looking at how we could introduce record-specific fully-typed dset declarations into the record.dbd files. My lsi, lso and printf record types already declared their dset structures inside their Record.h files, but those dsets were not typed and didn't derive from the generic dset, so I started out by making them use the generic dset and work when USE_TYPED_DSET is defined. All internal device support layers were converted in the same commit. Then I added dset declarations for the int64in and int64out record types, and converted their record and device code too.

There are very few external device supports for these record types. The latest ether_ip driver supports lsi/lso, and asyn has support for the int64 record types, and both those modules build against this version of Base with no issues. However these device support layers are still defining their own dset structures for all record types.

In order to simplify writing device support that works with earlier Base versions I also define the macro HAS_<record>dset in the Record.h file.

My dset declarations look slightly different than the originals but result in an identical layout; I embed a generic dset object at the beginning of the record's dset, which requires some changes inside the Record.c code to access the generic members inside the embedded dset. The device support definition also has to add an extra pair of braces around the common members, so this requires some extra changes in the device support but means that the record dsets don't have to define the generic members at all, removing another potential source of typos/errors.

Please comment on the various aspects of this approach as described above. If approved, converting the other record types to use the same approach could become a codeathon project. I would add release notes showing how to convert record types and device support layers before merging this branch.

-- 
Your team EPICS Core Developers is requested to review the proposed merge of ~anj/epics-base/+git/base-7.0:typed-dsets into epics-base:7.0.
diff --git a/modules/database/src/std/dev/Makefile b/modules/database/src/std/dev/Makefile
index ec3713b..40f68b8 100644
--- a/modules/database/src/std/dev/Makefile
+++ b/modules/database/src/std/dev/Makefile
@@ -28,11 +28,15 @@ dbRecStd_SRCS += devBoDbState.c
 dbRecStd_SRCS += devCalcoutSoft.c
 dbRecStd_SRCS += devEventSoft.c
 dbRecStd_SRCS += devHistogramSoft.c
+devI64inSoft_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devI64inSoft.c
+devI64outSoft_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devI64outSoft.c
 dbRecStd_SRCS += devLiSoft.c
 dbRecStd_SRCS += devLoSoft.c
+devLsiSoft_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devLsiSoft.c
+devLsoSoft_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devLsoSoft.c
 dbRecStd_SRCS += devMbbiDirectSoft.c
 dbRecStd_SRCS += devMbbiDirectSoftRaw.c
@@ -42,6 +46,7 @@ dbRecStd_SRCS += devMbboDirectSoft.c
 dbRecStd_SRCS += devMbboDirectSoftRaw.c
 dbRecStd_SRCS += devMbboSoft.c
 dbRecStd_SRCS += devMbboSoftRaw.c
+devPrintfSoft_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devPrintfSoft.c
 dbRecStd_SRCS += devSASoft.c
 dbRecStd_SRCS += devSiSoft.c
@@ -51,6 +56,7 @@ dbRecStd_SRCS += devGeneralTime.c
 
 dbRecStd_SRCS += devAiSoftCallback.c
 dbRecStd_SRCS += devBiSoftCallback.c
+devI64inSoftCallback_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devI64inSoftCallback.c
 dbRecStd_SRCS += devLiSoftCallback.c
 dbRecStd_SRCS += devMbbiDirectSoftCallback.c
@@ -60,16 +66,21 @@ dbRecStd_SRCS += devSiSoftCallback.c
 dbRecStd_SRCS += devAoSoftCallback.c
 dbRecStd_SRCS += devBoSoftCallback.c
 dbRecStd_SRCS += devCalcoutSoftCallback.c
+devI64outSoftCallback_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devI64outSoftCallback.c
 dbRecStd_SRCS += devLoSoftCallback.c
+devLsoSoftCallback_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devLsoSoftCallback.c
 dbRecStd_SRCS += devMbboSoftCallback.c
 dbRecStd_SRCS += devMbboDirectSoftCallback.c
+devPrintfSoftCallback_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devPrintfSoftCallback.c
 dbRecStd_SRCS += devSoSoftCallback.c
 
 dbRecStd_SRCS += devTimestamp.c
+devStdio_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devStdio.c
+devEnviron_CFLAGS += -DUSE_TYPED_DSET
 dbRecStd_SRCS += devEnviron.c
 
 dbRecStd_SRCS += asSubRecordFunctions.c
diff --git a/modules/database/src/std/dev/devEnviron.c b/modules/database/src/std/dev/devEnviron.c
index 9672d6c..69c9a3d 100644
--- a/modules/database/src/std/dev/devEnviron.c
+++ b/modules/database/src/std/dev/devEnviron.c
@@ -69,7 +69,7 @@ static long read_lsi(lsiRecord *prec)
 }
 
 lsidset devLsiEnviron = {
-    5, NULL, init_lsi, NULL, NULL, read_lsi
+    {5, NULL, init_lsi, NULL, NULL }, read_lsi
 };
 epicsExportAddress(dset, devLsiEnviron);
 
diff --git a/modules/database/src/std/dev/devI64inSoft.c b/modules/database/src/std/dev/devI64inSoft.c
index 8d4ad90..76a049b 100644
--- a/modules/database/src/std/dev/devI64inSoft.c
+++ b/modules/database/src/std/dev/devI64inSoft.c
@@ -24,29 +24,9 @@
 #include "int64inRecord.h"
 #include "epicsExport.h"
 
-/* Create the dset for devI64inSoft */
-static long init_record(int64inRecord *prec);
-static long read_int64in(int64inRecord *prec);
-
-struct {
-    long      number;
-    DEVSUPFUN report;
-    DEVSUPFUN init;
-    DEVSUPFUN init_record;
-    DEVSUPFUN get_ioint_info;
-    DEVSUPFUN read_int64in;
-} devI64inSoft = {
-    5,
-    NULL,
-    NULL,
-    init_record,
-    NULL,
-    read_int64in
-};
-epicsExportAddress(dset, devI64inSoft);
-
-static long init_record(int64inRecord *prec)
+static long init_record(dbCommon *common)
 {
+    int64inRecord *prec = (int64inRecord *)common;
     if (recGblInitConstantLink(&prec->inp, DBF_INT64, &prec->val))
         prec->udf = FALSE;
 
@@ -76,3 +56,11 @@ static long read_int64in(int64inRecord *prec)
 
     return status;
 }
+
+/* Create the dset for devI64inSoft */
+
+int64indset devI64inSoft = {
+    { 5, NULL, NULL, init_record, NULL }, read_int64in
+};
+epicsExportAddress(dset, devI64inSoft);
+
diff --git a/modules/database/src/std/dev/devI64inSoftCallback.c b/modules/database/src/std/dev/devI64inSoftCallback.c
index 9eb5656..d93f8c9 100644
--- a/modules/database/src/std/dev/devI64inSoftCallback.c
+++ b/modules/database/src/std/dev/devI64inSoftCallback.c
@@ -151,8 +151,9 @@ static long init(int pass)
     return 0;
 }
 
-static long init_record(int64inRecord *prec)
+static long init_record(dbCommon *common)
 {
+    int64inRecord *prec = (int64inRecord *)common;
     if (recGblInitConstantLink(&prec->inp, DBR_INT64, &prec->val))
         prec->udf = FALSE;
 
@@ -204,11 +205,7 @@ static long read_int64in(int64inRecord *prec)
 }
 
 /* Create the dset for devI64inSoftCallback */
-struct {
-    dset common;
-    DEVSUPFUN read_int64in;
-} devI64inSoftCallback = {
-    {5, NULL, init, init_record, NULL},
-    read_int64in
+int64indset devI64inSoftCallback = {
+    { 5, NULL, init, init_record, NULL }, read_int64in
 };
 epicsExportAddress(dset, devI64inSoftCallback);
diff --git a/modules/database/src/std/dev/devI64outSoft.c b/modules/database/src/std/dev/devI64outSoft.c
index f9ac70a..f94b908 100644
--- a/modules/database/src/std/dev/devI64outSoft.c
+++ b/modules/database/src/std/dev/devI64outSoft.c
@@ -25,27 +25,7 @@
 #include "int64outRecord.h"
 #include "epicsExport.h"
 
-/* Create the dset for devI64outSoft */
-static long init_record(int64outRecord *prec);
-static long write_int64out(int64outRecord *prec);
-struct {
-    long number;
-    DEVSUPFUN report;
-    DEVSUPFUN init;
-    DEVSUPFUN init_record;
-    DEVSUPFUN get_ioint_info;
-    DEVSUPFUN write_int64out;
-} devI64outSoft = {
-    5,
-    NULL,
-    NULL,
-    init_record,
-    NULL,
-    write_int64out
-};
-epicsExportAddress(dset, devI64outSoft);
-
-static long init_record(int64outRecord *prec)
+static long init_record(dbCommon *common)
 {
     return 0;
 }
@@ -55,3 +35,10 @@ static long write_int64out(int64outRecord *prec)
     dbPutLink(&prec->out, DBR_INT64, &prec->val,1);
     return 0;
 }
+
+/* Create the dset for devI64outSoft */
+int64outdset devI64outSoft = {
+    { 5, NULL, NULL, init_record, NULL }, write_int64out
+};
+epicsExportAddress(dset, devI64outSoft);
+
diff --git a/modules/database/src/std/dev/devI64outSoftCallback.c b/modules/database/src/std/dev/devI64outSoftCallback.c
index e8041a2..3ad717d 100644
--- a/modules/database/src/std/dev/devI64outSoftCallback.c
+++ b/modules/database/src/std/dev/devI64outSoftCallback.c
@@ -25,25 +25,6 @@
 #include "int64outRecord.h"
 #include "epicsExport.h"
 
-/* Create the dset for devI64outSoftCallback */
-static long write_int64out(int64outRecord *prec);
-struct {
-    long		number;
-    DEVSUPFUN	report;
-    DEVSUPFUN	init;
-    DEVSUPFUN	init_record;
-    DEVSUPFUN	get_ioint_info;
-    DEVSUPFUN	write_int64out;
-} devI64outSoftCallback = {
-    5,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    write_int64out
-};
-epicsExportAddress(dset, devI64outSoftCallback);
-
 static long write_int64out(int64outRecord *prec)
 {
     struct link *plink = &prec->out;
@@ -60,3 +41,9 @@ static long write_int64out(int64outRecord *prec)
 
     return status;
 }
+
+/* Create the dset for devI64outSoftCallback */
+int64outdset devI64outSoftCallback = {
+    { 5, NULL, NULL, NULL, NULL }, write_int64out
+};
+epicsExportAddress(dset, devI64outSoftCallback);
diff --git a/modules/database/src/std/dev/devLsiSoft.c b/modules/database/src/std/dev/devLsiSoft.c
index 3076c99..d7c5021 100644
--- a/modules/database/src/std/dev/devLsiSoft.c
+++ b/modules/database/src/std/dev/devLsiSoft.c
@@ -17,8 +17,9 @@
 #include "lsiRecord.h"
 #include "epicsExport.h"
 
-static long init_record(lsiRecord *prec)
+static long init_record(dbCommon *common)
 {
+    lsiRecord *prec = (lsiRecord *)common;
     dbLoadLinkLS(&prec->inp, prec->val, prec->sizv, &prec->len);
 
     return 0;
@@ -49,6 +50,6 @@ static long read_string(lsiRecord *prec)
 }
 
 lsidset devLsiSoft = {
-    5, NULL, NULL, init_record, NULL, read_string
+    { 5, NULL, NULL, init_record, NULL }, read_string
 };
 epicsExportAddress(dset, devLsiSoft);
diff --git a/modules/database/src/std/dev/devLsoSoft.c b/modules/database/src/std/dev/devLsoSoft.c
index 02079a0..2f6f6ab 100644
--- a/modules/database/src/std/dev/devLsoSoft.c
+++ b/modules/database/src/std/dev/devLsoSoft.c
@@ -21,6 +21,6 @@ static long write_string(lsoRecord *prec)
 }
 
 lsodset devLsoSoft = {
-    5, NULL, NULL, NULL, NULL, write_string
+    { 5, NULL, NULL, NULL, NULL }, write_string
 };
 epicsExportAddress(dset, devLsoSoft);
diff --git a/modules/database/src/std/dev/devLsoSoftCallback.c b/modules/database/src/std/dev/devLsoSoftCallback.c
index 59579d5..08fca77 100644
--- a/modules/database/src/std/dev/devLsoSoftCallback.c
+++ b/modules/database/src/std/dev/devLsoSoftCallback.c
@@ -40,7 +40,7 @@ static long write_string(lsoRecord *prec)
 }
 
 lsodset devLsoSoftCallback = {
-    5, NULL, NULL, NULL, NULL, write_string
+    { 5, NULL, NULL, NULL, NULL }, write_string
 };
 epicsExportAddress(dset, devLsoSoftCallback);
 
diff --git a/modules/database/src/std/dev/devPrintfSoft.c b/modules/database/src/std/dev/devPrintfSoft.c
index ca06f04..053b6e4 100644
--- a/modules/database/src/std/dev/devPrintfSoft.c
+++ b/modules/database/src/std/dev/devPrintfSoft.c
@@ -19,7 +19,7 @@ static long write_string(printfRecord *prec)
 }
 
 printfdset devPrintfSoft = {
-    5, NULL, NULL, NULL, NULL, write_string
+    { 5, NULL, NULL, NULL, NULL }, write_string
 };
 epicsExportAddress(dset, devPrintfSoft);
 
diff --git a/modules/database/src/std/dev/devPrintfSoftCallback.c b/modules/database/src/std/dev/devPrintfSoftCallback.c
index e89afd5..a17efc4 100644
--- a/modules/database/src/std/dev/devPrintfSoftCallback.c
+++ b/modules/database/src/std/dev/devPrintfSoftCallback.c
@@ -40,6 +40,6 @@ static long write_string(printfRecord *prec)
 }
 
 printfdset devPrintfSoftCallback = {
-    5, NULL, NULL, NULL, NULL, write_string
+    { 5, NULL, NULL, NULL, NULL }, write_string
 };
 epicsExportAddress(dset, devPrintfSoftCallback);
diff --git a/modules/database/src/std/dev/devStdio.c b/modules/database/src/std/dev/devStdio.c
index e957bfc..928c8a4 100644
--- a/modules/database/src/std/dev/devStdio.c
+++ b/modules/database/src/std/dev/devStdio.c
@@ -103,7 +103,7 @@ static long write_lso(lsoRecord *prec)
 }
 
 lsodset devLsoStdio = {
-    5, NULL, init_lso, NULL, NULL, write_lso
+    { 5, NULL, init_lso, NULL, NULL }, write_lso
 };
 epicsExportAddress(dset, devLsoStdio);
 
@@ -153,7 +153,7 @@ static long write_printf(printfRecord *prec)
 }
 
 printfdset devPrintfStdio = {
-    5, NULL, init_printf, NULL, NULL, write_printf
+    {5, NULL, init_printf, NULL, NULL }, write_printf
 };
 epicsExportAddress(dset, devPrintfStdio);
 
diff --git a/modules/database/src/std/rec/Makefile b/modules/database/src/std/rec/Makefile
index 8702198..2d1cfe6 100644
--- a/modules/database/src/std/rec/Makefile
+++ b/modules/database/src/std/rec/Makefile
@@ -25,17 +25,22 @@ stdRecords += dfanoutRecord
 stdRecords += eventRecord
 stdRecords += fanoutRecord
 stdRecords += histogramRecord
+int64inRecord_CFLAGS += -DUSE_TYPED_DSET
 stdRecords += int64inRecord
+int64outRecord_CFLAGS += -DUSE_TYPED_DSET
 stdRecords += int64outRecord
 stdRecords += longinRecord
 stdRecords += longoutRecord
+lsiRecord_CFLAGS += -DUSE_TYPED_DSET
 stdRecords += lsiRecord
+lsoRecord_CFLAGS += -DUSE_TYPED_DSET
 stdRecords += lsoRecord
 stdRecords += mbbiRecord
 stdRecords += mbbiDirectRecord
 stdRecords += mbboRecord
 stdRecords += mbboDirectRecord
 stdRecords += permissiveRecord
+printfRecord_CFLAGS += -DUSE_TYPED_DSET
 stdRecords += printfRecord
 stdRecords += selRecord
 stdRecords += seqRecord
diff --git a/modules/database/src/std/rec/int64inRecord.c b/modules/database/src/std/rec/int64inRecord.c
index 8ce2410..b802f12 100644
--- a/modules/database/src/std/rec/int64inRecord.c
+++ b/modules/database/src/std/rec/int64inRecord.c
@@ -83,14 +83,6 @@ rset int64inRSET={
 epicsExportAddress(rset,int64inRSET);
 
 
-struct int64indset { /* int64in input dset */
-	long		number;
-	DEVSUPFUN	dev_report;
-	DEVSUPFUN	init;
-	DEVSUPFUN	init_record; /*returns: (-1,0)=>(failure,success)*/
-	DEVSUPFUN	get_ioint_info;
-	DEVSUPFUN	read_int64in; /*returns: (-1,0)=>(failure,success)*/
-};
 static void checkAlarms(int64inRecord *prec, epicsTimeStamp *timeLast);
 static void monitor(int64inRecord *prec);
 static long readValue(int64inRecord *prec);
@@ -113,12 +105,12 @@ static long init_record(dbCommon *pcommon, int pass)
 	return(S_dev_noDSET);
     }
     /* must have read_int64in function defined */
-    if( (pdset->number < 5) || (pdset->read_int64in == NULL) ) {
+    if ((pdset->common.number < 5) || (pdset->read_int64in == NULL)) {
 	recGblRecordError(S_dev_missingSup,(void *)prec,"int64in: init_record");
 	return(S_dev_missingSup);
     }
-    if( pdset->init_record ) {
-	if((status=(*pdset->init_record)(prec))) return(status);
+    if (pdset->common.init_record) {
+	if ((status = pdset->common.init_record(pcommon))) return status;
     }
     prec->mlst = prec->val;
     prec->alst = prec->val;
diff --git a/modules/database/src/std/rec/int64inRecord.dbd.pod b/modules/database/src/std/rec/int64inRecord.dbd.pod
index edb19a7..c690c81 100644
--- a/modules/database/src/std/rec/int64inRecord.dbd.pod
+++ b/modules/database/src/std/rec/int64inRecord.dbd.pod
@@ -111,6 +111,16 @@ monitoring deadband functionality.
 =cut
 
     include "dbCommon.dbd"
+    %#include "devSup.h"
+    %
+    %/* Declare Device Support Entry Table */
+    %struct int64inRecord;
+    %typedef struct int64indset {
+    %    dset common;
+    %    long (*read_int64in)(struct int64inRecord *prec);
+    %} int64indset;
+    %#define HAS_int64indset
+    %
     field(VAL,DBF_INT64) {
         prompt("Current value")
         promptgroup("40 - Input")
diff --git a/modules/database/src/std/rec/int64outRecord.c b/modules/database/src/std/rec/int64outRecord.c
index e9170f9..cbacb27 100644
--- a/modules/database/src/std/rec/int64outRecord.c
+++ b/modules/database/src/std/rec/int64outRecord.c
@@ -80,14 +80,6 @@ rset int64outRSET={
 epicsExportAddress(rset,int64outRSET);
 
 
-struct int64outdset { /* int64out input dset */
-	long		number;
-	DEVSUPFUN	dev_report;
-	DEVSUPFUN	init;
-	DEVSUPFUN	init_record; /*returns: (-1,0)=>(failure,success)*/
-	DEVSUPFUN	get_ioint_info;
-	DEVSUPFUN	write_int64out;/*(-1,0)=>(failure,success*/
-};
 static void checkAlarms(int64outRecord *prec);
 static void monitor(int64outRecord *prec);
 static long writeValue(int64outRecord *prec);
@@ -109,7 +101,7 @@ static long init_record(dbCommon *pcommon, int pass)
 	return(S_dev_noDSET);
     }
     /* must have  write_int64out functions defined */
-    if( (pdset->number < 5) || (pdset->write_int64out == NULL) ) {
+    if ((pdset->common.number < 5) || (pdset->write_int64out == NULL)) {
 	recGblRecordError(S_dev_missingSup,(void *)prec,"int64out: init_record");
 	return(S_dev_missingSup);
     }
@@ -117,8 +109,8 @@ static long init_record(dbCommon *pcommon, int pass)
 	if(recGblInitConstantLink(&prec->dol,DBF_INT64,&prec->val))
 	    prec->udf=FALSE;
     }
-    if( pdset->init_record ) {
-	if((status=(*pdset->init_record)(prec))) return(status);
+    if (pdset->common.init_record) {
+	if ((status = pdset->common.init_record(pcommon))) return status;
     }
     prec->mlst = prec->val;
     prec->alst = prec->val;
diff --git a/modules/database/src/std/rec/int64outRecord.dbd.pod b/modules/database/src/std/rec/int64outRecord.dbd.pod
index 1b5003e..00fe822 100644
--- a/modules/database/src/std/rec/int64outRecord.dbd.pod
+++ b/modules/database/src/std/rec/int64outRecord.dbd.pod
@@ -137,6 +137,16 @@ monitoring deadband functionality.
 =cut
 
     include "dbCommon.dbd"
+    %#include "devSup.h"
+    %
+    %/* Declare Device Support Entry Table */
+    %struct int64outRecord;
+    %typedef struct int64outdset {
+    %    dset common;
+    %    long (*write_int64out)(struct int64outRecord *prec);
+    %} int64outdset;
+    %#define HAS_int64outdset
+    %
     field(VAL,DBF_INT64) {
         prompt("Desired Output")
         promptgroup("50 - Output")
diff --git a/modules/database/src/std/rec/lsiRecord.c b/modules/database/src/std/rec/lsiRecord.c
index 7396946..96e870b 100644
--- a/modules/database/src/std/rec/lsiRecord.c
+++ b/modules/database/src/std/rec/lsiRecord.c
@@ -66,13 +66,13 @@ static long init_record(struct dbCommon *pcommon, int pass)
     }
 
     /* must have a read_string function */
-    if (pdset->number < 5 || !pdset->read_string) {
+    if (pdset->common.number < 5 || !pdset->read_string) {
         recGblRecordError(S_dev_missingSup, prec, "lsi: init_record");
         return S_dev_missingSup;
     }
 
-    if (pdset->init_record) {
-        long status = pdset->init_record(prec);
+    if (pdset->common.init_record) {
+        long status = pdset->common.init_record(pcommon);
 
         if (status)
             return status;
diff --git a/modules/database/src/std/rec/lsiRecord.dbd b/modules/database/src/std/rec/lsiRecord.dbd
index 21f2ba4..a3ce1de 100644
--- a/modules/database/src/std/rec/lsiRecord.dbd
+++ b/modules/database/src/std/rec/lsiRecord.dbd
@@ -10,14 +10,12 @@ recordtype(lsi) {
     %#include "devSup.h"
     %
     %/* Declare Device Support Entry Table */
+    %struct lsiRecord;
     %typedef struct lsidset {
-    %    long number;
-    %    DEVSUPFUN report;
-    %    DEVSUPFUN init;
-    %    DEVSUPFUN init_record;
-    %    DEVSUPFUN get_ioint_info;
-    %    DEVSUPFUN read_string;
+    %    dset common;
+    %    long (*read_string)(struct lsiRecord *prec);
     %} lsidset;
+    %#define HAS_lsidset
     %
     field(VAL,DBF_NOACCESS) {
         prompt("Current Value")
diff --git a/modules/database/src/std/rec/lsoRecord.c b/modules/database/src/std/rec/lsoRecord.c
index 9485e38..4fa6bb7 100644
--- a/modules/database/src/std/rec/lsoRecord.c
+++ b/modules/database/src/std/rec/lsoRecord.c
@@ -70,15 +70,15 @@ static long init_record(struct dbCommon *pcommon, int pass)
     }
 
     /* must have a write_string function defined */
-    if (pdset->number < 5 || !pdset->write_string) {
+    if (pdset->common.number < 5 || !pdset->write_string) {
         recGblRecordError(S_dev_missingSup, prec, "lso: init_record");
         return S_dev_missingSup;
     }
 
     dbLoadLinkLS(&prec->dol, prec->val, prec->sizv, &prec->len);
 
-    if (pdset->init_record) {
-        long status = pdset->init_record(prec);
+    if (pdset->common.init_record) {
+        long status = pdset->common.init_record(pcommon);
 
         if (status)
             return status;
diff --git a/modules/database/src/std/rec/lsoRecord.dbd b/modules/database/src/std/rec/lsoRecord.dbd
index 880139a..2011bb6 100644
--- a/modules/database/src/std/rec/lsoRecord.dbd
+++ b/modules/database/src/std/rec/lsoRecord.dbd
@@ -10,14 +10,12 @@ recordtype(lso) {
     %#include "devSup.h"
     %
     %/* Declare Device Support Entry Table */
+    %struct lsoRecord;
     %typedef struct lsodset {
-    %    long number;
-    %    DEVSUPFUN report;
-    %    DEVSUPFUN init;
-    %    DEVSUPFUN init_record;
-    %    DEVSUPFUN get_ioint_info;
-    %    DEVSUPFUN write_string;
+    %    dset common;
+    %    long (*write_string)(struct lsoRecord *prec);
     %} lsodset;
+    %#define HAS_lsodset
     %
     field(VAL,DBF_NOACCESS) {
         prompt("Current Value")
diff --git a/modules/database/src/std/rec/printfRecord.c b/modules/database/src/std/rec/printfRecord.c
index 576b963..8a8edb1 100644
--- a/modules/database/src/std/rec/printfRecord.c
+++ b/modules/database/src/std/rec/printfRecord.c
@@ -336,13 +336,13 @@ static long init_record(struct dbCommon *pcommon, int pass)
     if (!pdset)
         return 0;       /* Device support is optional */
 
-    if (pdset->number < 5) {
+    if (pdset->common.number < 5) {
         recGblRecordError(S_dev_missingSup, prec, "printf::init_record");
         return S_dev_missingSup;
     }
 
-    if (pdset->init_record) {
-        long status = pdset->init_record(prec);
+    if (pdset->common.init_record) {
+        long status = pdset->common.init_record(pcommon);
         if (status)
             return status;
     }
@@ -368,7 +368,7 @@ static long process(struct dbCommon *pcommon)
     /* Call device support */
     pdset = (printfdset *) prec->dset;
     if (pdset &&
-        pdset->number >= 5 &&
+        pdset->common.number >= 5 &&
         pdset->write_string) {
         status = pdset->write_string(prec);
 
diff --git a/modules/database/src/std/rec/printfRecord.dbd b/modules/database/src/std/rec/printfRecord.dbd
index 4fd63ef..c0f4095 100644
--- a/modules/database/src/std/rec/printfRecord.dbd
+++ b/modules/database/src/std/rec/printfRecord.dbd
@@ -10,14 +10,12 @@ recordtype(printf) {
     %#include "devSup.h"
     %
     %/* Declare Device Support Entry Table */
+    %struct printfRecord;
     %typedef struct printfdset {
-    %    long number;
-    %    DEVSUPFUN report;
-    %    DEVSUPFUN init;
-    %    DEVSUPFUN init_record;
-    %    DEVSUPFUN get_ioint_info;
-    %    DEVSUPFUN write_string;
+    %    dset common;
+    %    long (*write_string)(struct printfRecord *prec);
     %} printfdset;
+    %#define HAS_printfdset
     %
     field(VAL,DBF_NOACCESS) {
         prompt("Result")

Replies:
Re: [Merge] ~anj/epics-base/+git/base-7.0:typed-dsets into epics-base:7.0 mdavidsaver via Core-talk
Re: [Merge] ~anj/epics-base/+git/base-7.0:typed-dsets into epics-base:7.0 Ralph Lange via Core-talk
Re: [Merge] ~anj/epics-base/+git/base-7.0:typed-dsets into epics-base:7.0 Andrew Johnson via Core-talk
Re: [Merge] ~anj/epics-base/+git/base-7.0:typed-dsets into epics-base:7.0 Ralph Lange via Core-talk

Navigate by Date:
Prev: Build failed: epics-base base-integration-361 AppVeyor via Core-talk
Next: Build failed: epics-base base-integration-362 AppVeyor via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Build failed: epics-base base-integration-361 AppVeyor via Core-talk
Next: Re: [Merge] ~anj/epics-base/+git/base-7.0:typed-dsets into epics-base:7.0 mdavidsaver via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
ANJ, 04 Dec 2019 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·