Merge remote-tracking branch 'lp-konrad/fix-crash-dbloadrecords-after-iocinit' into 3.15

* lp-konrad/fix-crash-dbloadrecords-after-iocinit:
  Fix mingw cross-build
  Use accessor in iocInit
  Fix segfault when calling dbLoadRecords after iocInit
This commit is contained in:
Michael Davidsaver
2020-02-14 17:18:01 +00:00
4 changed files with 27 additions and 6 deletions

View File

@@ -730,9 +730,18 @@ int dbLoadDatabase(const char *file, const char *path, const char *subs)
int dbLoadRecords(const char* file, const char* subs)
{
int status = dbReadDatabase(&pdbbase, file, 0, subs);
if (!status && dbLoadRecordsHook)
dbLoadRecordsHook(file, subs);
switch(status)
{
case 0:
if(dbLoadRecordsHook)
dbLoadRecordsHook(file, subs);
break;
case -2:
errlogPrintf("dbLoadRecords: failed to load %s - cannot load records after running iocBuild!\n", file);
break;
default:
errlogPrintf("dbLoadRecords: failed to load %s\n", file);
}
return status;
}

View File

@@ -35,6 +35,7 @@
#include "epicsExport.h"
#include "link.h"
#include "special.h"
#include "iocInit.h"
@@ -215,6 +216,9 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
char *penv;
char **macPairs;
if(getIocState() != iocVirgin)
return -2;
if(*ppdbbase == 0) *ppdbbase = dbAllocBase();
pdbbase = *ppdbbase;
if(path && strlen(path)>0) {

View File

@@ -70,9 +70,7 @@
#include "registryRecordType.h"
#include "rsrv.h"
static enum {
iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped
} iocState = iocVirgin;
static enum iocStateEnum iocState = iocVirgin;
static enum {
buildRSRV, buildIsolated
} iocBuildMode;
@@ -91,6 +89,11 @@ static void exitDatabase(void *dummy);
int dbThreadRealtimeLock = 1;
epicsExportAddress(int, dbThreadRealtimeLock);
enum iocStateEnum getIocState(void)
{
return iocState;
}
/*
* Initialize EPICS on the IOC.
*/

View File

@@ -13,10 +13,15 @@
#include "shareLib.h"
enum iocStateEnum {
iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped
};
#ifdef __cplusplus
extern "C" {
#endif
epicsShareFunc enum iocStateEnum getIocState(void);
epicsShareFunc int iocInit(void);
epicsShareFunc int iocBuild(void);
epicsShareFunc int iocBuildIsolated(void);