This is Unofficial EPICS BASE Doxygen Site
dbStaticPvt.h File Reference
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  dbLinkInfo
 
struct  dbPathNode
 
struct  dbGuiGroup
 
struct  PVDENTRY
 

Typedefs

typedef struct dbLinkInfo dbLinkInfo
 
typedef struct dbPathNode dbPathNode
 
typedef struct dbGuiGroup dbGuiGroup
 

Functions

dbDeviceMenudbGetDeviceMenu (DBENTRY *pdbentry)
 
void dbFreeLinkContents (struct link *plink)
 
void dbFreePath (DBBASE *pdbbase)
 
int dbIsMacroOk (DBENTRY *pdbentry)
 
long dbAllocRecord (DBENTRY *pdbentry, const char *precordName)
 
long dbFreeRecord (DBENTRY *pdbentry)
 
long dbGetFieldAddress (DBENTRY *pdbentry)
 
char * dbRecordName (DBENTRY *pdbentry)
 
char * dbGetStringNum (DBENTRY *pdbentry)
 
long dbPutStringNum (DBENTRY *pdbentry, const char *pstring)
 
long dbInitRecordLinks (dbRecordType *rtyp, struct dbCommon *prec)
 
epicsShareFunc long dbParseLink (const char *str, short ftype, dbLinkInfo *pinfo)
 
long dbCanSetLink (DBLINK *plink, dbLinkInfo *pinfo, devSup *devsup)
 
long dbSetLink (DBLINK *plink, dbLinkInfo *pinfo, devSup *dset)
 
epicsShareFunc void dbFreeLinkInfo (dbLinkInfo *pinfo)
 
epicsShareFunc int dbPvdTableSize (int size)
 
void dbPvdInitPvt (DBBASE *pdbbase)
 
PVDENTRYdbPvdFind (DBBASE *pdbbase, const char *name, size_t lenname)
 
PVDENTRYdbPvdAdd (DBBASE *pdbbase, dbRecordType *precordType, dbRecordNode *precnode)
 
void dbPvdDelete (DBBASE *pdbbase, dbRecordNode *precnode)
 
void dbPvdFreeMem (DBBASE *pdbbase)
 

Variables

int dbStaticDebug
 

Typedef Documentation

typedef struct dbGuiGroup dbGuiGroup
typedef struct dbLinkInfo dbLinkInfo
typedef struct dbPathNode dbPathNode

Function Documentation

long dbAllocRecord ( DBENTRY pdbentry,
const char *  precordName 
)

Definition at line 69 of file dbStaticRun.c.

70 {
71  dbRecordType *pdbRecordType = pdbentry->precordType;
72  dbRecordNode *precnode = pdbentry->precnode;
73  dbFldDes *pflddes;
74  int i;
75  dbCommonPvt *ppvt;
76  dbCommon *precord;
77  char *pfield;
78 
79  if(!pdbRecordType) return(S_dbLib_recordTypeNotFound);
80  if(!precnode) return(S_dbLib_recNotFound);
81  if(pdbRecordType->rec_size == 0) {
82  printf("\t*** Did you run x_RegisterRecordDeviceDriver(pdbbase) yet? ***\n");
83  epicsPrintf("dbAllocRecord(%s) with %s rec_size = 0\n",
84  precordName, pdbRecordType->name);
85  return(S_dbLib_noRecSup);
86  } else if(pdbRecordType->rec_size<sizeof(*precord)) {
87  printf("\t*** Recordtype %s must include \"dbCommon.dbd\"\n", pdbRecordType->name);
88  epicsPrintf("dbAllocRecord(%s) with %s rec_size = %d\n",
89  precordName, pdbRecordType->name, pdbRecordType->rec_size);
90  return(S_dbLib_noRecSup);
91  }
92  ppvt = dbCalloc(1, offsetof(dbCommonPvt, common) + pdbRecordType->rec_size);
93  precord = &ppvt->common;
94  ppvt->recnode = precnode;
95  precord->rdes = pdbRecordType;
96  precnode->precord = precord;
97  pflddes = pdbRecordType->papFldDes[0];
98  if(!pflddes) {
99  epicsPrintf("dbAllocRecord pflddes for NAME not found\n");
100  return(S_dbLib_flddesNotFound);
101  }
102  assert(pflddes->offset == 0);
103  assert(pflddes->size == sizeof(precord->name));
104  if(strlen(precordName) >= sizeof(precord->name)) {
105  epicsPrintf("dbAllocRecord: NAME(%s) too long\n",precordName);
106  return(S_dbLib_nameLength);
107  }
108  strcpy(precord->name, precordName);
109  for(i=1; i<pdbRecordType->no_fields; i++) {
110 
111  pflddes = pdbRecordType->papFldDes[i];
112  if(!pflddes) continue;
113  pfield = (char*)precord + pflddes->offset;
114  pdbentry->pfield = (void *)pfield;
115  pdbentry->pflddes = pflddes;
116  pdbentry->indfield = i;
117  switch(pflddes->field_type) {
118  case DBF_STRING:
119  if(pflddes->initial) {
120  if(strlen(pflddes->initial) >= pflddes->size) {
121  epicsPrintf("initial size > size for %s.%s\n",
122  pdbRecordType->name,pflddes->name);
123  } else {
124  strcpy(pfield,pflddes->initial);
125  }
126  }
127  break;
128  case DBF_CHAR:
129  case DBF_UCHAR:
130  case DBF_SHORT:
131  case DBF_USHORT:
132  case DBF_LONG:
133  case DBF_ULONG:
134  case DBF_INT64:
135  case DBF_UINT64:
136  case DBF_FLOAT:
137  case DBF_DOUBLE:
138  case DBF_ENUM:
139  case DBF_MENU:
140  if(pflddes->initial) {
141  long status;
142 
143  status = dbPutStringNum(pdbentry,pflddes->initial);
144  if(status)
145  epicsPrintf("Error initializing %s.%s initial %s\n",
146  pdbRecordType->name,pflddes->name,pflddes->initial);
147  }
148  break;
149  case DBF_DEVICE:
150  if(!pflddes->ftPvt) dbGetDeviceMenu(pdbentry);
151  break;
152  case DBF_INLINK:
153  case DBF_OUTLINK:
154  case DBF_FWDLINK: {
155  DBLINK *plink = (DBLINK *)pfield;
156 
157  plink->type = CONSTANT;
158  if(pflddes->initial) {
159  plink->text =
160  dbCalloc(strlen(pflddes->initial)+1,sizeof(char));
161  strcpy(plink->text,pflddes->initial);
162  }
163  }
164  break;
165  case DBF_NOACCESS:
166  break;
167  default:
168  epicsPrintf("dbAllocRecord: Illegal field type\n");
169  }
170  }
171  return(0);
172 }
dbDeviceMenu * dbGetDeviceMenu(DBENTRY *pdbentry)
Definition: dbStaticLib.c:336
#define S_dbLib_recNotFound
Definition: dbStaticLib.h:238
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
pvd::Status status
dbRecordType * precordType
Definition: dbStaticLib.h:35
int i
Definition: scan.c:967
void * precord
Definition: dbBase.h:116
dbFldDes * pflddes
Definition: dbStaticLib.h:36
#define S_dbLib_flddesNotFound
Definition: dbStaticLib.h:239
#define printf
Definition: epicsStdio.h:41
void * pfield
Definition: dbStaticLib.h:39
short indfield
Definition: dbStaticLib.h:41
short size
Definition: dbBase.h:98
dbRecordNode * precnode
Definition: dbStaticLib.h:37
#define epicsPrintf
Definition: errlog.h:51
short no_fields
Definition: dbBase.h:152
char * name
Definition: dbBase.h:151
long dbPutStringNum(DBENTRY *pdbentry, const char *pstring)
Definition: dbStaticRun.c:383
#define dbCalloc(nobj, size)
Definition: dbStaticLib.h:228
void * ftPvt
Definition: dbBase.h:96
dbFldDes ** papFldDes
Definition: dbBase.h:161
char * initial
Definition: dbBase.h:94
char * name
Definition: dbBase.h:81
#define S_dbLib_noRecSup
Definition: dbStaticLib.h:245
#define S_dbLib_nameLength
Definition: dbStaticLib.h:244
unsigned short offset
Definition: dbBase.h:100
dbfType field_type
Definition: dbBase.h:86
#define S_dbLib_recordTypeNotFound
Definition: dbStaticLib.h:236
int rec_size
Definition: dbBase.h:164
long dbCanSetLink ( DBLINK plink,
dbLinkInfo pinfo,
devSup devsup 
)

