ioc/db: Add dbCommonPvt

Add some hidden "fields" for every record.
Allows Base internal hidden accounting
which can be changed without an ABI break.
This commit is contained in:
Michael Davidsaver
2017-04-28 18:37:14 -04:00
parent 78a7ad168e
commit 12d68e6021
4 changed files with 23 additions and 12 deletions

View File

@@ -42,7 +42,7 @@
#include "dbBase.h"
#include "dbBkpt.h"
#include "dbCa.h"
#include "dbCommon.h"
#include "dbCommonPvt.h"
#include "dbConvertFast.h"
#include "dbConvert.h"
#include "dbEvent.h"
@@ -685,9 +685,10 @@ finish:
void dbInitEntryFromChannel(struct dbAddr *paddr, DBENTRY *pdbentry)
{
struct dbCommon *prec = paddr->precord;
dbCommonPvt *ppvt = CONTAINER(prec, dbCommonPvt, common);
pdbentry->pdbbase = pdbbase;
pdbentry->precordType = prec->rdes;
pdbentry->precnode = prec->rnde;
pdbentry->precnode = ppvt->node;
pdbentry->pflddes = paddr->pfldDes;
pdbentry->pinfonode = NULL;
pdbentry->pfield = paddr->pfield;

View File

@@ -217,12 +217,6 @@
interest(4)
extra("struct dbRecordType *rdes")
}
field(RNDE,DBF_NOACCESS) {
prompt("Address of dbRecordNode")
special(SPC_NOMOD)
interest(4)
extra("struct dbRecordNode *rnde")
}
field(LSET,DBF_NOACCESS) {
prompt("Lock Set")
special(SPC_NOMOD)

14
src/ioc/db/dbCommonPvt.h Normal file
View File

@@ -0,0 +1,14 @@
#ifndef DBCOMMONPVT_H
#define DBCOMMONPVT_H
#include "dbCommon.h"
/** Base internal additional information for every record
*/
typedef struct dbCommonPvt {
struct dbRecordNode *node;
struct dbCommon common;
} dbCommonPvt;
#endif // DBCOMMONPVT_H

View File

@@ -25,7 +25,7 @@
#define epicsExportSharedSymbols
#include "dbBase.h"
#include "dbCommon.h"
#include "dbCommonPvt.h"
#include "dbStaticLib.h"
#include "dbStaticPvt.h"
#include "devSup.h"
@@ -69,6 +69,7 @@ long dbAllocRecord(DBENTRY *pdbentry,const char *precordName)
dbRecordNode *precnode = pdbentry->precnode;
dbFldDes *pflddes;
int i;
dbCommonPvt *ppvt;
dbCommon *precord;
char *pfield;
@@ -85,8 +86,9 @@ long dbAllocRecord(DBENTRY *pdbentry,const char *precordName)
precordName, pdbRecordType->name, pdbRecordType->rec_size);
return(S_dbLib_noRecSup);
}
precord = dbCalloc(1, pdbRecordType->rec_size);
precord->rnde = precnode;
ppvt = dbCalloc(1, offsetof(dbCommonPvt, common) + pdbRecordType->rec_size);
precord = &ppvt->common;
ppvt->node = precnode;
precnode->precord = precord;
pflddes = pdbRecordType->papFldDes[0];
if(!pflddes) {
@@ -171,7 +173,7 @@ long dbFreeRecord(DBENTRY *pdbentry)
if(!pdbRecordType) return(S_dbLib_recordTypeNotFound);
if(!precnode) return(S_dbLib_recNotFound);
if(!precnode->precord) return(S_dbLib_recNotFound);
free(precnode->precord);
free(CONTAINER(precnode->precord, dbCommonPvt, common));
precnode->precord = NULL;
return(0);
}