EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024  Index 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: [Merge] ~info-martin-konrad/epics-base:fix-crash-dbloadrecords-after-iocinit into epics-base:3.15
From: Martin Konrad via Core-talk <[email protected]>
To: [email protected]
Date: Thu, 14 Nov 2019 15:57:20 -0000
Martin Konrad has proposed merging ~info-martin-konrad/epics-base:fix-crash-dbloadrecords-after-iocinit into epics-base:3.15.

Requested reviews:
  EPICS Core Developers (epics-core)

For more details, see:
https://code.launchpad.net/~info-martin-konrad/epics-base/+git/epics-base/+merge/375559
-- 
Your team EPICS Core Developers is requested to review the proposed merge of ~info-martin-konrad/epics-base:fix-crash-dbloadrecords-after-iocinit into epics-base:3.15.
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)
 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;
 }
 
diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c
index 3df3c7f..9bc0f87 100644
--- a/src/ioc/dbStatic/dbLexRoutines.c
+++ b/src/ioc/dbStatic/dbLexRoutines.c
@@ -16,6 +16,7 @@
 #include <stddef.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdbool.h>
 
 #include "dbDefs.h"
 #include "dbmf.h"
@@ -115,6 +116,12 @@ typedef struct tempListNode {
 static ELLLIST tempList = ELLLIST_INIT;
 static void *freeListPvt = NULL;
 static int duplicate = FALSE;
+static bool dbLoadRecordsAllowed = true;
+
+void disableDbLoadRecords()
+{
+    dbLoadRecordsAllowed = false;
+}
 
 static void yyerrorAbort(char *str)
 {
@@ -215,6 +222,9 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp,
     char	*penv;
     char	**macPairs;
     
+    if(!dbLoadRecordsAllowed)
+        return -2;
+
     if(*ppdbbase == 0) *ppdbbase = dbAllocBase();
     pdbbase = *ppdbbase;
     if(path && strlen(path)>0) {
diff --git a/src/ioc/dbStatic/dbStaticIocRegister.c b/src/ioc/dbStatic/dbStaticIocRegister.c
index 18d346c..7156691 100644
--- a/src/ioc/dbStatic/dbStaticIocRegister.c
+++ b/src/ioc/dbStatic/dbStaticIocRegister.c
@@ -8,12 +8,19 @@
 \*************************************************************************/
 
 #include "iocsh.h"
+#include "initHooks.h"
 
 #define epicsExportSharedSymbols
 #include "dbStaticIocRegister.h"
 #include "dbStaticLib.h"
 #include "dbStaticPvt.h"
 
+static void dbStaticIocRegisterInitHook(initHookState state)
+{
+    if(state == initHookAtIocBuild)
+        disableDbLoadRecords();
+}
+
 /* common arguments */
 
 static const iocshArg argPdbbase = { "pdbbase", iocshArgPdbbase};
@@ -153,6 +160,7 @@ static void dbReportDeviceConfigCallFunc(const iocshArgBuf *args)
 
 void dbStaticIocRegister(void)
 {
+    initHookRegister(dbStaticIocRegisterInitHook);
     iocshRegister(&dbDumpPathFuncDef, dbDumpPathCallFunc);
     iocshRegister(&dbDumpRecordFuncDef, dbDumpRecordCallFunc);
     iocshRegister(&dbDumpMenuFuncDef, dbDumpMenuCallFunc);
diff --git a/src/ioc/dbStatic/dbStaticPvt.h b/src/ioc/dbStatic/dbStaticPvt.h
index 842c0dc..62e595e 100644
--- a/src/ioc/dbStatic/dbStaticPvt.h
+++ b/src/ioc/dbStatic/dbStaticPvt.h
@@ -25,6 +25,7 @@ dbDeviceMenu *dbGetDeviceMenu(DBENTRY *pdbentry);
 void dbFreeLinkContents(struct link *plink);
 void dbFreePath(DBBASE *pdbbase);
 int dbIsMacroOk(DBENTRY *pdbentry);
+void disableDbLoadRecords();
 
 /*The following routines have different versions for run-time no-run-time*/
 long dbAllocRecord(DBENTRY *pdbentry,const char *precordName);

Replies:
Re: [Merge] ~info-martin-konrad/epics-base:fix-crash-dbloadrecords-after-iocinit into epics-base:3.15 Andrew Johnson via Core-talk

Navigate by Date:
Prev: Re: [Bug 1829919] [NEW] IOC segfaults when calling dbLoadRecords after iocInit Martin Konrad via Core-talk
Next: Re: [Merge] ~info-martin-konrad/epics-base:simplify-compiler-specific-macros into epics-base:7.0 Martin Konrad via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Build failed: EPICS Base base-7.0-480 AppVeyor via Core-talk
Next: Re: [Merge] ~info-martin-konrad/epics-base:fix-crash-dbloadrecords-after-iocinit into epics-base:3.15 Andrew Johnson via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
ANJ, 14 Nov 2019 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·