Definition at line 2375 of file dbStaticLib.c.

2376 {
2377  /* Release pinfo resources on failure */
2378  int expected_type = devsup ? devsup->link_type : CONSTANT;
2379 
2380  if (pinfo->ltype == expected_type)
2381  return 0;
2382 
2383  switch (pinfo->ltype) {
2384  case CONSTANT:
2385  case JSON_LINK:
2386  case PV_LINK:
2387  if (expected_type == CONSTANT ||
2388  expected_type == JSON_LINK ||
2389  expected_type == PV_LINK)
2390  return 0;
2391  default:
2392  dbFreeLinkInfo(pinfo);
2393  return 1;
2394  }
2395 }
void dbFreeLinkInfo(dbLinkInfo *pinfo)
Definition: dbStaticLib.c:2216
short ltype
Definition: dbStaticPvt.h:42
int link_type
Definition: dbBase.h:42
void dbFreeLinkContents ( struct link plink)

Definition at line 109 of file dbStaticLib.c.

110 {
111  char *parm = NULL;
112 
113  switch(plink->type) {
114  case CONSTANT: free((void *)plink->value.constantStr); break;
115  case MACRO_LINK: free((void *)plink->value.macro_link.macroStr); break;
116  case PV_LINK: free((void *)plink->value.pv_link.pvname); break;
117  case JSON_LINK:
118  dbJLinkFree(plink->value.json.jlink);
119  parm = plink->value.json.string;
120  break;
121  case VME_IO: parm = plink->value.vmeio.parm; break;
122  case CAMAC_IO: parm = plink->value.camacio.parm; break;
123  case AB_IO: parm = plink->value.abio.parm; break;
124  case GPIB_IO: parm = plink->value.gpibio.parm; break;
125  case BITBUS_IO: parm = plink->value.bitbusio.parm;break;
126  case INST_IO: parm = plink->value.instio.string; break;
127  case BBGPIB_IO: parm = plink->value.bbgpibio.parm;break;
128  case RF_IO: break;
129  case VXI_IO: parm = plink->value.vxiio.parm; break;
130  default:
131  epicsPrintf("dbFreeLink called but link type %d unknown\n", plink->type);
132  }
133  if(parm && (parm != pNullString)) free((void *)parm);
134  if(plink->text) free(plink->text);
135  plink->lset = NULL;
136  plink->text = NULL;
137  memset(&plink->value, 0, sizeof(union value));
138 }
char * parm
Definition: link.h:101
struct abio abio
Definition: link.h:182
struct gpibio gpibio
Definition: link.h:183
Definition: link.h:174
char * parm
Definition: link.h:155
struct bitbusio bitbusio
Definition: link.h:184
char * parm
Definition: link.h:111
struct vxiio vxiio
Definition: link.h:187
#define NULL
Definition: catime.c:38
char * parm
Definition: link.h:130
struct bbgpibio bbgpibio
Definition: link.h:186
struct instio instio
Definition: link.h:185
struct macro_link macro_link
Definition: link.h:176
#define epicsPrintf
Definition: errlog.h:51
struct camacio camacio
Definition: link.h:180
char * parm
Definition: link.h:146
char * constantStr
Definition: link.h:175
struct pv_link pv_link
Definition: link.h:178
char * parm
Definition: link.h:170
struct json_link json
Definition: link.h:177
char * string
Definition: link.h:160
struct vmeio vmeio
Definition: link.h:179
char * parm
Definition: link.h:137
epicsShareFunc void dbFreeLinkInfo ( dbLinkInfo pinfo)

Definition at line 2216 of file dbStaticLib.c.

2217 {
2218  if (pinfo->ltype == JSON_LINK) {
2219  dbJLinkFree(pinfo->jlink);
2220  pinfo->jlink = NULL;
2221  }
2222  free(pinfo->target);
2223  pinfo->target = NULL;
2224 }
struct jlink * jlink
Definition: dbStaticPvt.h:57
#define NULL
Definition: catime.c:38
short ltype
Definition: dbStaticPvt.h:42
char * target
Definition: dbStaticPvt.h:47
void dbFreePath ( DBBASE pdbbase)

Definition at line 140 of file dbStaticLib.c.

141 {
142  ELLLIST *ppathList;
143  dbPathNode *pdbPathNode;
144 
145  if(!pdbbase) return;
146  ppathList = (ELLLIST *)pdbbase->pathPvt;
147  if(!ppathList) return;
148  while((pdbPathNode = (dbPathNode *)ellFirst(ppathList))) {
149  ellDelete(ppathList,&pdbPathNode->node);
150  free((void *)pdbPathNode->directory);
151  free((void *)pdbPathNode);
152  }
153  free((void *)ppathList);
154  pdbbase->pathPvt = 0;
155  return;
156 }
ELLNODE node
Definition: dbStaticPvt.h:82
void * pathPvt
Definition: dbBase.h:181
char * directory
Definition: dbStaticPvt.h:83
List header type.
Definition: ellLib.h:56
void ellDelete(ELLLIST *pList, ELLNODE *pNode)
Deletes a node from a list.
Definition: ellLib.c:75
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
long dbFreeRecord ( DBENTRY pdbentry)

Definition at line 174 of file dbStaticRun.c.

175 {
176  dbRecordType *pdbRecordType = pdbentry->precordType;
177  dbRecordNode *precnode = pdbentry->precnode;
178 
179  if(!pdbRecordType) return(S_dbLib_recordTypeNotFound);
180  if(!precnode) return(S_dbLib_recNotFound);
181  if(!precnode->precord) return(S_dbLib_recNotFound);
182  free(dbRec2Pvt(precnode->precord));
183  precnode->precord = NULL;
184  return(0);
185 }
#define S_dbLib_recNotFound
Definition: dbStaticLib.h:238
dbRecordType * precordType
Definition: dbStaticLib.h:35
void * precord
Definition: dbBase.h:116
#define NULL
Definition: catime.c:38
dbRecordNode * precnode
Definition: dbStaticLib.h:37
#define S_dbLib_recordTypeNotFound
Definition: dbStaticLib.h:236
dbDeviceMenu* dbGetDeviceMenu ( DBENTRY pdbentry)

