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
<2019>
2020
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
<2019>
2020
2021
2022
2023
2024
|