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
1diff --git a/src/ioc/db/dbAccess.c b/src/ioc/db/dbAccess.c
2index 4ee2d67..0b893ee 100644
3--- a/src/ioc/db/dbAccess.c
4+++ b/src/ioc/db/dbAccess.c
5@@ -730,9 +730,18 @@ int dbLoadDatabase(const char *file, const char *path, const char *subs)
6 int dbLoadRecords(const char* file, const char* subs)
7 {
8 int status = dbReadDatabase(&pdbbase, file, 0, subs);
9-
10- if (!status && dbLoadRecordsHook)
11- dbLoadRecordsHook(file, subs);
12+ switch(status)
13+ {
14+ case 0:
15+ if(dbLoadRecordsHook)
16+ dbLoadRecordsHook(file, subs);
17+ break;
18+ case -2:
19+ errlogPrintf("dbLoadRecords: failed to load %s - cannot load records after running iocBuild!\n", file);
20+ break;
21+ default:
22+ errlogPrintf("dbLoadRecords: failed to load %s\n", file);
23+ }
24 return status;
25 }
26
27diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c
28index 3df3c7f..2be7b0d 100644
29--- a/src/ioc/dbStatic/dbLexRoutines.c
30+++ b/src/ioc/dbStatic/dbLexRoutines.c
31@@ -35,6 +35,7 @@
32 #include "epicsExport.h"
33 #include "link.h"
34 #include "special.h"
35+#include "iocInit.h"
36
37
38
39
40@@ -215,6 +216,9 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
41 char *penv;
42 char **macPairs;
43
44+ if(getIocState() != iocVirgin)
45+ return -2;
46+
47 if(*ppdbbase == 0) *ppdbbase = dbAllocBase();
48 pdbbase = *ppdbbase;
49 if(path && strlen(path)>0) {
50diff --git a/src/ioc/misc/iocInit.c b/src/ioc/misc/iocInit.c
51index a45770d..93d8908 100644
52--- a/src/ioc/misc/iocInit.c
53+++ b/src/ioc/misc/iocInit.c
54@@ -70,9 +70,7 @@
55 #include "registryRecordType.h"
56 #include "rsrv.h"
57
58-static enum {
59- iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped
60-} iocState = iocVirgin;
61+static enum iocStateEnum iocState = iocVirgin;
62 static enum {
63 buildRSRV, buildIsolated
64 } iocBuildMode;
65@@ -91,6 +89,11 @@ static void exitDatabase(void *dummy);
66 int dbThreadRealtimeLock = 1;
67 epicsExportAddress(int, dbThreadRealtimeLock);
68
69+enum iocStateEnum getIocState(void)
70+{
71+ return iocState;
72+}
73+
74 /*
75 * Initialize EPICS on the IOC.
76 */
77diff --git a/src/ioc/misc/iocInit.h b/src/ioc/misc/iocInit.h
78index 24ae45e..3e711d6 100644
79--- a/src/ioc/misc/iocInit.h
80+++ b/src/ioc/misc/iocInit.h
81@@ -13,10 +13,15 @@
82
83 #include "shareLib.h"
84
85+enum iocStateEnum {
86+ iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped
87+};
88+
89 #ifdef __cplusplus
90 extern "C" {
91 #endif
92
93+epicsShareFunc enum iocStateEnum getIocState(void);
94 epicsShareFunc int iocInit(void);
95 epicsShareFunc int iocBuild(void);
96 epicsShareFunc int iocBuildIsolated(void);

Subscribers

People subscribed via source and target branches