Definition at line 336 of file dbStaticLib.c.

337 {
338  dbRecordType *precordType = pdbentry->precordType;
339  dbFldDes *pflddes = pdbentry->pflddes;
340  dbDeviceMenu *pdbDeviceMenu;
341  devSup *pdevSup;
342  int ind;
343  int nChoice;
344 
345  if(!precordType) return(NULL);
346  if(!pflddes) return(NULL);
347  if(pflddes->field_type!=DBF_DEVICE) return(NULL);
348  if(pflddes->ftPvt){
349  pdbDeviceMenu = (dbDeviceMenu *)pflddes->ftPvt;
350  if(pdbDeviceMenu->nChoice == ellCount(&precordType->devList))
351  return(pdbDeviceMenu);
352  free((void *)pdbDeviceMenu->papChoice);
353  free((void *)pdbDeviceMenu);
354  pflddes->ftPvt = NULL;
355  }
356  nChoice = ellCount(&precordType->devList);
357  if(nChoice <= 0) return(NULL);
358  pdbDeviceMenu = dbCalloc(1,sizeof(dbDeviceMenu));
359  pdbDeviceMenu->nChoice = nChoice;
360  pdbDeviceMenu->papChoice = dbCalloc(pdbDeviceMenu->nChoice,sizeof(char *));
361  pdevSup = (devSup *)ellFirst(&precordType->devList);
362  ind = 0;
363  while(pdevSup) {
364  pdbDeviceMenu->papChoice[ind] = pdevSup->choice;
365  ind++;
366  pdevSup = (devSup *)ellNext(&pdevSup->node);
367  }
368  pflddes->ftPvt = pdbDeviceMenu;
369  return(pdbDeviceMenu);
370 }
char ** papChoice
Definition: dbBase.h:57
char * choice
Definition: dbBase.h:41
#define ellCount(PLIST)
Report the number of nodes in a list.
Definition: ellLib.h:84
dbRecordType * precordType
Definition: dbStaticLib.h:35
dbFldDes * pflddes
Definition: dbStaticLib.h:36
#define NULL
Definition: catime.c:38
ELLNODE node
Definition: dbBase.h:39
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
ELLLIST devList
Definition: dbBase.h:149
Definition: dbBase.h:38
#define dbCalloc(nobj, size)
Definition: dbStaticLib.h:228
void * ftPvt
Definition: dbBase.h:96
int nChoice
Definition: dbBase.h:56
dbfType field_type
Definition: dbBase.h:86
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
long dbGetFieldAddress ( DBENTRY pdbentry)

Definition at line 187 of file dbStaticRun.c.

188 {
189  dbRecordType *pdbRecordType = pdbentry->precordType;
190  dbRecordNode *precnode = pdbentry->precnode;
191  dbFldDes *pflddes = pdbentry->pflddes;
192 
193  if(!pdbRecordType) return(S_dbLib_recordTypeNotFound);
194  if(!precnode) return(S_dbLib_recNotFound);
195  if(!pflddes) return(S_dbLib_flddesNotFound);
196  if(!precnode->precord) return(0);
197  pdbentry->pfield = ((char *)precnode->precord) + pflddes->offset;
198  return(0);
199 }
#define S_dbLib_recNotFound
Definition: dbStaticLib.h:238
dbRecordType * precordType
Definition: dbStaticLib.h:35
void * precord
Definition: dbBase.h:116
dbFldDes * pflddes
Definition: dbStaticLib.h:36
#define S_dbLib_flddesNotFound
Definition: dbStaticLib.h:239
void * pfield
Definition: dbStaticLib.h:39
dbRecordNode * precnode
Definition: dbStaticLib.h:37
unsigned short offset
Definition: dbBase.h:100
#define S_dbLib_recordTypeNotFound
Definition: dbStaticLib.h:236
char* dbGetStringNum ( DBENTRY pdbentry)

Definition at line 2040 of file dbStaticLib.c.

