Solve extended device support registration issue across shared libraries.

This commit is contained in:
Andrew Johnson
2009-06-10 20:19:32 +00:00
parent 337f53c109
commit 5a5e2d8f74
4 changed files with 64 additions and 52 deletions

View File

@@ -27,6 +27,7 @@
#include "dbBase.h"
#include "dbStaticLib.h"
#include "dbStaticPvt.h"
#include "devSup.h"
#include "special.h"
@@ -157,6 +158,38 @@ static void doubleToString(double value,char *preturn)
return;
}
static long do_nothing(struct dbCommon *precord) { return 0; }
/* Dummy DSXT used for soft device supports */
struct dsxt devSoft_DSXT = {
do_nothing,
do_nothing
};
static devSup *pthisDevSup = NULL;
void dbInitDevSup(devSup *pdevSup, dset *pdset)
{
pdevSup->pdset = pdset;
if (pdevSup->link_type == CONSTANT)
pdevSup->pdsxt = &devSoft_DSXT;
if (pdset->init) {
pthisDevSup = pdevSup;
pdset->init(0);
pthisDevSup = NULL;
}
}
void devExtend(dsxt *pdsxt)
{
if (!pthisDevSup)
errlogPrintf("devExtend() called outside of dbInitDevSup()\n");
else {
pthisDevSup->pdsxt = pdsxt;
}
}
long dbAllocRecord(DBENTRY *pdbentry,const char *precordName)
{

View File

@@ -3,8 +3,7 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/* devSup.h Device Support */
@@ -19,29 +18,38 @@
#include "shareLib.h"
/* structures defined elsewhere */
struct dbCommon;
struct devSup;
#ifdef __cplusplus
extern "C" {
typedef long (*DEVSUPFUN)(void*); /* ptr to device support function*/
typedef long (*DEVSUPFUN)(void *); /* ptr to device support function*/
#else
typedef long (*DEVSUPFUN)(); /* ptr to device support function*/
typedef long (*DEVSUPFUN)(); /* ptr to device support function*/
#endif
typedef struct dset { /* device support entry table */
typedef struct dset { /* device support entry table */
long number; /*number of support routines*/
DEVSUPFUN report; /*print report*/
DEVSUPFUN init; /*init support layer*/
DEVSUPFUN init_record; /*init device for particular record*/
DEVSUPFUN get_ioint_info; /* get io interrupt information*/
/*other functions are record dependent*/
}dset;
} dset;
struct dbCommon;
typedef struct dsxt { /* device support extension table */
long (*add_record)(struct dbCommon *precord);
long (*del_record)(struct dbCommon *precord);
/* Recordtypes are *not* allowed to extend this table */
} dsxt;
epicsShareExtern dsxt devSoft_DSXT; /* Allow anything table */
epicsShareFunc void devExtend(dsxt *pdsxt);
epicsShareFunc void dbInitDevSup(struct devSup *pdevSup, dset *pdset);
#define S_dev_noDevSup (M_devSup| 1) /*SDR_DEVSUP: Device support missing*/
#define S_dev_noDSET (M_devSup| 3) /*Missing device support entry table*/
#define S_dev_missingSup (M_devSup| 5) /*Missing device support routine*/
@@ -55,12 +63,6 @@ typedef struct dsxt { /* device support extension table */
#define S_dev_Conflict (M_devSup|21) /*Multiple records accessing same signal*/
#define S_dev_noDeviceFound (M_devSup|23) /*No device found at specified address*/
/* These are defined in src/misc/iocInit.c */
epicsShareExtern struct dsxt devSoft_DSXT;
epicsShareFunc void devExtend(dsxt *pdsxt);
#ifdef __cplusplus
} /* extern "C" */
#endif