Merge ~info-martin-konrad/epics-base:fix-crash-dbloadrecords-after-iocinit into ~epics-core/epics-base/+git/epics-base:3.15

Proposed by Martin Konrad
Status: Merged
Merge reported by: mdavidsaver
Merged at revision: a50b850ebdb4ef7ebb2906e090513bc618085a18
Proposed branch: ~info-martin-konrad/epics-base:fix-crash-dbloadrecords-after-iocinit
Merge into: ~epics-core/epics-base/+git/epics-base:3.15
Diff against target: 95 lines (+27/-6)
4 files modified
src/ioc/db/dbAccess.c (+12/-3)
src/ioc/dbStatic/dbLexRoutines.c (+4/-0)
src/ioc/misc/iocInit.c (+6/-3)
src/ioc/misc/iocInit.h (+5/-0)
Reviewer Review Type Date Requested Status
Andrew Johnson Approve
Review via email: mp+375559@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Andrew Johnson (anj) wrote :

One adjustment needed in dbLexRoutines.c, please move the #include "iocInit.h" below the definition of epicsExportSharedSymbols since the two object files are built into the same library. That fixes my mingw cross-build.

Builds fine on VxWorks back to 5.5.2 (which doesn't have stdbool.h but you took that out again).

review: Needs Fixing
Revision history for this message
Andrew Johnson (anj) wrote :

Looks good.

review: Approve
Revision history for this message
mdavidsaver (mdavidsaver) wrote :

AI on ANJ: regrets iocVirgin

Revision history for this message
mdavidsaver (mdavidsaver) wrote :

Breaks tests (eg. dbShutdownTest) after merge. In particular the condition added in dbReadCOM()

> if(getIocState() != iocVirgin)
> return -2;

doesn't capture the case where a unit-test is re-loaded a database. In this case iocState==iocStopped

Revision history for this message
Andrew Johnson (anj) wrote :

Fixed by combining the iocStopped and iocVirgin states into one state, iocVoid.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/ioc/db/dbAccess.c b/src/ioc/db/dbAccess.c
index 4ee2d67..0b893ee 100644
--- a/src/ioc/db/dbAccess.c
+++ b/src/ioc/db/dbAccess.c
@@ -730,9 +730,18 @@ int dbLoadDatabase(const char *file, const char *path, const char *subs)
730int dbLoadRecords(const char* file, const char* subs)730int dbLoadRecords(const char* file, const char* subs)
731{731{
732 int status = dbReadDatabase(&pdbbase, file, 0, subs);732 int status = dbReadDatabase(&pdbbase, file, 0, subs);
733733 switch(status)
734 if (!status && dbLoadRecordsHook)734 {
735 dbLoadRecordsHook(file, subs);735 case 0:
736 if(dbLoadRecordsHook)
737 dbLoadRecordsHook(file, subs);
738 break;
739 case -2:
740 errlogPrintf("dbLoadRecords: failed to load %s - cannot load records after running iocBuild!\n", file);
741 break;
742 default:
743 errlogPrintf("dbLoadRecords: failed to load %s\n", file);
744 }
736 return status;745 return status;
737}746}
738747
diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c
index 3df3c7f..2be7b0d 100644
--- a/src/ioc/dbStatic/dbLexRoutines.c
+++ b/src/ioc/dbStatic/dbLexRoutines.c
@@ -35,6 +35,7 @@
35#include "epicsExport.h"35#include "epicsExport.h"
36#include "link.h"36#include "link.h"
37#include "special.h"37#include "special.h"
38#include "iocInit.h"
3839
3940
4041
4142
@@ -215,6 +216,9 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
215 char *penv;216 char *penv;
216 char **macPairs;217 char **macPairs;
217 218
219 if(getIocState() != iocVirgin)
220 return -2;
221
218 if(*ppdbbase == 0) *ppdbbase = dbAllocBase();222 if(*ppdbbase == 0) *ppdbbase = dbAllocBase();
219 pdbbase = *ppdbbase;223 pdbbase = *ppdbbase;
220 if(path && strlen(path)>0) {224 if(path && strlen(path)>0) {
diff --git a/src/ioc/misc/iocInit.c b/src/ioc/misc/iocInit.c
index a45770d..93d8908 100644
--- a/src/ioc/misc/iocInit.c
+++ b/src/ioc/misc/iocInit.c
@@ -70,9 +70,7 @@
70#include "registryRecordType.h"70#include "registryRecordType.h"
71#include "rsrv.h"71#include "rsrv.h"
7272
73static enum {73static enum iocStateEnum iocState = iocVirgin;
74 iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped
75} iocState = iocVirgin;
76static enum {74static enum {
77 buildRSRV, buildIsolated75 buildRSRV, buildIsolated
78} iocBuildMode;76} iocBuildMode;
@@ -91,6 +89,11 @@ static void exitDatabase(void *dummy);
91int dbThreadRealtimeLock = 1;89int dbThreadRealtimeLock = 1;
92epicsExportAddress(int, dbThreadRealtimeLock);90epicsExportAddress(int, dbThreadRealtimeLock);
9391
92enum iocStateEnum getIocState(void)
93{
94 return iocState;
95}
96
94/*97/*
95 * Initialize EPICS on the IOC.98 * Initialize EPICS on the IOC.
96 */99 */
diff --git a/src/ioc/misc/iocInit.h b/src/ioc/misc/iocInit.h
index 24ae45e..3e711d6 100644
--- a/src/ioc/misc/iocInit.h
+++ b/src/ioc/misc/iocInit.h
@@ -13,10 +13,15 @@
1313
14#include "shareLib.h"14#include "shareLib.h"
1515
16enum iocStateEnum {
17 iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped
18};
19
16#ifdef __cplusplus20#ifdef __cplusplus
17extern "C" {21extern "C" {
18#endif22#endif
1923
24epicsShareFunc enum iocStateEnum getIocState(void);
20epicsShareFunc int iocInit(void);25epicsShareFunc int iocInit(void);
21epicsShareFunc int iocBuild(void);26epicsShareFunc int iocBuild(void);
22epicsShareFunc int iocBuildIsolated(void);27epicsShareFunc int iocBuildIsolated(void);

Subscribers

People subscribed via source and target branches