2041 {
2042  dbFldDes *pflddes = pdbentry->pflddes;
2043  void *pfield = pdbentry->pfield;
2044  char *message;
2045  unsigned char cvttype;
2046 
2047  /* the following assumes that messagesize is large enough
2048  * to hold the base 10 encoded value of a 32-bit integer.
2049  */
2050  message = getpMessage(pdbentry);
2051  cvttype = pflddes->base;
2052  switch (pflddes->field_type) {
2053  case DBF_CHAR:
2054  if (cvttype == CT_DECIMAL)
2055  cvtCharToString(*(char *) pfield, message);
2056  else
2057  ulongToHexString(*(char *) pfield, message);
2058  break;
2059  case DBF_UCHAR:
2060  if (cvttype==CT_DECIMAL)
2061  cvtUcharToString(*(epicsUInt8 *) pfield, message);
2062  else
2063  ulongToHexString(*(epicsUInt8 *) pfield, message);
2064  break;
2065  case DBF_SHORT:
2066  if (cvttype==CT_DECIMAL)
2067  cvtShortToString(*(epicsInt16 *) pfield, message);
2068  else
2069  ulongToHexString(*(epicsInt16 *) pfield, message);
2070  break;
2071  case DBF_USHORT:
2072  case DBF_ENUM:
2073  if (cvttype==CT_DECIMAL)
2074  cvtUshortToString(*(epicsUInt16 *) pfield, message);
2075  else
2076  ulongToHexString(*(epicsUInt16 *) pfield, message);
2077  break;
2078  case DBF_LONG:
2079  if (cvttype==CT_DECIMAL)
2080  cvtLongToString(*(epicsInt32 *) pfield, message);
2081  else
2082  ulongToHexString(*(epicsInt32 *) pfield, message);
2083  break;
2084  case DBF_ULONG:
2085  if (cvttype==CT_DECIMAL)
2086  cvtUlongToString(*(epicsUInt32 *) pfield, message);
2087  else
2088  ulongToHexString(*(epicsUInt32 *) pfield, message);
2089  break;
2090  case DBF_INT64:
2091  if (cvttype==CT_DECIMAL)
2092  cvtInt64ToString(*(epicsInt64 *) pfield, message);
2093  else
2094  cvtInt64ToHexString(*(epicsInt64 *) pfield, message);
2095  break;
2096  case DBF_UINT64:
2097  if (cvttype==CT_DECIMAL)
2098  cvtUInt64ToString(*(epicsUInt32 *) pfield, message);
2099  else
2100  cvtUInt64ToHexString(*(epicsUInt32 *) pfield, message);
2101  break;
2102  case DBF_FLOAT:
2103  floatToString(*(epicsFloat32 *) pfield, message);
2104  break;
2105  case DBF_DOUBLE:
2106  doubleToString(*(epicsFloat64 *) pfield, message);
2107  break;
2108  case DBF_MENU:
2109  {
2110  dbMenu *pdbMenu = (dbMenu *)pflddes->ftPvt;
2111  epicsEnum16 choice_ind;
2112  char *pchoice;
2113 
2114  if (!pfield) {
2115  dbMsgCpy(pdbentry, "Field not found");
2116  return message;
2117  }
2118  choice_ind = *((epicsEnum16 *) pdbentry->pfield);
2119  if (!pdbMenu || choice_ind < 0 || choice_ind >= pdbMenu->nChoice)
2120  return NULL;
2121  pchoice = pdbMenu->papChoiceValue[choice_ind];
2122  dbMsgCpy(pdbentry, pchoice);
2123  }
2124  break;
2125  case DBF_DEVICE:
2126  {
2127  dbDeviceMenu *pdbDeviceMenu;
2128  epicsEnum16 choice_ind;
2129  char *pchoice;
2130 
2131  if (!pfield) {
2132  dbMsgCpy(pdbentry, "Field not found");
2133  return message;
2134  }
2135  pdbDeviceMenu = dbGetDeviceMenu(pdbentry);
2136  if (!pdbDeviceMenu)
2137  return NULL;
2138  choice_ind = *((epicsEnum16 *) pdbentry->pfield);
2139  if (choice_ind<0 || choice_ind>=pdbDeviceMenu->nChoice)
2140  return NULL;
2141  pchoice = pdbDeviceMenu->papChoice[choice_ind];
2142  dbMsgCpy(pdbentry, pchoice);
2143  }
2144  break;
2145  default:
2146  return NULL;
2147  }
2148  return message;
2149 }
dbDeviceMenu * dbGetDeviceMenu(DBENTRY *pdbentry)
Definition: dbStaticLib.c:336
char ** papChoice
Definition: dbBase.h:57
double epicsFloat64
Definition: epicsTypes.h:49
#define cvtShortToString(val, str)
Definition: cvtFast.h:70
dbFldDes * pflddes
Definition: dbStaticLib.h:36
unsigned short epicsUInt16
Definition: epicsTypes.h:41
unsigned char epicsUInt8
Definition: epicsTypes.h:39
#define NULL
Definition: catime.c:38
unsigned int epicsUInt32
Definition: epicsTypes.h:43
size_t cvtUInt64ToHexString(epicsUInt64 val, char *pdest)
Definition: cvtFast.c:509
void * pfield
Definition: dbStaticLib.h:39
size_t cvtInt64ToHexString(epicsInt64 val, char *pdest)
Definition: cvtFast.c:483
#define cvtUshortToString(val, str)
Definition: cvtFast.h:71
#define cvtLongToString(val, str)
Definition: cvtFast.h:72
float epicsFloat32
Definition: epicsTypes.h:48
size_t cvtInt64ToString(epicsInt64 val, char *pdest)
Definition: cvtFast.c:396
#define cvtUcharToString(val, str)
Definition: cvtFast.h:69
ctType base
Definition: dbBase.h:90
char ** papChoiceValue
Definition: dbBase.h:29
size_t cvtUInt64ToString(epicsUInt64 val, char *pdest)
Definition: cvtFast.c:384
#define cvtCharToString(val, str)
Definition: cvtFast.h:68
epicsUInt16 epicsEnum16
Definition: epicsTypes.h:47
Definition: dbBase.h:24
int nChoice
Definition: dbBase.h:27
void * ftPvt
Definition: dbBase.h:96
if(yy_init)
Definition: scan.c:972
short epicsInt16
Definition: epicsTypes.h:40
int nChoice
Definition: dbBase.h:56
dbfType field_type
Definition: dbBase.h:86
#define cvtUlongToString(val, str)
Definition: cvtFast.h:73
int epicsInt32
Definition: epicsTypes.h:42
long long epicsInt64
Definition: epicsTypes.h:44
long dbInitRecordLinks ( dbRecordType rtyp,
struct dbCommon *  prec 
)

Definition at line 2151 of file dbStaticLib.c.

2152 {
2153  short i;
2154 
2155  for (i=0; i<rtyp->no_links; i++) {
2156  dbLinkInfo link_info;
2157  dbFldDes *pflddes = rtyp->papFldDes[rtyp->link_ind[i]];
2158  DBLINK *plink = (DBLINK *)(((char *)prec) + pflddes->offset);
2159  devSup *devsup = NULL;
2160 
2161  plink->precord = prec;
2162 
2163  /* link fields are zero'd on allocation.
2164  * so are effectively CONSTANT, but with constantStr==NULL.
2165  * Here we initialize them to have the correct link type,
2166  * with zero values and empty (but non-NULL) strings.
2167  */
2168 
2169  if(pflddes->isDevLink) {
2170  devsup = (devSup *)ellNth(&rtyp->devList, prec->dtyp+1);
2171  }
2172  if(devsup)
2173  plink->type = devsup->link_type;
2174  else
2175  plink->type = CONSTANT;
2176 
2177  switch (plink->type) {
2178  /* constantStr is allowed to remain NULL if plink->text==NULL
2179  * constantStr==NULL has special meaning in recGblInitConstantLink()
2180  */
2181  case CONSTANT: plink->value.constantStr = NULL; break;
2182  case PV_LINK: plink->value.pv_link.pvname = callocMustSucceed(1, 1, "init PV_LINK"); break;
2183  case JSON_LINK: plink->value.json.string = pNullString; break;
2184  case VME_IO: plink->value.vmeio.parm = pNullString; break;
2185  case CAMAC_IO: plink->value.camacio.parm = pNullString; break;
2186  case AB_IO: plink->value.abio.parm = pNullString; break;
2187  case GPIB_IO: plink->value.gpibio.parm = pNullString; break;
2188  case BITBUS_IO: plink->value.bitbusio.parm = pNullString; break;
2189  case INST_IO: plink->value.instio.string = pNullString; break;
2190  case BBGPIB_IO: plink->value.bbgpibio.parm = pNullString; break;
2191  case VXI_IO: plink->value.vxiio.parm = pNullString; break;
2192  }
2193 
2194  if(!plink->text)
2195  continue;
2196 
2197  if(dbParseLink(plink->text, pflddes->field_type, &link_info)!=0) {
2198  /* This was already parsed once when ->text was set.
2199  * Any syntax error messages were printed at that time.
2200  */
2201 
2202  } else if(dbCanSetLink(plink, &link_info, devsup)!=0) {
2203  errlogPrintf("Error: %s.%s: can't initialize link type %d with \"%s\" (type %d)\n",
2204  prec->name, pflddes->name, plink->type, plink->text, link_info.ltype);
2205 
2206  } else if(dbSetLink(plink, &link_info, devsup)) {
2207  errlogPrintf("Error: %s.%s: failed to initialize link type %d with \"%s\" (type %d)\n",
2208  prec->name, pflddes->name, plink->type, plink->text, link_info.ltype);
2209  }
2210  free(plink->text);
2211  plink->text = NULL;
2212  }
2213  return 0;
2214 }
char * parm
Definition: link.h:101
struct abio abio
Definition: link.h:182
struct gpibio gpibio
Definition: link.h:183
char * parm
Definition: link.h:155
struct bitbusio bitbusio
Definition: link.h:184
int i
Definition: scan.c:967
char * parm
Definition: link.h:111
ELLNODE * ellNth(ELLLIST *pList, int nodeNum)
Find the Nth node in a list.
Definition: ellLib.c:205
short * link_ind
Definition: dbBase.h:156
struct vxiio vxiio
Definition: link.h:187
#define NULL
Definition: catime.c:38
char * parm
Definition: link.h:130
struct bbgpibio bbgpibio
Definition: link.h:186
struct instio instio
Definition: link.h:185
struct camacio camacio
Definition: link.h:180
ELLLIST devList
Definition: dbBase.h:149
Definition: dbBase.h:38
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Definition: cantProceed.c:22
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
char * parm
Definition: link.h:146
short no_links
Definition: dbBase.h:154
short ltype
Definition: dbStaticPvt.h:42
char * constantStr
Definition: link.h:175
unsigned int isDevLink
Definition: dbBase.h:89
dbFldDes ** papFldDes
Definition: dbBase.h:161
char * name
Definition: dbBase.h:81
int prec
Definition: reader.c:29
struct pv_link pv_link
Definition: link.h:178
char * parm
Definition: link.h:170
struct json_link json
Definition: link.h:177
char * string
Definition: link.h:160
unsigned short offset
Definition: dbBase.h:100
struct vmeio vmeio
Definition: link.h:179
long dbParseLink(const char *str, short ftype, dbLinkInfo *pinfo)
Definition: dbStaticLib.c:2226
dbfType field_type
Definition: dbBase.h:86
char * parm
Definition: link.h:137
long dbCanSetLink(DBLINK *plink, dbLinkInfo *pinfo, devSup *devsup)
Definition: dbStaticLib.c:2375
long dbSetLink(DBLINK *plink, dbLinkInfo *pinfo, devSup *devsup)
Definition: dbStaticLib.c:2507
int link_type
Definition: dbBase.h:42
int dbIsMacroOk ( DBENTRY pdbentry)

