diff --git a/src/ioc/db/dbServer.c b/src/ioc/db/dbServer.c index a18477723..495156dcf 100644 --- a/src/ioc/db/dbServer.c +++ b/src/ioc/db/dbServer.c @@ -65,6 +65,21 @@ int dbRegisterServer(dbServer *psrv) return 0; } +int dbUnregisterServer(dbServer *psrv) +{ + if (state != registering && state != stopped) { + fprintf(stderr, "dbUnregisterServer: Servers still active!\n"); + return -1; + } + if (ellFind(&serverList, &psrv->node) < 0) { + fprintf(stderr, "dbUnregisterServer: '%s' not registered.\n", + psrv->name); + return -1; + } + ellDelete(&serverList, &psrv->node); + return 0; +} + void dbsr(unsigned level) { dbServer *psrv = (dbServer *)ellFirst(&serverList); diff --git a/src/ioc/db/dbServer.h b/src/ioc/db/dbServer.h index 1d184329c..ce5244e11 100644 --- a/src/ioc/db/dbServer.h +++ b/src/ioc/db/dbServer.h @@ -119,6 +119,13 @@ typedef struct dbServer { */ epicsShareFunc int dbRegisterServer(dbServer *psrv); +/** @brief Unregister a server layer + * + * This should only be called when the servers are inactive. + * @param psrv Server information structure for the server + */ +epicsShareFunc int dbUnregisterServer(dbServer *psrv); + /** @brief Print dbServer Reports. * * Calls the report methods of all registered servers. diff --git a/src/ioc/db/test/dbServerTest.c b/src/ioc/db/test/dbServerTest.c index e9c6556c5..5aba92770 100644 --- a/src/ioc/db/test/dbServerTest.c +++ b/src/ioc/db/test/dbServerTest.c @@ -110,6 +110,12 @@ dbServer illegal = { disInit, NULL, NULL, NULL }; +dbServer toolate = { + ELLNODE_INIT, "toolate", + NULL, NULL, NULL, + disInit, NULL, NULL, NULL +}; + MAIN(dbServerTest) { @@ -117,7 +123,7 @@ MAIN(dbServerTest) char *theName = "The One"; int status; - testPlan(14); + testPlan(18); /* Prove that we handle substring names properly */ epicsEnvSet("EPICS_IOC_IGNORE_SERVERS", "none ones"); @@ -139,15 +145,19 @@ MAIN(dbServerTest) dbInitServers(); testOk(oneState == INIT_CALLED, "dbInitServers"); testOk(disInitialized == 0, "Disabled server not initialized"); + testOk(dbRegisterServer(&toolate) != 0, "No registration while active"); dbRunServers(); testOk(oneState == RUN_CALLED, "dbRunServers"); + testOk(dbUnregisterServer(&one) != 0, "No unregistration while active"); dbPauseServers(); testOk(oneState == PAUSE_CALLED, "dbPauseServers"); dbStopServers(); testOk(oneState == STOP_CALLED, "dbStopServers"); + testOk(dbUnregisterServer(&toolate) != 0, "No unregistration if not reg'ed"); + testOk(dbUnregisterServer(&no_routines) == 0, "Unregistered 'no-routines'"); testDiag("Printing server report"); dbsr(0);