Definition at line 217 of file dbStaticRun.c.

217 { return(FALSE); }
#define FALSE
Definition: dbDefs.h:32
epicsShareFunc long dbParseLink ( const char *  str,
short  ftype,
dbLinkInfo pinfo 
)

Definition at line 2226 of file dbStaticLib.c.

2227 {
2228  char *pstr;
2229  size_t len;
2230  double value;
2231 
2232  memset(pinfo, 0, sizeof(*pinfo));
2233 
2234  /* Strip leading white space */
2235  while (*str && isspace((int)*str)) str++;
2236 
2237  len = strlen(str);
2238  /* Strip trailing white space */
2239  while (len > 0 && isspace((int)str[len-1])) len--;
2240 
2241  pstr = malloc(len + 1);
2242  if (!pstr)
2243  return S_dbLib_outMem;
2244  pinfo->target = pstr;
2245 
2246  /* Check for Instrument I/O links */
2247  if (*str == '@') {
2248  pinfo->ltype = INST_IO;
2249 
2250  /* Store everything after the '@' */
2251  memcpy(pstr, str+1, --len);
2252  pstr[len] = '\0';
2253  return 0;
2254  }
2255 
2256  /* Store the stripped string */
2257  memcpy(pstr, str, len);
2258  pstr[len] = '\0';
2259 
2260  /* Check for braces => JSON */
2261  if (*str == '{' && str[len-1] == '}') {
2262  if (dbJLinkParse(str, len, ftype, &pinfo->jlink))
2263  goto fail;
2264 
2265  pinfo->ltype = JSON_LINK;
2266  return 0;
2267  }
2268 
2269  /* Check for other HW link types */
2270  if (*pstr == '#') {
2271  int ret;
2272  char junk = 0;
2273  char *parm = strchr(pstr, '@'); /* find start of parm string */
2274 
2275  if (parm) {
2276  *parm++ = '\0'; /* isolate the parm string for later */
2277  len -= (parm - pstr);
2278  }
2279 
2280  /* generalized extraction of ID charactor and integer pairs (eg. "#C15 S14") */
2281  ret = sscanf(pinfo->target, "# %c%d %c%d %c%d %c%d %c%d %c",
2282  &pinfo->hwid[0], &pinfo->hwnums[0],
2283  &pinfo->hwid[1], &pinfo->hwnums[1],
2284  &pinfo->hwid[2], &pinfo->hwnums[2],
2285  &pinfo->hwid[3], &pinfo->hwnums[3],
2286  &pinfo->hwid[4], &pinfo->hwnums[4],
2287  &junk);
2288 
2289  /* ret<0 when pattern not matched
2290  * ret==11 when extra non-space before '@'.
2291  * ret is odd when a number is missing
2292  */
2293  if (ret<0 || ret>10 || ret%2==1) goto fail;
2294 
2295  if (strcmp(pinfo->hwid, "CS")==0) pinfo->ltype = VME_IO;
2296  else if (strcmp(pinfo->hwid, "BCN")==0) pinfo->ltype = CAMAC_IO;
2297  else if (strcmp(pinfo->hwid, "BCNA")==0) pinfo->ltype = CAMAC_IO;
2298  else if (strcmp(pinfo->hwid, "BCNF")==0) pinfo->ltype = CAMAC_IO;
2299  else if (strcmp(pinfo->hwid, "BCNAF")==0) pinfo->ltype = CAMAC_IO;
2300  else if (strcmp(pinfo->hwid, "RMDE")==0) pinfo->ltype = RF_IO;
2301  else if (strcmp(pinfo->hwid, "LACS")==0) pinfo->ltype = AB_IO;
2302  else if (strcmp(pinfo->hwid, "LA")==0) pinfo->ltype = GPIB_IO;
2303  else if (strcmp(pinfo->hwid, "LNPS")==0) pinfo->ltype = BITBUS_IO;
2304  else if (strcmp(pinfo->hwid, "LBG")==0) pinfo->ltype = BBGPIB_IO;
2305  else if (strcmp(pinfo->hwid, "VCS")==0) pinfo->ltype = VXI_IO;
2306  else if (strcmp(pinfo->hwid, "VS")==0) pinfo->ltype = VXI_IO;
2307  else goto fail;
2308 
2309  if (pinfo->ltype != RF_IO) {
2310  if (!parm) {
2311  pinfo->target[0] = '\0';
2312  } else {
2313  /* move parm string to beginning of buffer */
2314  memmove(pinfo->target, parm, len + 1);
2315  }
2316  } else if (!parm && pinfo->ltype == RF_IO) {
2317  /* RF_IO, the string isn't needed at all */
2318  free(pinfo->target);
2319  pinfo->target = NULL;
2320  }
2321  else goto fail;
2322 
2323  return 0;
2324  }
2325 
2326  /* Link is a constant if empty or it holds just a number */
2327  if (len == 0 || epicsParseDouble(pstr, &value, NULL) == 0) {
2328  pinfo->ltype = CONSTANT;
2329  return 0;
2330  }
2331 
2332  /* Link may be an array constant */
2333  if (pstr[0] == '[' && pstr[len-1] == ']' &&
2334  (strchr(pstr, ',') || strchr(pstr, '"'))) {
2335  pinfo->ltype = CONSTANT;
2336  return 0;
2337  }
2338 
2339  pinfo->ltype = PV_LINK;
2340  pstr = strchr(pstr, ' '); /* find start of link modifiers (can't be seperated by tabs) */
2341  if (pstr) {
2342  *pstr++ = '\0'; /* isolate modifiers. pinfo->target is PV name only for re-use in struct pv_link */
2343 
2344  /* Space seperation of modifiers isn't required, and other chars are ignored.
2345  * Order of comparisons resolves ambiguity by checking for
2346  * longer matches first.
2347  * eg. "QQCPPXMSITT" is pvlOptCPP|pvlOptMSI
2348  */
2349 
2350  if (strstr(pstr, "NPP")) pinfo->modifiers = 0;
2351  else if (strstr(pstr, "CPP")) pinfo->modifiers = pvlOptCPP;
2352  else if (strstr(pstr, "PP")) pinfo->modifiers = pvlOptPP;
2353  else if (strstr(pstr, "CA")) pinfo->modifiers = pvlOptCA;
2354  else if (strstr(pstr, "CP")) pinfo->modifiers = pvlOptCP;
2355 
2356  if (strstr(pstr, "NMS")) pinfo->modifiers |= pvlOptNMS;
2357  else if (strstr(pstr, "MSI")) pinfo->modifiers |= pvlOptMSI;
2358  else if (strstr(pstr, "MSS")) pinfo->modifiers |= pvlOptMSS;
2359  else if (strstr(pstr, "MS")) pinfo->modifiers |= pvlOptMS;
2360 
2361  /* filter modifiers based on link type */
2362  switch(ftype) {
2363  case DBF_INLINK: /* accept all */ break;
2364  case DBF_OUTLINK: pinfo->modifiers &= ~pvlOptCPP; break;
2365  case DBF_FWDLINK: pinfo->modifiers &= pvlOptCA; break;
2366  }
2367  }
2368 
2369  return 0;
2370 fail:
2371  dbFreeLinkInfo(pinfo);
2372  return S_dbLib_badField;
2373 }
Definition: link.h:174
#define S_dbLib_badField
Definition: dbStaticLib.h:241
struct jlink * jlink
Definition: dbStaticPvt.h:57
#define NULL
Definition: catime.c:38
#define str(v)
void dbFreeLinkInfo(dbLinkInfo *pinfo)
Definition: dbStaticLib.c:2216
short modifiers
Definition: dbStaticPvt.h:50
LIBCOM_API int epicsParseDouble(const char *str, double *to, char **units)
Definition: epicsStdlib.c:149
#define S_dbLib_outMem
Definition: dbStaticLib.h:248
int hwnums[5]
Definition: dbStaticPvt.h:54
short ltype
Definition: dbStaticPvt.h:42
char * target
Definition: dbStaticPvt.h:47
char hwid[6]
Definition: dbStaticPvt.h:53
long dbPutStringNum ( DBENTRY pdbentry,
const char *  pstring 
)

Definition at line 383 of file dbStaticRun.c.

384 {
385  dbFldDes *pflddes = pdbentry->pflddes;
386  void *pfield = pdbentry->pfield;
387  long status;
388  epicsUInt64 u64;
389  epicsInt64 i64;
390 
391  if (!pfield)
392  return S_dbLib_fieldNotFound;
393 
394  /* empty string is the same as writing numeric zero */
395  if (pstring[0] == '\0')
396  pstring = "0";
397 
398  switch (pflddes->field_type) {
399  case DBF_CHAR:
400  if (dbConvertStrict)
401  return epicsParseInt8(pstring, pfield, 0, NULL);
402  goto lax_signed;
403 
404  case DBF_SHORT:
405  if (dbConvertStrict)
406  return epicsParseInt16(pstring, pfield, 0, NULL);
407  goto lax_signed;
408 
409  case DBF_LONG:
410  if (dbConvertStrict)
411  return epicsParseInt32(pstring, pfield, 0, NULL);
412  goto lax_signed;
413 
414  case DBF_INT64:
415  if (dbConvertStrict)
416  return epicsParseInt64(pstring, pfield, 0, NULL);
417 
418  lax_signed:
419  status = epicsParseInt64(pstring, &i64, 0, NULL);
420  if (status)
421  return status;
422 
423  switch (pflddes->field_type) {
424  case DBF_CHAR: *(epicsInt8 *)pfield = (epicsInt8) i64; break;
425  case DBF_SHORT: *(epicsInt16*)pfield = (epicsInt16)i64; break;
426  case DBF_LONG: *(epicsInt32*)pfield = (epicsInt32)i64; break;
427  case DBF_INT64: *(epicsInt64*)pfield = (epicsInt64)i64; break;
428  default: break;
429  }
430  return status;
431 
432  case DBF_UCHAR:
433  if (dbConvertStrict)
434  return epicsParseUInt8(pstring, pfield, 0, NULL);
435  goto lax_unsigned;
436 
437  case DBF_ENUM:
438  case DBF_USHORT:
439  if (dbConvertStrict)
440  return epicsParseUInt16(pstring, pfield, 0, NULL);
441  goto lax_unsigned;
442 
443  case DBF_ULONG:
444  if (dbConvertStrict)
445  return epicsParseUInt32(pstring, pfield, 0, NULL);
446  goto lax_unsigned;
447 
448  case DBF_UINT64:
449  if (dbConvertStrict)
450  return epicsParseUInt64(pstring, pfield, 0, NULL);
451 
452  lax_unsigned:
453  status = epicsParseUInt64(pstring, &u64, 0, NULL);
454  if (status)
455  return status;
456 
457  switch (pflddes->field_type) {
458  case DBF_UCHAR: *(epicsUInt8 *)pfield = (epicsInt8) u64; break;
459  case DBF_ENUM:
460  case DBF_USHORT: *(epicsUInt16*)pfield = (epicsInt16)u64; break;
461  case DBF_ULONG: *(epicsUInt32*)pfield = (epicsInt32)u64; break;
462  case DBF_UINT64: *(epicsUInt64*)pfield = (epicsInt64)u64; break;
463  default: break;
464  }
465  return status;
466 
467  case DBF_FLOAT:
468  return epicsParseFloat32(pstring, pfield, NULL);
469 
470  case DBF_DOUBLE:
471  return epicsParseFloat64(pstring, pfield, NULL);
472 
473  case DBF_MENU:
474  case DBF_DEVICE: {
475  epicsEnum16 *field = (epicsEnum16 *) pfield;
476  int index = dbGetMenuIndexFromString(pdbentry, pstring);
477 
478  if (index < 0) {
480  long status = epicsParseUInt16(pstring, &value, 0, NULL);
481 
482  if (status)
483  return status;
484 
485  index = dbGetNMenuChoices(pdbentry);
486  if (value > index && index > 0 && value < USHRT_MAX)
487  return S_dbLib_badField;
488 
489  *field = value;
490  }
491  else
492  *field = index;
493  return 0;
494  }
495 
496  default:
497  return S_dbLib_badField;
498  }
499 }
Definition: link.h:174
#define S_dbLib_badField
Definition: dbStaticLib.h:241
pvd::Status status
LIBCOM_API int epicsParseInt64(const char *str, epicsInt64 *to, int base, char **units)
Definition: epicsStdlib.c:281
dbFldDes * pflddes
Definition: dbStaticLib.h:36
unsigned short epicsUInt16
Definition: epicsTypes.h:41
LIBCOM_API int epicsParseInt8(const char *str, epicsInt8 *to, int base, char **units)
Definition: epicsStdlib.c:181
int dbGetMenuIndexFromString(DBENTRY *pdbentry, const char *choice)
Definition: dbStaticLib.c:3097
unsigned char epicsUInt8
Definition: epicsTypes.h:39
#define NULL
Definition: catime.c:38
unsigned int epicsUInt32
Definition: epicsTypes.h:43
LIBCOM_API int epicsParseUInt8(const char *str, epicsUInt8 *to, int base, char **units)
Definition: epicsStdlib.c:197
unsigned long long epicsUInt64
Definition: epicsTypes.h:45
void * pfield
Definition: dbStaticLib.h:39
int dbGetNMenuChoices(DBENTRY *pdbentry)
Definition: dbStaticLib.c:3045
LIBCOM_API int epicsParseUInt64(const char *str, epicsUInt64 *to, int base, char **units)
Definition: epicsStdlib.c:299
char epicsInt8
Definition: epicsTypes.h:38
#define epicsParseFloat32(str, to, units)
Definition: epicsStdlib.h:67
epicsUInt16 epicsEnum16
Definition: epicsTypes.h:47
LIBCOM_API int epicsParseInt32(const char *str, epicsInt32 *to, int base, char **units)
Definition: epicsStdlib.c:245
LIBCOM_API int epicsParseUInt32(const char *str, epicsUInt32 *to, int base, char **units)
Definition: epicsStdlib.c:263
LIBCOM_API int epicsParseInt16(const char *str, epicsInt16 *to, int base, char **units)
Definition: epicsStdlib.c:213
short epicsInt16
Definition: epicsTypes.h:40
LIBCOM_API int epicsParseUInt16(const char *str, epicsUInt16 *to, int base, char **units)
Definition: epicsStdlib.c:229
#define S_dbLib_fieldNotFound
Definition: dbStaticLib.h:240
dbfType field_type
Definition: dbBase.h:86
int dbConvertStrict
Definition: dbStaticRun.c:34
int epicsInt32
Definition: epicsTypes.h:42
#define epicsParseFloat64(str, to, units)
Definition: epicsStdlib.h:68
long long epicsInt64
Definition: epicsTypes.h:44
PVDENTRY* dbPvdAdd ( DBBASE pdbbase,
dbRecordType precordType,
dbRecordNode precnode 
)

Definition at line 105 of file dbPvdLib.c.

107 {
108  dbPvd *ppvd = pdbbase->ppvd;
109  dbPvdBucket *pbucket;
110  PVDENTRY *ppvdNode;
111  char *name = precnode->recordname;
112  unsigned int h;
113 
114  h = epicsStrHash(name, 0) & ppvd->mask;
115  pbucket = ppvd->buckets[h];
116  if (pbucket == NULL) {
117  pbucket = dbCalloc(1, sizeof(dbPvdBucket));
118  ellInit(&pbucket->list);
119  pbucket->lock = epicsMutexCreate();
120  ppvd->buckets[h] = pbucket;
121  }
122 
123  epicsMutexMustLock(pbucket->lock);
124  ppvdNode = (PVDENTRY *) ellFirst(&pbucket->list);
125  while (ppvdNode) {
126  if (strcmp(name, ppvdNode->precnode->recordname) == 0) {
127  epicsMutexUnlock(pbucket->lock);
128  return NULL;
129  }
130  ppvdNode = (PVDENTRY *) ellNext((ELLNODE *)ppvdNode);
131  }
132  ppvdNode = dbCalloc(1, sizeof(PVDENTRY));
133  ppvdNode->precordType = precordType;
134  ppvdNode->precnode = precnode;
135  ellAdd(&pbucket->list, (ELLNODE *)ppvdNode);
136  epicsMutexUnlock(pbucket->lock);
137  return ppvdNode;
138 }
unsigned int epicsStrHash(const char *str, unsigned int seed)
Definition: epicsString.c:356
unsigned int mask
Definition: dbPvdLib.c:35
#define NULL
Definition: catime.c:38
dbPvdBucket ** buckets
Definition: dbPvdLib.c:36
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
struct dbPvd * ppvd
Definition: dbBase.h:182
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
ELLLIST list
Definition: dbPvdLib.c:29
List node type.
Definition: ellLib.h:45
dbRecordNode * precnode
Definition: dbStaticPvt.h:98
Definition: dbPvdLib.c:33
#define dbCalloc(nobj, size)
Definition: dbStaticLib.h:228
#define ellInit(PLIST)
Initialize a list type.
Definition: ellLib.h:76
#define epicsMutexCreate()
Create an epicsMutex semaphore for use from C code.
Definition: epicsMutex.h:168
dbRecordType * precordType
Definition: dbStaticPvt.h:97
char * recordname
Definition: dbBase.h:117
epicsMutexId lock
Definition: dbPvdLib.c:30
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
void dbPvdDelete ( DBBASE pdbbase,
dbRecordNode precnode 
)

Definition at line 140 of file dbPvdLib.c.

141 {
142  dbPvd *ppvd = pdbbase->ppvd;
143  dbPvdBucket *pbucket;
144  PVDENTRY *ppvdNode;
145  char *name = precnode->recordname;
146 
147  pbucket = ppvd->buckets[epicsStrHash(name, 0) & ppvd->mask];
148  if (pbucket == NULL) return;
149 
150  epicsMutexMustLock(pbucket->lock);
151  ppvdNode = (PVDENTRY *) ellFirst(&pbucket->list);
152  while (ppvdNode) {
153  if (ppvdNode->precnode &&
154  ppvdNode->precnode->recordname &&
155  strcmp(name, ppvdNode->precnode->recordname) == 0) {
156  ellDelete(&pbucket->list, (ELLNODE *)ppvdNode);
157  free(ppvdNode);
158  break;
159  }
160  ppvdNode = (PVDENTRY *) ellNext((ELLNODE *)ppvdNode);
161  }
162  epicsMutexUnlock(pbucket->lock);
163  return;
164 }
unsigned int epicsStrHash(const char *str, unsigned int seed)
Definition: epicsString.c:356
unsigned int mask
Definition: dbPvdLib.c:35
#define NULL
Definition: catime.c:38
dbPvdBucket ** buckets
Definition: dbPvdLib.c:36
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
struct dbPvd * ppvd
Definition: dbBase.h:182
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
ELLLIST list
Definition: dbPvdLib.c:29
List node type.
Definition: ellLib.h:45
dbRecordNode * precnode
Definition: dbStaticPvt.h:98
Definition: dbPvdLib.c:33
char * recordname
Definition: dbBase.h:117
epicsMutexId lock
Definition: dbPvdLib.c:30
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
void ellDelete(ELLLIST *pList, ELLNODE *pNode)
Deletes a node from a list.
Definition: ellLib.c:75
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
PVDENTRY* dbPvdFind ( DBBASE pdbbase,
const char *  name,
size_t  lenname 
)

Definition at line 82 of file dbPvdLib.c.

83 {
84  dbPvd *ppvd = pdbbase->ppvd;
85  dbPvdBucket *pbucket;
86  PVDENTRY *ppvdNode;
87 
88  pbucket = ppvd->buckets[epicsMemHash(name, lenName, 0) & ppvd->mask];
89  if (pbucket == NULL) return NULL;
90 
91  epicsMutexMustLock(pbucket->lock);
92  ppvdNode = (PVDENTRY *) ellFirst(&pbucket->list);
93  while (ppvdNode) {
94  const char *recordname = ppvdNode->precnode->recordname;
95 
96  if (strncmp(name, recordname, lenName) == 0 &&
97  strlen(recordname) == lenName)
98  break;
99  ppvdNode = (PVDENTRY *) ellNext((ELLNODE *)ppvdNode);
100  }
101  epicsMutexUnlock(pbucket->lock);
102  return ppvdNode;
103 }
unsigned int mask
Definition: dbPvdLib.c:35
#define NULL
Definition: catime.c:38
dbPvdBucket ** buckets
Definition: dbPvdLib.c:36
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
struct dbPvd * ppvd
Definition: dbBase.h:182
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
ELLLIST list
Definition: dbPvdLib.c:29
List node type.
Definition: ellLib.h:45
dbRecordNode * precnode
Definition: dbStaticPvt.h:98
Definition: dbPvdLib.c:33
unsigned int epicsMemHash(const char *str, size_t length, unsigned int seed)
Definition: epicsString.c:369
char * recordname
Definition: dbBase.h:117
epicsMutexId lock
Definition: dbPvdLib.c:30
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
void dbPvdFreeMem ( DBBASE pdbbase)

Definition at line 166 of file dbPvdLib.c.

167 {
168  dbPvd *ppvd = pdbbase->ppvd;
169  unsigned int h;
170 
171  if (ppvd == NULL) return;
172  pdbbase->ppvd = NULL;
173 
174  for (h = 0; h < ppvd->size; h++) {
175  dbPvdBucket *pbucket = ppvd->buckets[h];
176  PVDENTRY *ppvdNode;
177 
178  if (pbucket == NULL) continue;
179  epicsMutexMustLock(pbucket->lock);
180  ppvd->buckets[h] = NULL;
181  while ((ppvdNode = (PVDENTRY *) ellFirst(&pbucket->list))) {
182  ellDelete(&pbucket->list, (ELLNODE *)ppvdNode);
183  free(ppvdNode);
184  }
185  epicsMutexUnlock(pbucket->lock);
186  epicsMutexDestroy(pbucket->lock);
187  free(pbucket);
188  }
189  free(ppvd->buckets);
190  free(ppvd);
191 }
void epicsStdCall epicsMutexDestroy(epicsMutexId pmutexNode)
Destroy an epicsMutex semaphore.
Definition: epicsMutex.cpp:127
#define NULL
Definition: catime.c:38
dbPvdBucket ** buckets
Definition: dbPvdLib.c:36
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
struct dbPvd * ppvd
Definition: dbBase.h:182
unsigned int size
Definition: dbPvdLib.c:34
ELLLIST list
Definition: dbPvdLib.c:29
List node type.
Definition: ellLib.h:45
Definition: dbPvdLib.c:33
epicsMutexId lock
Definition: dbPvdLib.c:30
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
void ellDelete(ELLLIST *pList, ELLNODE *pNode)
Deletes a node from a list.
Definition: ellLib.c:75
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
void dbPvdInitPvt ( DBBASE pdbbase)

Definition at line 63 of file dbPvdLib.c.

64 {
65  dbPvd *ppvd;
66 
67  if (pdbbase->ppvd) return;
68 
69  if (dbPvdHashTableSize == 0) {
71  }
72 
73  ppvd = (dbPvd *)dbMalloc(sizeof(dbPvd));
74  ppvd->size = dbPvdHashTableSize;
75  ppvd->mask = dbPvdHashTableSize - 1;
76  ppvd->buckets = dbCalloc(ppvd->size, sizeof(dbPvdBucket *));
77 
78  pdbbase->ppvd = ppvd;
79  return;
80 }
unsigned int mask
Definition: dbPvdLib.c:35
dbPvdBucket ** buckets
Definition: dbPvdLib.c:36
struct dbPvd * ppvd
Definition: dbBase.h:182
#define DEFAULT_SIZE
Definition: dbPvdLib.c:42
unsigned int size
Definition: dbPvdLib.c:34
unsigned int dbPvdHashTableSize
Definition: dbPvdLib.c:39
#define dbMalloc(size)
Definition: dbStaticLib.h:229
Definition: dbPvdLib.c:33
#define dbCalloc(nobj, size)
Definition: dbStaticLib.h:228
epicsShareFunc int dbPvdTableSize ( int  size)

Definition at line 46 of file dbPvdLib.c.

47 {
48  if (size & (size - 1)) {
49  printf("dbPvdTableSize: %d is not a power of 2\n", size);
50  return -1;
51  }
52 
53  if (size < MIN_SIZE)
54  size = MIN_SIZE;
55 
56  if (size > MAX_SIZE)
57  size = MAX_SIZE;
58 
59  dbPvdHashTableSize = size;
60  return 0;
61 }
#define MAX_SIZE
Definition: dbPvdLib.c:43
#define printf
Definition: epicsStdio.h:41
unsigned int dbPvdHashTableSize
Definition: dbPvdLib.c:39
#define MIN_SIZE
Definition: dbPvdLib.c:41
char* dbRecordName ( DBENTRY pdbentry)

Definition at line 201 of file dbStaticRun.c.

202 {
203  dbRecordType *pdbRecordType = pdbentry->precordType;
204  dbRecordNode *precnode = pdbentry->precnode;
205  dbFldDes *pflddes;
206  char *precord;
207 
208  if(!pdbRecordType) return(0);
209  if(!precnode) return(0);
210  if(!precnode->precord) return(0);
211  precord = (char *)precnode->precord;
212  pflddes = pdbRecordType->papFldDes[0];
213  if(!pflddes) return(NULL);
214  return(precord + pflddes->offset);
215 }
dbRecordType * precordType
Definition: dbStaticLib.h:35
void * precord
Definition: dbBase.h:116
#define NULL
Definition: catime.c:38
dbRecordNode * precnode
Definition: dbStaticLib.h:37
dbFldDes ** papFldDes
Definition: dbBase.h:161
unsigned short offset
Definition: dbBase.h:100
long dbSetLink ( DBLINK plink,
dbLinkInfo pinfo,
devSup dset 
)

Definition at line 2507 of file dbStaticLib.c.

2508 {
2509  int expected_type = devsup ? devsup->link_type : CONSTANT;
2510 
2511  if (expected_type == CONSTANT ||
2512  expected_type == JSON_LINK ||
2513  expected_type == PV_LINK) {
2514  switch (pinfo->ltype) {
2515  case CONSTANT:
2516  dbFreeLinkContents(plink);
2517  dbSetLinkConst(plink, pinfo);
2518  break;
2519  case PV_LINK:
2520  dbFreeLinkContents(plink);
2521  dbSetLinkPV(plink, pinfo);
2522  break;
2523  case JSON_LINK:
2524  dbFreeLinkContents(plink);
2525  dbSetLinkJSON(plink, pinfo);
2526  break;
2527  default:
2528  errlogMessage("Warning: dbSetLink: forgot to test with dbCanSetLink() or logic error");
2529  goto fail; /* can't assign HW link */
2530  }
2531  }
2532  else if (expected_type == pinfo->ltype) {
2533  dbFreeLinkContents(plink);
2534  dbSetLinkHW(plink, pinfo);
2535  }
2536  else
2537  goto fail;
2538 
2539  return 0;
2540 fail:
2541  dbFreeLinkInfo(pinfo);
2542  return S_dbLib_badField;
2543 }
#define S_dbLib_badField
Definition: dbStaticLib.h:241
void dbFreeLinkInfo(dbLinkInfo *pinfo)
Definition: dbStaticLib.c:2216
int errlogMessage(const char *message)
Definition: errlog.c:180
short ltype
Definition: dbStaticPvt.h:42
void dbFreeLinkContents(struct link *plink)
Definition: dbStaticLib.c:109

Variable Documentation

int dbStaticDebug

Definition at line 49 of file dbStaticLib.c.